JAVA学习笔记StringStringBufferStringBuilder
Posted !0 !
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA学习笔记StringStringBufferStringBuilder相关的知识,希望对你有一定的参考价值。
一、String
1.String的特点
-
String类声明为final,说明该类不可被继承
-
String类实现了
Serializable
接口:说明字符串是支持序列化的。String类还实现了
Comparable
接口:说明String可以比较大小 -
String底层用
final char[] value
存储字符串数据,说明其不可变性
2.String不可变性
当对字符串重新赋值或者进行连接还有替换操作时,实际上不会对当前字符串做出修改,而是将修改的值指向另一个地址。具体我们来看代码。
//重新赋值操作
String s1 = "abc";//字面量的定义方式
String s2 = "abc";
s1 = "hello";
System.out.println(s1);//hello
System.out.println(s2);//abc
System.out.println(s1 == s2);//false;因为s1指向了另外一个地址
//连接操作
String s3 = "abc";
s3 += "def";
System.out.println(s3);//abcdef
//替换操作
String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println(s4);//abc;所有操作对原字符串都不会产生影响
System.out.println(s5);//mbc
System.out.println(s4 == s5);//false;因为s5指向了另外一个地址
内存示意图(有机会最好学习一下JVM)
3.String实例化的两种方式对比
第一种方式:直接使用字面量来定义
第二种方式:使用new + 构造器来定义
//直接使用字面量来定义,s1的数据储存在字符串常量池中
String s1 = "abc";
String s2 = "abc";
//使用new + 构造器来定义,此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false
内存示意图:
4.字符串拼接方式赋值
- 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
- 只要其中一个是变量,结果就在堆中
- 如果拼接的结果调用intern()方法,返回值就在常量池中
- 用final修饰的变量是常量
String s1 = "abc";
String s2 = "def";
String s3 = "abcdef";
String s4 = "abc" + "def";
String s5 = s1 + "def";
String s6 = "abc" + s2;
String s7 = s1 + s2;
final String s8 = "abc";//s8:常量
String s9 = s8 + "def";
String s10 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“abcdef”
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
System.out.println(s3 == s9);//true
System.out.println(s3 == s10);//true
5.String与其他类型的转换
①与基本数据类型、包装类之间的转换
- String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
- 基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
②与字符数组之间的转换
- String --> char[]:调用String的toCharArray()
- char[] --> String:调用String的构造器
③与StringBuffer、StringBuilder之间的转换
- String -->StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器
- StringBuffer、StringBuilder -->String:①调用String构造器;②StringBuffer、StringBuilder的toString()
二、StringBuffer、StringBuilder
1. 【面试题】String、StringBuffer、StringBuilder三者的对比
- String:不可变的字符序列;底层使用final char[]存储
- StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
相同:三个类都是用final修饰的。
2.String、StringBuffer、StringBuilder三者的执行效率
从高到低排列:StringBuilder > StringBuffer > String
以上是关于JAVA学习笔记StringStringBufferStringBuilder的主要内容,如果未能解决你的问题,请参考以下文章