今天给大家带来的是一些基础题目,来测测你基础吧,该题在论坛,贴吧,面试等等都有着不菲的出场率。
第一题:
String a = "abc";
String b ="abc";
String c = new String("abc");
String d = b;
System.out.println(a==b);
System.out.println(a==d);
System.out.println(a==c);
如果你的答案是 true ,true, false ,那么恭喜你,你的答案是对的.这道题主要考的是对==符号的理解和有没有new 的理解,分析:第一个true是a和b都是abc,在内存中a一开始创建了abc,当b开始创建的时候会在字符串常量次中,先查找有没有相同abc这个字符串,如果有就指向,所以a和b的内存地址值是一样的,因此是true,第二关true,d的值是赋值成b,b把自己的内存地址给了d,而b的内存地址指向的是a,所以d也是true,最后一个false,c在创建的时候不会像b去字符串常量池中寻找abc这个字符串,因为是“new ”新建!也就是在内存中开辟一个空间装这个字符串,因此内存地址是不动的
第二题:
Integer a = 1000;
Integer b = 1000;
int c = 100;
int d = 100;
System.out.println(a==b);
System.out.println(c==d);
如果你的答案是:flase,true,那么你又答对了,说明你对内存这块引进有着不错的分析能力,分析:第一个false,在Integer类中有一个方法Integer.valueOf该方法的取值的-128~128,在赋值的时候如果超这出这个数据就会返回一个新建的对象所以内存地址不一样.有兴趣的朋友可以去看看我写自动装箱拆箱机制,了解原理才是大牛该有的技能,true:由于时间关系,这个就不解释了,如果有兴趣可以去看看我写的内存中有讲。
第三题:
public void show(String name){
new Thread() {
public void run() {
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(name);
}
}.start();
}
}
这题主题靠的是对内部类的声明周期和final的使用,当内部类访问局部变量的时候,需要在局部变量前加final修饰符,不然编译器就会报错。通常我们也是这么干的。好的,第二个问题来了,为什么要加final修饰符?
分析:为什么要加final关键字。首先内部类的生命周期是成员级别的,而局部变量的生命周期在主函类。也就是说会出现这样一种情况,当show方法执行,new 的线程运行,新线程里面会睡一秒。主线程会继续执行,show执行完毕,name属性生命周期结束。1秒之后,Syetem.out.printh(name)执行。然而此时name引进被释放了,不在内存中了。为了避免这种错误,必须使用final关键字修饰。当被修饰的时候声明周期就会非常长。
小伙伴们,如果你全部答对说明你的基础还是可以的,没有答对的小伙伴们再接再厉~~由于时间关系就不和大家谈了。