String类面试题
来源:互联网 发布:中国人均gdp 知乎 编辑:程序博客网 时间:2024/05/22 11:43
问题1:
请问以上程序执行结果是什么?
第一句执行后内存中有两个对象,而不是一个。一个由new String("abc")中的"abc"在String Pool里生成一个值为"abc"的对象;第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝。变量s最后指向堆中产生的"abc"对象; 如果在new String("abc");之前,String Pool里面已经存在一个值为"abc"的对象,则省去在String Pool中创建"abc"对象的步骤,直接在堆内存中创建一个新对象,并将此堆内存中对象的引用赋给s;
第二句执行时,s1先去String Pool找是否有值为"abc"的对象,很显然在上一步中java已经在String Pool里生成一个"abc"对象了,所以s1直接指向String Pool中的这个"abc";如果String Pool中尚无"abc"对象,那么将在String Pool中创建一个"abc"对象,并将此对象的引用赋给s1;
第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个"abc"对象,这与执行第一句后生成的"abc"是不同的两个对象,s2最后指向这个新生成的对象;因为第一个String s = new String("abc");中已经在String Pool中创建了"abc"对象,故而此步骤省略。
因此,执行后面的打印语句的结果是三个false
问题2:
请问以上程序执行结果是什么?
设s为String类型的变量,当执行s.intern()时,java先在String Pool里找与字符串变量s相等(用equals()方法)的字符串,若有则将其引用返回;若没有则在String Pool里创建一个与s的值相等的字符串对象,并将其引用返回。从中我们可以总结出intern()方法无论如何都将返回String Pool里的字符串对象的引用。
因此,以上程序执行的结果是false,true,true。
PS:设s和t为两个字符串变量,若有s.equals(t),必有s.intern() == t.intern();
PS:"=="永远比较的是两边对象的地址是否相等。
问题3:
请问以上程序执行结果是什么?
前三句在String Pool里分别产生“hello”、“hel”、“lo”三个常量字符串对象
当做第一个加法连接时,+号两边都是常量字符串,java就会将两者拼起来后到String Pool里找与之相等(用equals)的字符串,若存在则将其地址返回;不存在则在String Pool里新建一个常量对象,其值等于拼接后的字符串,并将其地址返回。
第二个+号两边有一个是变量,此时,java会在堆里新建一个对象,其值是两字符串拼接后的值,此时返回的地址是堆中新对象的地址。
所以,第一句做+连接后返回String Pool中“hello”的地址,显然与变量hello的地址相等;
第二句返回的是堆中地址,显然与变量hello的地址不等;
- String s = new String("abc");
- String s1 = "abc";
- String s2 = new String("abc");
- System.out.println(s == s1);
- System.out.println(s == s2);
- System.out.println(s1 == s2);
请问以上程序执行结果是什么?
第一句执行后内存中有两个对象,而不是一个。一个由new String("abc")中的"abc"在String Pool里生成一个值为"abc"的对象;第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝。变量s最后指向堆中产生的"abc"对象; 如果在new String("abc");之前,String Pool里面已经存在一个值为"abc"的对象,则省去在String Pool中创建"abc"对象的步骤,直接在堆内存中创建一个新对象,并将此堆内存中对象的引用赋给s;
第二句执行时,s1先去String Pool找是否有值为"abc"的对象,很显然在上一步中java已经在String Pool里生成一个"abc"对象了,所以s1直接指向String Pool中的这个"abc";如果String Pool中尚无"abc"对象,那么将在String Pool中创建一个"abc"对象,并将此对象的引用赋给s1;
第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个"abc"对象,这与执行第一句后生成的"abc"是不同的两个对象,s2最后指向这个新生成的对象;因为第一个String s = new String("abc");中已经在String Pool中创建了"abc"对象,故而此步骤省略。
因此,执行后面的打印语句的结果是三个false
问题2:
- System.out.println(s == s.intern());
- System.out.println(s1 == s1.intern());
- System.out.println(s1.intern() == s2.intern());
请问以上程序执行结果是什么?
设s为String类型的变量,当执行s.intern()时,java先在String Pool里找与字符串变量s相等(用equals()方法)的字符串,若有则将其引用返回;若没有则在String Pool里创建一个与s的值相等的字符串对象,并将其引用返回。从中我们可以总结出intern()方法无论如何都将返回String Pool里的字符串对象的引用。
因此,以上程序执行的结果是false,true,true。
PS:设s和t为两个字符串变量,若有s.equals(t),必有s.intern() == t.intern();
PS:"=="永远比较的是两边对象的地址是否相等。
问题3:
- String hello = "hello";
- String hel = "hel";
- String lo = "lo";
- System.out.println(hello == "hel" + "lo");
- System.out.println(hello == "hel" + lo);
请问以上程序执行结果是什么?
前三句在String Pool里分别产生“hello”、“hel”、“lo”三个常量字符串对象
当做第一个加法连接时,+号两边都是常量字符串,java就会将两者拼起来后到String Pool里找与之相等(用equals)的字符串,若存在则将其地址返回;不存在则在String Pool里新建一个常量对象,其值等于拼接后的字符串,并将其地址返回。
第二个+号两边有一个是变量,此时,java会在堆里新建一个对象,其值是两字符串拼接后的值,此时返回的地址是堆中新对象的地址。
所以,第一句做+连接后返回String Pool中“hello”的地址,显然与变量hello的地址相等;
第二句返回的是堆中地址,显然与变量hello的地址不等;
- String类面试题
- 面试题 String类
- Java String类面试题
- String类常见面试题
- Java String 类面试题
- C++经典面试题之---String类
- C++经典面试题之---String类
- JAVA --String类笔试面试题
- String类猥琐的面试题
- String类的一道面试题
- 【转载】JAVA --String类笔试面试题
- JAVA --String类笔试面试题
- JAVA --String类笔试面试题
- C++面试题之string类
- 面试题:写一个string类
- C++经典面试题之---String类
- C++经典面试题之---String类
- C++面试题:String类的实现
- js获取元素
- hosts屏蔽网站以及代理越过屏蔽
- hdu 1058 humble number
- PuTTY连接VMware下的FreeBSD的问题及解决方法
- Flash Builder 的使用笔记
- String类面试题
- 让PHP更快的提供文件下载
- 用云和NoSQL扩展PHP应用
- guvnor+designer开发环境搭建
- struts2中的国际化
- 软件架构的相关概念和实践
- DM8168 EMAC/MDIO模块(3)
- 正则表达式基础知识
- Freemarker简单实例