Java面试题(一) String相关
1.String是Java的基本数据类型吗?
不是,Java中基本的数据类型有八种:int,byte,char,short,long,float,boolean,char。String不是Java中的基本数据类型,它是一种引用类型。
Java为每一种基本类型提供了一种封装类,分别为Int,Byte,Char,Short,Float,Boolean,Char。
引用类型和原始类型具有不同的特征和行为,存储方式以及大小和速度。引用类型的默认值为null而基本类型的默认值跟具体类型有关。
引申:
String是final类型的,不允许被改变。它被放入常量池内,常量池是类在编译期间确定的,并且被保存再编译后的.class文件中,包括类和接口里面的常量,以及字符串常量。如下代码段:
String s1="abcde";
String s2="abcde";
String s3="abc"+"de";
System.out.println(s1==s2);
System.out.println(s2==s3);
的运行结果为 true true
我们知道==是对比对象存放的地址是否相同,而equal对比的是对象指向地址中的值是否相同。
Strings1="abcde"在运行时,jvm首先先检查string常量池中是否存在"abcde"这个字符串,如果存在则将该字符串的引用赋给s1,如果不存在,则在常量池中创建该对象,然后将该对象的的引用赋给s1,因此s1和s2再编译阶段已经被确定,指向的地址是相同的。
而Strings3="abc"+"de";中的"abc"和"de"都是常量,在编译阶段,被处理成"abcde",jvm可以在常量池中找到该字符串常量,因此s3指向的地址跟s1以及s2相同。
而使用new String创建的字符串,因为无法再编译阶段确定,所以不会被放入字符串常量池中。
String和StringBuffer的区别?