常用类【包装类、String/StringBuffer类、Math类、Arrays类、System类、BigInteger和BigDecimal类、日期类】

第十三章、常用类

包装类

包装类的分类

1、针对八种基本数据类型相应的引用类型—包装类

2、有了类的特点,可以调用类中的方法。

3、类型


4、八个包装类的关系

(1)黄色的是同一个父类


(2)char——》Character

(3)boolean——》Boolean

包装类和基本数据类型的转换

1、jkd5之前是手动的拆箱和装箱,

(1)装箱:基本类型—》包装类型

(2)拆箱:反之

2、jdk5和5以后都是自动拆箱和装箱

3、自动装箱底层是调用v alueOf方法

(1)eg:Integer.valueOf()

(2)eg:int n2 =200;

​ Integer integer = n2; //自动装箱底层仍然使用Inte.valueOf(n2);

4、自动拆箱

(1)eg:int n3 = integer ; //底层是intValue()方法

包装类型和String类型的相互转换

包装类——》String类

方式一、直接字符串拼接

eg:Integer i = 100;

​ String str1 = i+ "";

方式二、toString()方法

eg:String str2 = i.toString();

方式三、valueOf();

eg:String str3 = String.valueOf();

String类——》包装类

方式一、parseInt()方法

eg:Integer i2 = Integer.parseInt(str4) //自动装箱

方式二、构造器

eg:Integ i3 = new Integer(str4);

String类

String类的理解

1、String对象用于保存字符串,一组字符序列

2、字符串常量对象是用双引号括起的字符序列。例如:“你好”、“12.97“等

3、使用的是Unicode字符编码,一个字符两个字节

4、常用构造器(有很多个)

(1)String s1 = new String();

(2)String s2= new String(String orginal);

(3)String s3= new String(char[] a);

(4)String s4 = new String(char[] a ,int startIndex,int count);

5、String类实现了接口:Serializable(String 可串行化:可以网络编程)

6、String类实现了接口:Comparable(String 对象可以比较大小)

7、String 是final类,不能被其他类继承

8、String有属性 : private final char value[];用于存放字符串内容

9、一定注意:value是一个final类型,不可修改(value地址不能修改,不能指向其他地址空间)但是单个字符可以修改

String创建对象的两种方式

1、方式一:直接调用

(1)eg: String s = “hspedu”;

2、方式二:调用构造器 String s = new String(“hspedu”);

两种创建String对象的区别

1、方式一:先从常量池查看是否有“hsp”数据空间,如果有,直接指向;如果没有,重新创建,然后指向,s最终指向常量池的空间地址

2、方法二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有“hsp”,重新创建,如果有,直接指向,最终指向堆中的空间分布。

3、内存分布图


4补充:Intern()方法

(1)当调用intern方法时,如果常量池已经包含了一个等于此String对象的字符串(用equals(Object)方法确定),则返回常量池中的字符串。否则,将次String对象性添加到池中,并返回次Sring对的引用

(2)理解:最终返回的是常量池的地址(对象)

字符串的特性

1、String是一个final类,代表不可变的字符序列

2、字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。

(1)小结:底层是

​ ①StringBuilder sb = new StringBuilder();

​ sb.append(a);

​ ②sb.append(b); //是在堆中,并且append是在原来字符出的基础上追加的

​ ③String c1 =“ab",+"cd" //常量相加,看的是池

​ ④String c1 = a+b; //变量相加,是在堆中

String常用方法

说明:String是保存字符串常量的,每次更新都要重新开辟空间,效率低,所以java设计者提供StringBuilder和StringBuffer来增强String的功能

1、equals:区分大小比较内容是否相同

2、equalsIgnoreCase:忽略大小写比较

3、length:返回字符串长度

4、 indexOf:获取字符在字符串对象中第一次出现的索引,索引从0开始,如果找不到返回-1

(1)eg:

​ String s1 =wesaQwste;

​ int index = s1.indexOf('Q'); //字符串也行

5、lastIndexOf:获取字符在字符串对象中最后一次出现的索引,索引从0开始,如果找不到返回-1

6、subString:截取指定范围的子串。

(1)eg

String name = "abcdefghijklmn"; //角标0开始

sout(name.substring(x,y)) //截取x--y范围内的保留。

