Day11_包装类

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

为什么引用包装类

  1. 面向对象—操作类,将基本数据类型分装成对应的包装类,就是为了获取某些属性,方法
  2. 集合,特点:只能存放引用数据类型。

类Integer

  1. 使用Integer类不需要导包
  2. Integer类使用手册链接
  3. 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

posted @ 2020-08-03 00:12  XLR  阅读(69)  评论(0编辑  收藏  举报