1.String类的概述(重点牢记)
概述:
字符串就是把一个个的字符串起来,组成字符串.
字符串字面值"abc"也可以看成是一个字符串对象。
字符串是常量,一旦被赋值,就不能被改变。
这里的"不能被改变"指的是字符串在常量池中的值不能被改变,因为字符串是常量.
String s = "abc";
s = "def"; //此时是把s的引用指向了常量池中的"def"对象地址值."abc"本身没有发生改变.
//从String类的原码来看String对象的值是保存在一个叫做value字符数组里面.
//private final char value[]
"def".toString();//"def"能直接调用toString()方法说明"def"是一个字符串对象.
2.String类的构造方法
空串和null的区别?
String s1 = ""; //这是一个字符串对象,只不过值是空
String s2 = null; //这里没有对象.只有一个被赋值为null类型的String s2引用.
//什么时候把引用数据类型赋值为null呢?
当你不想再使用这个对象的时候,想它被回收的时候.
构造方法:
public String()
public String(byte[] bytes)
public String(byte[] bytes, int start, int length) //IO流可能会用到
public String(char[] value)
public String(char[] value, int start, int length) //IO流可能会用到
public String(String s)
//上面这些构造方法在实际开发中使用的都非常少
直接用常量赋值:String s = "abc"; //开发常用
3.String面试题
a.java中创建的字符串都会存在一个叫做常量池的地方.
b.用new创建的String对象
1.此字符串已经存在常量池中,则直接拿过来用,这时只在堆中创建了一个对象.
2.此字符串不在常量池中,则在常量池中创建该字符串,然后在把副本值给堆中String对象
此时创建了两个对象(堆和常量池)
c.字面值常量的字符串相加(+号)
java中会有字符串常量优化机制,在编译的时候会直接在常量池中完成相加操作,
如果有不再创建对象,直接拿来用.
d.字符串变量相加(+号)
字符串变量相加,低层其实用StringBuffer(StringBuild)对象在堆中完成相加操作,
相加后存的其实StringBuffer.toString()地址值.
简单记忆:
java字符串常量优化机制:有就使用,没有就创建.
如果是字符串变量和字符串常量拼接,会先创建一个字符串缓冲区(StringBuffer)的对象,
拼接完成之后,会将该对象转成String,最后把地址值赋值给String引用.
|
|