一.String
- 字符串一旦创建,就不可改变,且该对象打印出来为值
要想打印16进制地址Integer.toHexString(System.identityHashCode(s2))
//字符串一旦创建,就不可改变,且该对象打印出来为值,要想获取地址调用toHexString()
String s2 = "String1";
System.out.println(Integer.toHexString(System.identityHashCode(s2)));//用于打印String的地址 776ec8df
s2 = "String2";//这里重新给变量赋值,其实是重新创建了一个对象
System.out.println(Integer.toHexString(System.identityHashCode(s2))); // 4eec7777
这里打印出的地址是不同的说明不是同一常量
- 通过双引号进行赋值的变量会放在常量池中,在进行赋值前会先在常量池中进行查找,有直接赋给变量当前值的地址
String s2 = "String1";
System.out.println(Integer.toHexString(System.identityHashCode(s2)));// 776ec8df
String s3 = "String1";
System.out.println(Integer.toHexString(System.identityHashCode(s3))); // 776ec8df
- 通过new String()创建的对象是在堆中
String string = new String("String");
String string1="String";
System.out.println(Integer.toHexString(System.identityHashCode(string1)));
// 3d075dc0
System.out.println(Integer.toHexString(System.identityHashCode(string)));
//214c265e
- 字符串的拼接
//String中的字符串拼接
String s5=s4+"e";//变量+常量
String s6="ae";
String s7="a"+"e";//常量+常量 直接拼接
System.out.println(s6==s7);//这里为true因为常量优化机制直接会将其拼接
System.out.println(s5==s6); //这里为false因为一个在常量池中一个在堆内存中
/*
这里是创建了一个StringBuilder 然后将s4赋值给他然后利用append方法将c加入,然后调用toString();返回给一个在堆中的新的String对象
*/
- 常用方法
String s222 = "15881902965";
String s12 = "3131";
//字符串数组的相互转换
char[] chars = s12.toCharArray();
for (char c : chars
) {
System.out.print(c + " ");
}
System.out.println(chars.toString());
//字符串之间的相互比较
s12.equals(s222);//比较的是值
//替换
String ss="tmd232";
String replace = ss.replace("tmd", "**");
//截取
String substring = ss.substring(1, 3);
//切割
String sss="192,31,3111";
String sss1="192.31.111";
String[] split = sss.split(",");
String[] split1 = sss1.split("\\.");//由于是根据正则表达式进行切割,这里需要转义
二.StringBuffer
StringBuffer是线程安全的可变字符串,用于多线程中
三.StringBuilder
StringBuilder是线程不安全的可变字符串,用于单线程,全局变量中
初始长度为16,一般建议提前给定字符串长度
StringBuilder stringBuilder = new StringBuilder("dada");
System.out.println(Integer.toHexString(System.identityHashCode(stringBuilder))); //34a245ab
stringBuilder.append("sda"); //尾部插入
System.out.println(Integer.toHexString(System.identityHashCode(stringBuilder))); //34a245ab
System.out.println(stringBuilder); //dadasda
stringBuilder.insert(0,2); //其中一个位置插入
System.out.println(stringBuilder);
比较
基本原则:
如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则