字符串
字符串常量存在字符串池中
- 方法区:1.7前叫永久代,1.7后叫元空间
- 引用类型放在栈里,对象放在堆里
字符串的不可变特性
- 修改字符串值时,改变的是他的地址
- 是在字符串池中开辟一块新空间
package com.li.changGe.commonlyusedClass.strings;
public class StringBaseDemo01 {
public static void main(String[] args) {
String name;//引用类型
/**
* 这句话是让栈内存中的变量name,指向堆内存中的一个地址
* 而这个地址指向了字符串池中的java常量
*
* java在堆和方法区都有一个
* 两者最后会合为一个:堆指向方法区
*/
name = new String("java");//对象
//----------------------------------------------------
/**
* hashCode值相同,但是这是人为new出来的
*/
String name1 = "java";
/**
* true
* false
*/
System.out.println(name.hashCode() == name1.hashCode());//true
System.out.println(name == name1);//false
}
}
StringBuffer和StringBuilder
- 1.0时有StringBuffer(会慢点,线程安全),
- 1.5后有StringBuilder(效率高,线程不安全)
相比String效率高,节省内存:内部是一个可变长字符串
可变长字符串实现
*新数组的长度(newCapacity)等于原数组的长度(value)2后再+2
StringBuffer的方法都被synchronized修饰
StirngBuilder线程不安全
package com.li.changGe.commonlyusedClass.strings;
public class StringBufferAndStringBuilderDemo01 {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("长歌");
StringBuilder stringBuilder = new StringBuilder("世民");
stringBuffer.append("关山万里路");
stringBuilder.insert(0,"天佑大唐");
/**
* 含头不含尾
*/
stringBuffer.replace(0,2,"李长歌");
stringBuilder.delete(0,stringBuilder.length() - 1);
/**
* 李长歌关山万里路
* 天佑大唐世民--> "民"
*/
System.out.println(stringBuffer.toString());
System.out.println(stringBuilder.toString());
}
}