黑马程序员技术交流社区
标题:
java中关于String类的面试题整理
[打印本页]
作者:
淡然无味
时间:
2016-4-18 00:13
标题:
java中关于String类的面试题整理
今天在观看java基础视频中关于String类的几个面试题的时候,发现虽然只有短短的几行代码,却隐藏了很多知识点,所以自己在看完视频后简单的整理了一下,其中不乏存在疏漏,不足之处还请个位指出!
public class Test_String {
public static void main(String[] args) {
// test1();
// test2();
// test3();
// test4();
test5();
}
private static void test5() {
/*
* str2指向的是常量池中“abc”的地址值
* str1指向的是常量池中“ab”的地址值
* String中通过 “+” 来使字符串串联,而字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的
* 系统会先创建一个StringBuilder对象获得值“abc”,由于无法将StringBuilder对象传给String对象,所以需要调用toString方法来创建一个String对象
* str3指向的实际是堆内存中利用toString方法创建的String对象,所以和指向常量池中“abc”的str2地址是不同的,结果为false
*
* String中重写了equals方法,比较的是内容,结果为true
*/
String str1 = "ab";
String str2 = "abc";
String str3 = str1 + "c";
System.out.println(str2 == str3);
System.out.println(str2.equals(str3));
}
private static void test4() {
/*
* true java中存在常量优化机制,"a"+"b"+"c"系统会默认变成“abc”来存放,str1在创建的时候就已经在常量池中创建了abc,所以str2会直接使用
* true 比较的是内容,同为abc,所以肯定是为true
*/
String str1 = "a"+"b"+"c";
String str2 = "abc";
System.out.println(str2 == str1);
System.out.println(str1.equals(str2));
}
private static void test3() {
/*
* flase
* true
*
* new String("abc")中存放的是常量池中“abc”的副本,地址值是在堆内存中分配的
* str1指向的是常量池中“abc”
* 所以这里str和str1的地址肯定不相同,但是String类中重写了equals方法这里比较的是str和str1的值,都是abc所以相等
*/
String str = new String("abc");
String str1 = "abc";
System.out.println(str == str1);
System.out.println(str1.equals(str1));
}
private static void test2() {
/*
* 创建了几个对象?
*
* public String(String original)
* 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
* 由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本。
*
* 1、首先在常量池中创建一个abc字符串
* 2、在堆内存中创建一个String对象
* 3、将常量池中abc的副本传给堆中的String对象
* 4、String对象将地址值返回给引用
*
* 所以这里一共创建了两个对象,常量池中的“abc”和堆内存中“abc”的副本String对象
*/
String str = new String("abc");
}
private static void test1() {
/*
* String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
* 字符串是常量;它们的值在创建之后不能更改,存放在常量池
*
* String类型属于引用数据类型 String str1 = "abc",实际上是类似于Student stu = new Student();
* 简而言之就是说这里的“abc”实际上是String类的实现,并且是final修饰的,所以系统会在常量池中分配一个地址值
* 接下来的String str2 ="abc",这个语句实际上是把abc的地址传给str2,所以这里str1和str2指向的是同一个对象
* 既然是同一个对象,那么地址值肯定是一样的,所以使用==来比较肯定是true
* 而String类中是有重写equals方法的,当内容相同的时候比较结果是true
*/
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
// System.out.println(str1.hashCode());
// System.out.println(str2.hashCode());
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2