sout(name.substring(x)) //截取x以后的所有字符保留

7、toUpperCase:转换为大写

8、toLowerCase:转换为小写

9、concat:字符串拼接

(1)eg

String s1 = "牛"

s1 = s1.concat("啊").concat("神仙"); //类似+

10、replace:替换字符串中的字符

(1)eg:

s1 = s1.replace("xxx","yyy"); //在s1中把所有xxx字符,替换成yyy

(2)注意:如果不赋值,则没有对s1有影响(创建新对象)

10、split:分隔字符串,对于某些分隔字符,我们需要转义,比如| \ (常用于,切割域名)

(1)eg

String poem = “xxxxx,yyyyy,zzzzz”;

String [] split = poem.split(",");

for()//输出split数组。

11、toCharArray:字符串转换成数组

(1)eg

char[] chs = s.toCharArray();

12、compareTo:比较两个字符串的大小,如果前者大,则返回正数,后者大,则返回负数,如果相等,返回0。

13、forma:格式化字符(c语言的print语法)

(1)%s:字符串

(2)%c:字符

(3)%d:整型

(4)%.2f:浮点型

(5)理解:这些是占位符由后面变量来替换

StringBuffer类

基本介绍

1、代表可变的字符序列,可以对字符串内容进行增删

2、很多地方于String相同,但StringBuffer是可变长度的

3、StringBuffer是一个容器

4、结构图

String VS StringBuffer

1、String保存的是字符串常量,里面值不能改,每次String类的更新实际上就是更改地址,效率低下 //private final char value[]

2、StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率高 //cahr [] value;

StringBuffer构造方法

String 和 StringBuffer相互转换

String——》StringBuffer

1、使用构造器

(1)注意:返回的才是StringBuffer对象,对str本身没有影响

(2)eg:

​ ①String str = “hello tom”;

​ ②StringBuffer StringBuffer = new StringBuffer(str);

​ 2、使用append()方法

(1)eg:stringBuffer1 = stringBuffer1.append(str);

StringBuffer ——》String

1、toString方法

(1)eg:

​ ①StringBuffer stringBuffer3 = new StringBuffer("啊涛好帅");

​ ②String s = stringBuffer3.toString();

2、使用构造器

(1)eg:

​ ①String s1 = new String(stringBuffer3);

String Buffer常用方法

1、增加:append()方法

(1)eg:

​ ①StringBuffer s = new StringBuffer("啊涛好帅");

​ ②s.append("大傻瓜") //在后面追加

2、删除:delet()方法

(1)eg:

​ ①s.delete(xx,yy) //删除xx到yy的值[xx-yy).前闭后开

3、替换:replace()

(1)eg:

​ ①s.replace(xx,yy,mesg)//替换xx到yy的值,mesg为想要替换的信息

4、查找指定子串在字符串第一次出现的索引,如果找不到返回-1

(1)indexOf()方法

(2)eg:

​ ①int indexOf = s.indexOf("涛") //1

5、插入字符串:insert()方法

(1)eg:

​ ①s.insert(xx,"mesg") //在索引位置为xx的位置插入“mesg”,原有位置自动后移

StringBuilder类

基本介绍

1、一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议先采用该类,大多数情况,StringBuilder比StringBuffer快

2、在StringBuilder 上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。

3、结构示意图


4、注意

(1)StringBUilder继承AbstractStringBuilder类

(2)实现了Serializable,说明StringBuilder对象是可以串行化(对象是可以网络传输,可以保存到文件)

(3)StringBuilder是final类,不能被继承

(4)StringBuilder对象字符序列仍然是存放在其父类AbstractStringBuilder的char[] value;因此,字符序列是堆中

(5)StringBuilder的方法,没有做互斥处理,即没有synchronized关键字,因此在单线程的情况下使用StringBuilder

StringBuilder和String和StringBuffer比较

1、内容比较:

(1)StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。

(2)String:不可变字符序列,效率低,但是复用率高

(3)StringBuffer:可变字符序列,效率高(增删),线程安全

(4)StringBuilder:可变字符序列,效率最高,线程不安全

(5)String使用说明:string实际上原来的“a“字符串对象以及丢弃了,现在有产生了一个字符,如果多次执行,效率极低。

