江左梅郎2017/02/10         
先来看几个java面试中常见的关于String类的面试题,大家可以先思考下结果。
问题1:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
问题2:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
问题3:
String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4);
问题4:
String s1 = "abc";
String s2 = "a" + "bc";
System.out.println(s1 == s2);
问题5:
String str = "abc";
str.substring(3);
str.concat("123");
System.out.println(str);
答案及解析:
问题1:
这里的结果是true.。由于字符串是常量(内存中创建对象后不能修改), 而且字符串在程序中经常使用。 所以Java对其提供了缓冲区(字符串常量池),缓冲区内的字符串会被共享。 使用的字符串常量就是存储在缓冲区中的。使用"abc"时会先在缓冲区中查找是否存在此字符串, 没有就创建一个, 有则直接使用. 第一次使用"abc"时会在缓冲区中创建, 第二次则是直接引用之前创建好的。
问题2:
这里的结果是false. 使用构造函数创建的字符串都是在缓冲区外面创建一个新的。所以只要是使用构造函数创建的字符串, 和任何字符串都不会相等。
问题3:
这里的结果是false。Java中字符串的相加其内部是使用StringBuilder类的append()方法和toString()方法来实现的。而StringBuilder类toString()方法返回的字符串是通过构造函数创建的。
问题4:
这里的结果是true. 其实这里的s2并没有进行字符串相加, 两个双引号形式的字符串常量相加, 在编译的时候直接会被转为一个字符串"abc"。
问题5:
这里结果是"abc"。由于字符串是常量(内存中创建对象后不能修改), 该类中所有方法都不会改变字符串的值。如果希望使用一个可变的字符串, 可以使用StringBuilder或StringBuffer类。
如果大家发现自己需要学习一String类,笔者这里给大家总结了一些关于String类的 特点及常见用法。
java.lang.String类是java中使用最多的类,该实例用于封装一个字符序列。一个字符串中的每个字符都对应的是一个unicode编码,换句话说,一个字符对应两个字节保存在内存中。它不是java的基本数据类型,却可以像基本数据类型一样使用,是java中比较特殊的类。
一、String类的特点
1、String类是final的,不可被继承,字符串一旦创建好了就不可修改,因此字符串对象可以被共享而且不会引起程序的混乱。
2、String类是的本质是字符数组char[], 字符串对象为不变对象,一旦对字符串进行修改操作,会创建新的对象。
3、java中允许我们将一个字符串字面量赋值给字符串引用类型变量。
例如:
引用类型变量 字面量
String str = "Hello";
String str2 = "Hello";
在语法上看来更像是对基本类型变量赋值。
4、String对象可以通过“+”串联。串联后会生成新的字符串。也可以通过concat()来串联。
5、字符串的创建并初始化字符串方法很归纳起来有以下三类:
(1)使用字符串常量直接初始化。比如String s1 = "abc";
(2)使用串联生成新的字符串。比如String s2 = "ab" + "c";
(3)使用构造函数创建并初始化,比如String s3 = new String("abc");
6、Java运行时会维护一个String Pool(字符串常量池),java对字面量产生的字符串进行了缓存。对于重复出现的字面量赋值,jvm会先查找常量池中是否有过这个字符串,若有则直接引用,减少字符串对象的创建,节省内存资源。
二、String对象的创建
1、无论使用何种方式创建一个字符串常量,例如String s="abc",jvm会首先在字符串常量池中查找是否存在相同的字符串定义,其判断依据是String对象中的equals方法的返回值。若已经定义,则直接引用其定义,此时不需要创建新的对象;如果没有定义,则首先创建对象,然后把他加入到字符串池中,再将他的引用返回。
2、java中,只要构造函数来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
3、使用字符串常量直接初始化(如:String s1 = "abc";)或者使用纯字符串串联(如:String s2 = "ab" + "c";)来创建String对象,则仅仅会检查维护常量池中的字符串,如果池中没有就创建一个,不会在堆栈区再去创建该String对象。
4、使用包含变量的表达式来创建String对象,如
String s1 = "ab";
String s2 = s1 + "c";
则不仅会检查维护常量池,而且还会在堆栈区创建一个String对象。
三、常见方法
String类的方法比较简单,可以对照api学习使用。
186****1726 2017/02/11
回复