Day11_包装类
基本数据类型==>引用数据类型
基本数据类型==>引用数据类型==>继承关系
byte Byte Number==>Object
short Short Number==>Object
int Integer Number==>Object
long Long Number==>Object
float Float Number==>Object
double Double Number==>Object
char Character Object
boolean Boolean Object
为什么引用包装类
- 面向对象—操作类,将基本数据类型分装成对应的包装类,就是为了获取某些属性,方法
- 集合,特点:只能存放引用数据类型。
类Integer
- 使用Integer类不需要导包
- Integer类使用手册链接
- Integer底层就是一个int类型数据,就是对这个数据进行的封装
学会使用API使用手册
点击上方的Integer类使用手册链接,找到对应的API,查看各种说明,用的较多的是以下几个:
- 构造方法摘要
- 方法摘要
代码演示
public class Demo01 {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//物极必反
System.out.println(Integer.MAX_VALUE+1);
System.out.println(Integer.MIN_VALUE-1);
//构造方法摘要Integer(12)
Integer i1=new Integer(12);//int--->Interger
Integer i2=new Integer("123");//String--->Interger
//int--->Integer,自动装箱
Integer i3=12;//Integer i3 = Integer.valueOf(12);
//自动拆箱,Integer--->int
int i4=i1;
//各种方法
System.out.println(i1.compareTo(i2));
System.out.println(i1.equals(i2));//true
System.out.println(i1==i2);//false,因为两个对象指向的地址不同
//JDK1.5之后,对于自动装箱来说,要是在-128~127之中,直接返回给你数(从内部类的y一个缓存数组中获取)
//如果没在-128~127之中,要开辟新空间,所以对象的地址不同
Integer i5=12;
Integer i6=12;
Integer i7=129;
Integer i8=129;
System.out.println(i5==i6);//ture
System.out.println(i7==i8);//false
int i9=i1.intValue();
System.out.println(i9);
}
}
输出:
2147483647
-2147483648
-2147483648
2147483647
-1
false
false
true
false
12
String类
StringBuilder
public class Demo02 {
public static void main(String[] args) {
String str="abc";//不可变字符串
StringBuilder sb1 = new StringBuilder();//可变字符串
StringBuilder sb2 = new StringBuilder(23);//新建一个长度为23的字符串
StringBuilder sb3 = new StringBuilder("abc");//此时sb3指向的是默认长度为19(初始字符串的长度+16)的char[]类型数组
sb3.append("kkkkk");//插入5个k之后,字符串的总长度仍未超过19,此时sb3指向的地址不变,直接从原数组第4个位置开始添加
System.out.println(sb3.capacity());
sb3.append("tttttttttttttttttttt");//插入20个t后,字符串的长度已超过19,此时会新建一个char[]类型数组,长度为(原数组长度*2+2)
//然后将原数组所有元素复制给新数组,再把新插入的20个t从新数组第9个位置开始添加
System.out.println(sb3.capacity());
//若新数组的长度超过int的数值范围,即大于21亿多,或者此时新数组的长度仍小于插入后数组的实际长度,则将插入后数组的实际长度作为新数组的长度
sb3.append("tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt");
//此处插入80个t,字符串的长度为108(原字符串实际的长度28+新插入的字符串的长度80)
System.out.println(sb3.capacity());
//推荐将StringBuilder源码过一遍
}
}
输出:
19
40
108
String、StringBuilder和StringBuffer的区别
StringBuilder JDK 1.5 效率高 线程不安全
StringBuffer JDK 1.0 效率低 线程安全
String 是字符串常量,属于对象,String的值是不可以改变的,所以只要操作一次String,就会产生一个新的string对象,效率低下,还浪费内存空间,从源码上看private final char value[];
,底层是一个由final修饰的字符串数组,这就解释了为什么string的值是不可改变的。如果需要对字符串进行修改,就要用stringbuffer或者stringbuilder。
StringBuffer和StringBuilder就不一样了,两者都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder这个抽象类中可以看到char[] value;
,从底层源码中可以看到没有被final修饰,所以他们都是可以改变的字符串数组,所以如果需要对字符串频繁操作时,建议使用stringbuffer或者stringbuilder。
不同点:
StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。而string类会产生新的对象
StringBuilder 类和 StringBuffer 之间的不同在于 StringBuilder 的方法不是线程安全的。
StringBuffer之所以是线程安全的,也可以从底层源码中可以看到该类被synchronized同步块修饰
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。如果要求线程安全的情况下,则必须使用 StringBuffer 类。
在多线程情况下操作大量的数据推荐使用StringBuffer
在单线程情况下操作大量的数据推荐使用StringBuilder