String常见问题及面试常问题
来源:互联网 发布:a1526支持什么网络 编辑:程序博客网 时间:2024/05/20 09:45
String string1= “helloWorld”;
String string2 = new String(“helloWorld”);
问: string1 == string2 是true还是false?
为什么?
String string3 = “hello”;
String string4 = “World”;
问:string1 == (string3+string4)是否正确?
为什么?
问:string1 == (“hello”+”World”)是否是正确的?
为什么?
以前在面试时曾碰到过这样的问题,这里做一下记录。以便以后回顾。
public static void main(String[] args) { String string1= "helloWorld"; String string2 = new String("helloWorld"); //判断strin1 与string2是否相等 System.out.println("String判断两个值是否相等,不能使用==,因为它对比的是地址:"+(string1 == string2)); System.out.println("String判断两个值是否相等,要使用equals来对比 :"+(string1.equals(string2) )); System.out.println("===================================================="); String string3 = "hello"; String string4 = "World"; //判断string3+strin4是否与string1相等,使用==结果是false,因为它会新生成一个新的字符串地址 System.out.println(""+string1 == (string3+string4)); System.out.println(string1.equals(string3+string4)); System.out.println("===================================================="); //如果使用("hello"+"World") 与string1相比,得到的值是相同 /** * 原因:"hello"+"World"是字面量(string3+string4都是对象,它们在加时,使用的是地址),并不是对象,所以他们在进行对比时 * 会先把"hello"+"World" = "helloWord",然后在内存共享区(也就是常量池)中去找有没有,发现已经有了,所以就直接这个地址返回, * 这个地址正好与string1引用的是同一个,所以他们得出的值为true */ System.out.println("如果使用字面量\"hello\"+\"World\"去与string1比较,得到的结果是:"+(string1 == ("hello"+"World"))); }》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》结果如下:String判断两个值是否相等,不能使用==,因为它对比的是地址:falseString判断两个值是否相等,要使用equals来对比 :true====================================================falsetrue====================================================如果使用字面量"hello"+"World"去与string1比较,得到的结果是:true
这里主要有两个地方不好理解:
1:
String string3 = “hello”;
String string4 = “World”;
String string1 = “helloWorld”;
拿(string3+string4)使用 == 与string1对比时,为什么 得到的值 是false?
原因在于:string3+string4在此时都是对象,并不是字面量,所以他们在对比时,会先开辟一块空间并返回空间地址,再把string3与string4的值组合起来放进去,那么此时,拿一个新的空间地址与string1的空间地址进行比较,明显不是同一个,所以得出的值就是false
2:
如上述所说,string3+string4相加使用了新的空间保存,但为什么“hello”+”World” 去与string1的空间地址又是同一个呢?
原因很简单:这时的”hello”+”World”都是常量(字面量),所以虚拟机在处理时先把”hello”+”World”进行了处理组合,得到的一个新的常量(字面量):helloWorld,这时拿helloWorld去常量池中去有没有相同,因为string1指向的空间值正好是helloWorld,所以就不在创建空间,直接 把string1指向的空间返回了,这时,拿string1的空间与它自己进行对比,当然是相同的了。
其实它主要考的是虚拟机处理常量的规则,只要了解这一点,这些问题也就知道答案了。
- String常见问题及面试常问题
- 日语面试自我介绍及常问问题
- java面试常问题
- 面试常问问题
- 面试常问问题
- 面试常问题
- 面试常问问题
- 人事经理常问的面试问题及答案
- 人事经理常问的面试问题及答案
- IOS面试问题常见问题
- 面试常问的问题
- 面试常问的问题
- 面试常问的问题
- 嵌入式面试常问问题
- hibernate 面试常问问题
- 面试常问问题总结
- Unit --面试常问题一
- 面试常问的问题
- Android Studio 技巧之 【Complete Statement】
- java的直接插入排序代码
- Linux和WindowXP上安装Nginx,以及简单配置
- 07-多进程程序设计
- 内核栈
- String常见问题及面试常问题
- 每天一个Linux命令(41):top
- Android-LineChart显示多条曲线
- 下载电子书Problem Solving with Algorithms and Data Structures using Python
- get和post请求的区别
- 根据廖雪峰老师的git教程,得出的个人总结
- 数据库连接池性能横向比对(hikari druid c3p0 dbcp jdbc)
- 纯css仿淘宝京东导航菜单栏
- Spring特性