​ ①结论:如果我们对String做大量修改,不要使用String

2、使用原则!

(1)如果字符串存在大量修改操作,一般使用StringBuffer或StringBuilder

(2)如果字符串存在大量修改操作,并在单线程的情况,使用StringBuilder

(3)如果字符串存在大量修改操作,并在多线程的情况,使用StringBuffer

(4)如果我们字符串很少修改,被多个对象引用,使用String,比如数据库信息配置等

Math类

常用方法

1、Math.abs:绝对值

2、Math.pow(x,y):x的y次方

3、Math.ceil():向上取整,返回>=该参数的最小整数

(1)eg:Math.ceil(-3.0001) //结果为:-3

4、Math.floor():向下取整,返回<=该参数的最大整数

5、Math.round():四舍五入,Math.floor(该参数+0.5)

6、Math.sqrt():开方。

7、Math.random:求随机数,返回的是0-1之间的随机小数,前闭后开

8、Math.min():返回最小值

9、Math.max():返回最大值

Arrays类

常用方法

1、toString():返回数组的字符串形式

(1)eg:

​ Arrays.toString(arr)

2、sort():升序排序

(1)eg:

​ Arrays.sort(arr);

(2)因为数组是引用类型,所以通过sort排序后,会直接影响到实参arr

(3)定制排序

3、binarySearch:二分法搜索查找。

(1)注意:

​ ①要求必须数组是有序的,无须则无法使用binarySeach

​ ②如果数组中不存在该元素,则返回-1

(2)用法:int index = Arrays.binarySeach(arr,0);

​ Sout("index = " + index);

(3)如果找不到该元素,则返回return -(low +1); //low是成功那个

4、copyOf():数组元素的复制

(1)Integer newArr = Arrays.copyOf(arr, arr.length);

(2)理解:从arr数组中,拷贝arr.length个元素到newArr数组中

(3)如果拷贝长度>arr.length就在新数组后面,增加null

(4)如果拷贝长度<0就抛出异常NegativeArraySizeException

(5)该方法低层使用的是System.arraycopy()

5、fill()方法:数组元素的填充

(1)eg:

​ ①:Integer[] num = new Integer[] {9,3,2};

​ ②:Arrays.fill(num,99);

​ ③:理解:使用99去填充num数组,可以理解成是替换原理的元素

6、equals:比较两个数组元素内容是否完全一致

(1)eg:

​ ①:boolean equals = Arrays.equals(arr,arr2);

​ //比较arr,arr2数组元素是否完全一致

7、aList将一组数值,转换成list

(1)aList方法,会将(2,3,4,5,6,1)数据转成一个List集合

(2)返回的asList编译类型List(接口)

System类

1、exit:退出当前程序

2、arraycopy:赋值数组元素,比较适合低层调用,一般使用Arrays.copyOf完成复制数组

(1)eg:int [] src = {1,2,3};

​ int [] dest = new int[3];

​ System.out.println(src,0,dest,0,3);

(2)理解:

​ ①src表示:原来的数组

​ ②0表示:从索引哪个位置开始拷贝

​ ③dest:目标数组,把原数组拷贝到dest数组

​ ④0表示:拷贝到目标数组的哪个索引位置

​ ⑤3:表示从原数组拷贝多少个到原数组

3、currentTimeMillens:返回当前时间距离1970-1-1的毫秒数

4、gc:运行垃圾回收机制System.gc();

BigInteger和BigDecimal类

BigInteger和BigDecimal介绍

BigInteger

1、应用场景

(1)BigInteger适合保存比较大的整型

(2)BigDecimal适合保存进度更高的浮点数(小数)

2、BigInteger理解

(1)低层是转化为字符串

(2)四则运算需要调用方法

​ ①add:加

​ ②subtract:减

​ ③multiply:乘

​ ④divide:除

3、eg:

(1)BigInteger bgI = new BigInteger(“999999999999999999999999999999999999999999999999”);

(2)BigInteger add = bgI.add(new BigInteger("8888888"));

(3)sout(add);

BigDecimal

1、理解:和BigInteger类似

2、不同

(1)如果在调用divide方法时,指定精度即可.BigDecimal.ROUND_CEILING

