Spring常见面试题(String、StringBuffer和StringBuilder)

1、 java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象(final修饰),每次操作都会new String() ,然后将指针指向该对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下不建议使用 String。

StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。

2、String str="ab"与 String str=new String("ab")一样吗?
不一样,因为内存的分配方式不一样
String str="ab"的方式,JVM会将其分配到常量池中;
String str=new String("ab")则会被分到堆内存中。

public static void main(String[] args) {
		String str1 = "ab";
		String str2 = new String("ab");
		System.err.println(str1 == str2); // fasle
		System.err.println(str1.equals(str2)); // true

		/**
		 * PS:==和equals的区别
		 * 1)==比较的是值是否相等
		 * 
		 * 作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
		 * 
		 * 作用于引用类型的变量,则比较的是所指向的对象的地址是否想等;
		 * 
		 * 2)equals方法
		 * equals方法不能作用于基本数据类型的变量,继承自Object类,比较的是是否是同一个对象
		 * 
		 * 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
		 * 
		 * 诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
		 */
	}

3、为什么StringBuffer strBu = " "和StringBuilder strDe = " "报错?

Spring常见面试题(String、StringBuffer和StringBuilder)_第1张图片

很多人用习惯了String,再用StringBuffer或者StringBuilder的时候,都会按照String初始化的习惯来,String str="ab"之所以不报错,是因为Jvm会将该值存在字符串常量池中(编译阶段就会在内存中创建),而new String("cd")是放在堆中(运行时才会在堆中创建对象),所以String不需要new 对象就可以直接赋值,而StringBuffer和StringBuilder不先new 对象就直接赋值,自然是行不通的。

你可能感兴趣的:(基础)