面试题 -- Java初级开发

Posted yadiel-cc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 -- Java初级开发相关的知识,希望对你有一定的参考价值。

Java初级开发面试题

2019-11-02  17:40:45  by冲冲


 

1、String

String是定义在 java.lang 包下的一个类。它不是基本数据类型。String是不可变的。

JVM使用字符串池来存储所有的字符串对象。字符串常量池存在于Java的堆内存中。(JDK1.6及以前常量池放置于方法区/永久代,JDK1.7开始放置于堆,可能是因为方法区太小了)

技术图片

① 问题:该段代码中有几个字符串被创建?

String str = new String("Cat");

 

解析:将会创建1或2个字符串。如果在字符串常量池中已经有一个字符串“Cat”,那么就会创建一个“Cat”字符串。如果字符串常量池中没有“Cat”,那么首先会在字符串池中创建,然后才在堆内存中创建,这种情况就会创建2个对象了。

② 比较各种场景的String

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");

System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s3==s4); //false

System.out.println(s1.equals(s3)); //true
System.out.println(s3.equals(s4)); //true

 

③ 问题:下面的代码将创建几个字符串对象?

1 String s1 = new String("Hello");  
2 String s2 = new String("Hello");

 

答案是3个对象.。

第一,行1 在字符串池中创建“hello”对象。第二,行1在堆内存中创建带有值“hello”的新字符串。第三,行2在堆内存中创建带有值“hello”的新字符串。这里“hello”字符串池中的字符串被重用。

④ 问题:下面的代码输入什么?

String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 ==s2); //false

 

 

String的intern()方法:当intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。因为该段代码没有分配到S2,S2没有变化,如果该第三行代码为 s2 = s2.intern(),则输入true。

⑤ String是线程安全的吗?

String是不可变类,一旦创建了String对象,我们就无法改变它的值。因此,它是线程安全的,可以安全地用于多线程环境中。

StringBuffer是线程安全的,使用Synchronized锁。

StringBuilder是线程不安全的。

⑥ 下面的代码输入什么?

String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));

 

输入false,因为s2不是String类型,String的equals方法进行了类型判断。

⑦ 为什么我们在使用HashMap的时候总是用String做key?

因为字符串是不可变的,当创建字符串时,它的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。

 

 

 

 

 

 

 

以上是关于面试题 -- Java初级开发的主要内容,如果未能解决你的问题,请参考以下文章

最新获得的一份初级Java开发工程师必会的面试题

最全153道Spring全家桶面试题,java初级面试官常问的问题

Spring经典面试题,帮你整理好了,公司初级程序员Java面试题

面试经验丨百度 测试开发工程师 面试题集(含面试题答案),来瞧瞧

分享 2021 年最新阿里 java 面试题:java 初级 + 中级 + 高级面试题(附答案),让你的面试之路畅通无阻!

数据库索引高频面试题:java初级工程师简历