(2)如果有无限循环小数,就会保留分子的进度

(3)eg:

​ ①BigInteger bgI = new BigInteger(“99999999999.9999999999999999999999999999999999999”);

​ ②sout.println(bigDecimal.divide(bigDecimal2,BigDecimal.ROUND_CEILING));

日期类

第一代日期类

1、Date:精确到毫秒,代表特定的瞬间

(1)新建对象,对象就会输出一个默认的日期格式,一般为国外的方式,所以需要进行格式转换

2、SimpleDateFormat:格式和解析日期的类

(1)可以指定格式

(2)在新建SimpleDateFormat对象创建,传入(“日期格式”)

(3)eg:

​ SimpleDateFormat sp = new SimpleDateFormat("yyyyddmmhhmmss E")

​ String format = sp.format(d1);

3、SimpleDateFormat格式和解析日期的具体类。

(1)它允许进行格式化(日期—>文本)

(2)允许解析:(文本—>日期)和规范化

4、通过毫秒数进行时间的运算

(1)Date d2 = new Date(888888);

5、格式化字符串转成Date

(1)日期格式一定要正确(匹配和设置的日期一定要匹配)

(2)eg:

    String a = "2022年12月19日。06:22:11 星期一";
    Date parse = sdf.parse(a);
    System.out.println(sdf.format(parse));

第二代日期类

1、是一个抽象类、构造器是protected,

2、可以通过getINstance()来获取实例

3、提供大量的方法和字段

4、方法c.get(Calendar.MONTH)

Calendar c =  Calendar.getInstance();
System.out.println("c="+ c);
System.out.println("年:"+c.get(Calendar.YEAR));
System.out.println("月:"+c.get(Calendar.MONTH)+1);
System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH));
System.out.println("小时:"+c.get(Calendar.HOUR));
System.out.println("钟:"+c.get(Calendar.MINUTE));
System.out.println("秒:"+c.get(Calendar.SECOND));

5、Calendar没有提供专门的格式化方法,所以需要程序员自己来组合显示

6、如果想显示24小时

(1)把字段改成:HOUR_OF_DAY

第三代日期类

1、因为Calendar也存在问题

(1)可变性:像日期和时间这样的类应该是不可变的。

(2)偏移性:Date中的年份是从1900开始,而月份都是从0开始(所以要+1)

(3)格式化:格式化只对Date有用,Calendar则不行。

(4)此外,它们也不是线程安全的;不能处理闰秒等(每隔两天,多出1s)

常用方法

1、LocalDate(日期/年月日)

2、LocalTime(时间/时分秒)

3、LocalDateTime(日期时间/年月日时分秒)

(1)使用now()返回表示当前日期时间的对象

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);

(2)3包含了1和2

    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);
    System.out.println("年"+ldt.getYear());
    System.out.println("月"+ldt.getMonth());
    System.out.println("日"+ldt.getMonthValue());
    System.out.println("时"+ldt.getHour());
    System.out.println("分"+ldt.getMinute());
    System.out.println("秒"+ldt.getSecond());

    LocalDate now  =LocalDate.now();//可以获取年月日
    LocalTime now2 =LocalTime.now();//获取到时分秒
    System.out.println(now);
    System.out.println(now2);

4、DateTimeFormat对象来进行格式化 //jdk1.8才有

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
System.out.println(dateTimeFormatter);
String format = dateTimeFormatter.format(ldt);
System.out.println(format);

5、Instant时间戳

(1)类似于Date

(2)提供了一些列和Date的转换方式

(3)Instant—>Date:Date.from(instant);

(4)Date—>Instant:date.toInstant();

    //静态 now() 获取表示当前时间戳的对象
    Instant now = Instant.now();
    System.out.println(now);
    //通过from可以把Instant转换成Date
    Date date = Date.from(now);
    Instant instant = date.toInstant();

6、提供plus肯minus方法可以对当前时间进行加或者减

(1)plus();

    //添加800天后输出
    LocalDateTime localDateTime=ldt.plusDays(800);
    System.out.println(localDateTime);

(2)Minus();

// 在3456分钟前是什么时候, 把年月日时分秒打印
LocalDateTime localDateTime2 =ldt.minusMinutes(3456);
System.out.println(localDateTime2);

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