这方面算是些零零碎碎的知识点,但是也不能忽略哦~~

String、StringBuffer、StringBuilder

这个问题在面试中最是常见,为啥捏?
一个是值是否可变,还有一个就是线程安全

  1. 首先String类被new出来的对象,肯定是放在堆内存中,相互地址不同,如若比较值,只能使用.equals()方法
  2. string类是一个不可变字符串,而stringbuffer和stringbuilder地址上的值可变,我们来做个实验。
    通过.hashcode()方法,相同的对象拥有相同的hashcode,所以可见stringbuffer类型的sb1修改值后hashcode不变,而string类型的s1则改变,说明s1已经不是之前的对象了。
    实际上此时的s1是重新被新建出来的,之前的s1=“123”已经被JVM进行垃圾回收了,这时也会影响到性能,所以在字符串需要被修改时,不选用string类。
		String  s1  ="123";
		System.out.println( s1);
		System.out.println(s1.hashCode());//  地址上的值不可变
		s1 = s1+"12";
		System.out.println( s1);
		System.out.println(s1.hashCode());
		System.out.println("---------");
		StringBuffer  sb1  = new StringBuffer("123");
		System.out.println( sb1.hashCode());  //地址上的值可变
		System.out.println( sb1);
		sb1.append("123");
		System.out.println( sb1.hashCode());
		System.out.println( sb1);
//这是打印结果
//		123
//		48690
//		12312
//		46792659
//		---------
//		1704856573
//		123
//		1704856573
//		123123

StringBuffer、StringBuilder线程安全性

这是一个面试常问的内容两者哪一个线程安全,为什么
很显然,了解过的都知道StringBuffer是线程安全的,但是为啥捏
其实是因为StringBuffer的底层代码中相关的方法都是加了同步锁synchronized
这就是保证线程安全的重要机制,在面对并发的情况下,同一时间内,只会有一条线程运行,大大的保证了安全性
image.png
但是StringBuilder则缺少这种同步机制,并不能保证并发状态下的数据安全,但是在面对单线程或者主线程操作的情况下,StringBuilder的速度又超过了StringBuffer。
因此,根据不同的需求选取相关的字符串类型,才是最重要的,
下一站,我们来详细介绍一下多线程的同步机制

Q.E.D.