面试题1:
package project;
public class Test01 {
public static void main(String[] args) {
String str = "abc";
change(str);
System.out.println(str);
}
public static void change(String str){
str = "hello";
}
}
内存分析图:
- 1.创建str(全局变量),引用常量池中的abc地址
- 2.创建str(局部变量),引用常量池中的abc地址
- 3.str(局部变量)断开引用的常量池中的abc地址
- 4.str(局部变量)引用常量池中hello地址
- 最后 str(全局变量)的引用一直没有改变
运行结果:
个人分析:
在调用方法时,因为str(全局变量)引用地址并没有改变,所以str的引用一直是abc。方法中的str是局部变量,它的改变并不影响全局变量str,在方法运行结束后,str(局部变量)就消亡了。(该题中两个变量名恰好一样,故意迷惑我们,我们可以将方法中的str改成a或b或c等等)
面试题2:
package project;
public class Test02 {
private static final int NUM = (int)(Math.random());
public static void main(String[] args) {
change(new Cat());
}
public static void change(final Cat cat){
//cat = new Cat();
cat.setName("hello");
}
}
class Cat{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
运行结果:
个人分析:
1.用final修饰的对象,我们不可以改变对象的引用,但是可以改变对象里面的属性和方法
public static void change(final Cat cat){
//cat = new Cat();
cat.setName("hello");
}
2.不要写这样的代码:
private static final int NUM = (int)(Math.random());
因为定义出来的常量我们自己都不确定。
面试题3:
package project;
public class Test03 {
public static void main(String[] args) {
String he = new String("hello");
String hello = "hello";
System.out.println(hello==he);
}
}
运行结果:
个人分析:
内存分析图:
可以这么理解: String str = "hello"; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。
面试题4:
package project;
public class Test04 {
public static void main(String[] args) {
Integer in1 = new Integer("123");
System.out.println(in1);
Double d = new Double("123");
System.out.println(d);
Boolean b = new Boolean("diusahdsahdsadusaodh");
System.out.println(b);
}
}
运行结果:
个人分析:
只有传入的String对象为"true"时(true不区分大小写),才返回true。其他任何情况都返回false。而Integer和Double类型,会将传入的String类型对象进行判断,如果有字母会抛出一个NumberFormatException的异常。没有的话会将这个String类型转化为int类型。int类型会自动包装为Integer类型。
面试题5:
package project;
public class Test05 {
public static void main(String[] args) {
Integer in1 = new Integer(100);
Integer in2= new Integer(100);
System.out.println(in1==in2);
Integer in3 =100;// Integer.valueOf(100);
Integer in4= 100;
System.out.println(in3==in4);
Integer in5 =200;
Integer in6= 200;
System.out.println(in5==in6);
}
}
运行结果:
个人分析:
第一个:in1与in2是new出来的两个不同的对象,==比较的是引用地址,所以为fasle
第二个:为什么in3与in4比较为true,in5与in6比较为false??
因为在下面的代码中,我们可以看到如果(你设置的值)>=(缓存的最小值)&&(你设置的值)<=(缓存的最大值),那么会直接将缓存中的数拿出来用,这就是一个常量值。如果不满足这个条件就会直接new一个对象出来。
比如我们in3与in4设置的值为100,大于-127 && 小于128,赋的是常量值,所以为true。 而in5与in6设置的值为200,不满足这个条件,所以new出两个不同的对象,与第一题情况一样,所以为false
老师上课给我们讲解的几道简单的面试题,我写出来给大家分享一下。并且附上了我个人的理解,希望能帮助到大家。如果有不当之处请大家多多指正。