目录
一、包装类
(一)八大包装类
(二)装箱与拆箱
(三)包装类型和String类型的相互转换
(四)Integer和Character类常用方法
(五)Integer类面试题
二、String类
(一)String类对象的理解
(二)String类对象的创建
(三)String测试题
1.题目1
2.题目2
3.题目3
(四)String字符串特性——常量相加看池,变量相加看堆
1.题目1
2.题目2
3.题目3(重要)
4.题目4
(五)String常用方法
三、StringBuffer类——多线程
(一)StringBuffer基本介绍
(二)StringBuffer构造器的使用
(三)String和StringBuffer相互转换
1.String转换为StringBuffer
2.StringBuffer转为String
(四)StringBuffer常用方法
(五)StringBuffer实现动态分割价格
四、StringBuilder类——单线程
(一)StringBuilder基本介绍
(二)String、StringBuffer和StringBuilder比较
相同点:
不同点:
使用原则总结:
一、包装类
(一)八大包装类
针对八种基本数据类型相应的引用类型—包装类,有了类的特点,就可以调用类中的方法。
包装类结构图:
(二)装箱与拆箱
装箱:jdk5之前就是基本数据类型手动转为包装类。
拆箱:jdk5之前就是包装类手动转为基本数据类型。
自动装箱:jdk5之后就是基本数据类型自动转为包装类,底层调用的是valueOf方法,比如Integer.valueOf()。
自动拆箱:jdk5之后就是包装类自动转为基本数据类型,底层调用xxxValue()方法。
以int <—> Integer为例:
jdk5之前:手动装箱和拆箱
jdk5之后:自动装箱和拆箱
自动装箱与自动拆箱练习:
(三)包装类型和String类型的相互转换
(四)Integer和Character类常用方法
(五)Integer类面试题
二、String类
(一)String类对象的理解
1.String对象用于保存字符串,也就是一组字符序列
2."jack"字符串常量, 双引号括起的字符序列
3.字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
4.String类有很多构造器,构造器可以进行重载常用的有:
5.String类实现了接口Serializable【String可以串行化:在网络间传输】
接口Comparable[String对象可以比较大小]
6.String是final修饰的类,不能被其他的类继承
7.String有属性private final char value[];用于存放字符串内容
8.一定要注意:value 是一个final类型,不可以修改:即value不能指向新的地址,但是单个字符内容是可以变化
(二)String类对象的创建
两种创建String对象的区别
方式一:先在字符串常量池查看是否有"hello"数据空间,如果有,直接指向;
如果没有则重新创建,然后指向。s1最终指向常量池的空间地址
方式二:先在堆中创建空间,里面有value属性,指向字符串常量池的"hello"空间。如果常量池没有"hello",则重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
(三)String测试题
1.题目1
当调用intern方法时,如果字符串常量池中,已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。
b.intern()方法最终返回的是常量池的地址(对象)。
2.题目2
3.题目3
内存图:
java包装类赋值基础类型
(四)String字符串特性——常量相加看池,变量相加看堆
String是一个final类,代表不可变的字符序列。
字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。
1.题目1
上述代码的内存图:
首先创建"zhangsan"对象,s1指向"zhangsan",然后又来了一个值,创建新的"hello"对象,s1重新指向"hello",所以一共创建了2个对象。
2.题目2
编译器可以对上述代码做一个优化,判断创建的常量池对象,是否有引用指向。
String a = "hello" + "abc"; => String a = "helloabc";
如果单独创建"hello"和"abc",没有任何指向,那么就浪费空间,没有意义。因此,上述代码只创建了一个对象。
3.题目3(重要)
上述代码debug step into源码步骤:
第一步:
第二步:
第三步:
第四步:
注意:这里要用JDK8,如果JDK8仍然无法实现上述debug效果,在JDK8的基础上进行下图操作即可。
4.题目4
(五)String常用方法
三、StringBuffer类——多线程
(一)StringBuffer基本介绍
StringBuffer属于java.lang包,它代表可变的字符序列,可以对字符串内容进行增删。很多方法与String相同,但StringBuffer是可变长度的。StringBuffer是一个容器。
- StringBuffer 的直接父类是 AbstractStringBuilder
- StringBuffer 实现了 Serializable,即StringBuffer的对象可以串行化
- 在父类中AbstractStringBuilder 有属性 byte[] value,不是final
- 该 value 数组存放字符串内容,真正存放在堆中,而不是字符串常量池
- StringBuffer 是一个 final类,不能被继承
- 因为StringBuffer 字符内容是存在 byte[] value,所以在变化(增加/删除)
- 不用每次都更换地址(只有放不下了才会创建新对象), 所以效率高于String
- 初始化大小是16
StringBuffer的类继承关系图:
(二)StringBuffer构造器的使用
注意:StringBuffer在JDK8是char[] value;在JDK11是byte[] value
(三)String和StringBuffer相互转换
1.String转换为StringBuffer
2.StringBuffer转为String
(四)StringBuffer常用方法
(五)StringBuffer实现动态分割价格
假如价格如下:.56,需要使用“,”号分割,每3位一个“,”号
四、StringBuilder类——单线程
(一)StringBuilder基本介绍
StringBuilder是一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,单线程的时候推荐使用StringBuilder,它比StringBuffer快。
在StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。
证明如下:
- StringBuilder 继承 AbstractStringBuilder 类
- 实现了Serializable接口,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)
- StringBuilder 是final修饰的类,不能被继承
- StringBuilder对象字符序列仍然是存放在其父类 AbstractStringBuilder的 byte[] value(此处为JDK11,JDK8中是char[] value);因此,字符序列存放在堆中
- StringBuilder的方法,没有做互斥的处理,即没有synchronized关键字,因此在单线程的情况下推荐使用StringBuilder
(二)String、StringBuffer和StringBuilder比较
相同点:
1)都是对字符串进行操作
2)三者的类都被final修饰
3)StringBuffer和StringBuilder,均代表可变的字符串。都实现了Serializable和Comparable,可以序列化,实现在网络间的传输,并且都继承了AbstractStringBuilder类,二者调用的方法相同。JDK11中的value是byte[],JDK8中的value是char[]。
不同点:
1)String代表不可变字符序列,byte[] value 被final修饰,效率低,但是复用率高(如果内容相同,都指向常量池中同一个地址);
String效率低的原因:创建一个字符串,后面又对其进行拼接,原来的字符串被丢弃。如果多次执行这些改变字符串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大地影响程序性能。因此,如果我们对String做大量修改,不要使用String。
2)StringBuffer代表可变字符序列,byte[] value没有被final修饰,效率较高(增删)、线程安全
3)StringBuilder代表可变字符序列,byte[] value没有被final修饰,效率最高、线程不安全
使用原则总结:
1)如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
2)如果字符串存在大量的修改操作,并存在单线程的情况,使用StringBuilder
3)如果字符串存在大量的修改操作,并存在多线程的情况,使用StringBuffer
4)如果字符串很少修改,被多个对象引用,使用String,比如配置信息等
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/25399.html