Java中String类的常见面试题
来源:互联网 发布:派派社交软件 编辑:程序博客网 时间:2024/06/05 04:14
转载自:http://www.jianshu.com/p/44224e650520
第一题:==与equals()的区别
1.判断定义为String类型的s1和s2是否相等 String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); System.out.println(s1.equals(s2)); 2.下面这句话在内存中创建了几个对象? String s1 = new String("abc"); 3.判断定义为String类型的s1和s2是否相等 String s1 = new String("abc"); String s2 = "abc"; System.out.println(s1 == s2); System.out.println(s1.equals(s2));4.判断定义为String类型的s1和s2是否相等 String s1 = "a" + "b" + "c"; String s2 = "abc"; System.out.println(s1 == s2); System.out.println(s1.equals(s2));5.判断定义为String类型的s1和s2是否相等 String s1 = "ab"; String s2 = "abc"; String s3 = s1 + "c"; System.out.println(s3 == s2); System.out.println(s3.equals(s2));解答: 上面所有equals()方法的结果都是true,因为equals()方法在String类中,我们来看下API中的解释equals: 将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true。 因为String类中字符串是常量;它们的值在创建之后不能更改第一题中: //常量池中没有这个字符串对象,就创建一个,如果有直接用即可 String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); //==号比较的是地址值,true System.out.println(s1.equals(s2)); //比较的是字符串的内容:true第二题: //创建几个对象 //创建两个对象,一个在常量池中,一个在堆内存中 String s1 = new String("abc"); System.out.println(s1);第三题: String s1 = new String("abc"); //录的是堆内存对象的地址值 String s2 = "abc"; //记录的是常量池中的地址值 System.out.println(s1 == s2); //false第四题: //byte b = 3 + 4; //在编译时就变成7,把7赋值给b,常量优化机制 String s1 = "a" + "b" + "c"; //java中有常量优化机制,在编译时期就能确定s2的值为"abc",所以编译时期,在常量池中创建"abc" String s2 = "abc"; //执行到这里时常量池中已经有了"abc",所以就不再创建,所以s1和s2指向的是常量池中同一个字符串常量"abc" System.out.println(s1 == s2); //true,java中有常量优化机制 第五题: String s1 = "ab"; String s2 = "abc"; String s3 = s1 + "c"; //s1是变量,s1与常量"c"相加 System.out.println(s3 == s2); //false
第二题:String字符串与BufferString的传递问题
public class Demo7_StringBuffer { /** * 基本数据类型的值传递,不改变其值 引用数据类型的值传递,改变其值 String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的 */ public static void main(String[] args) { String s = "heima"; System.out.println(s); change(s); System.out.println(s); System.out.println("---------------------"); StringBuffer sb = new StringBuffer(); sb.append("heima"); System.out.println(sb); change(sb); System.out.println(sb); } public static void change(StringBuffer sb) { //调用该方法时实际参数的sb和形式参数的sb指向的是同一个对象(StringBuffer容器) //方法内部又在该容器里添加了"itcast",所以方法结束时,局部变量的sb消失,但是实际参数的sb所指向的容器的内部的内容已经发生了改变 sb.append("itcast"); } public static void change(String s) { s += "itcast"; } //为了便于大家理解,再建立一个changeString方法 public static void changeString(String str) { //因为str是属于局部变量,在调用该方法是实际参数s和形式参数str指向同一个字符串对象 //但是在方法内部将str又指向了一个新的字符串对象,而此时s还是指向的原来的字符串对象 //changeString方法执行完毕,局部变量str消失,方法内部产生的新的字符串对象称为垃圾 //但是s还是指向的原有的字符串对象,并没有改变 str += "itcast"; }}
第三题:Integer的面试题
Integer i1 = new Integer(97); Integer i2 = new Integer(97); System.out.println(i1 == i2); System.out.println(i1.equals(i2)); //false System.out.println("-----------"); Integer i3 = new Integer(197); Integer i4 = new Integer(197); System.out.println(i3 == i4); System.out.println("-----------"); //false Integer i5 = 97; Integer i6 = 97; System.out.println(i5 == i6); System.out.println("-----------"); //true Integer i7 = 197; Integer i8 = 197; System.out.println(i7 == i8); //false /* * -128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取 * 如果超过了byte取值范围就会再新创建对象 * 源码分析: * public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) //i>= -128 && i <= 127 return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } */
阅读全文
0 0
- Java中String类的常见面试题
- Java中String类的常见面试题
- 面试题中常见的String类问题
- 面试题中常见的String类问题 .
- 面试题中常见的String类问题
- 面试题中常见的String类问题
- 【java】String类常见面试题
- Java-String类常见面试题
- java面试题中常见的关于String类问题总结
- String类常见面试题
- Java数组中常见的面试题
- Java数组中常见的面试题
- 【String疑难解惑】面试题中常见的String类问题?
- Java String常见面试题汇总
- Java 几道常见String面试题
- Java 几道常见String面试题
- Java 几道常见String面试题
- String常见面试题
- 浅谈高薪SEO优化专员是如何更新网站内容的
- 批处理备份MySQL数据库(.bat文件)
- 【传智播客郑州校区分享】Java 8新特性之Lambda表达式入门
- 五款高效的开源Web性能测试工具
- 鼹鼠工厂系列文章:从零开始实现完整的社交网络系统1(序言)
- Java中String类的常见面试题
- 使用nginx代理kibana并设置身份验证
- Cortex-M3的整体风景
- 特征选择
- 干货|对于软件产品质量的一些思考
- 网络编程怎么学
- java异常处理
- windows10系统下win键失效
- QSysInfo获取操作系统的相关信息