Java面试宝典系列之基础面试题String、变量、类与对象、集合类、SSH(二)
作者:egg
邮箱:xtfggef@gmail.com
微博:http://weibo.com/xtfggef
博客:http://blog.csdn.net/zhangerqing(转载请说明出处)
这章我们还是接着上一章的,继续整理。
1、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
2、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
答:对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");
最终打印的结果应该为true。关于字符串更多的介绍,请看:深入解读Java字符串 http://blog.csdn.net/zhangerqing/article/details/8093919
3、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:
public class Test {/** * @param args add by zxx ,Dec 9, 2008 */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(new Test().test());;}static int test(){int x = 1;try{return x;}finally{++x;}}}
---------执行结果 ---------
1
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
4、下面的程序代码输出的结果是多少?
package com.huawei.interview;import java.io.IOException;public class GarbageTest {/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {// TODO Auto-generated method stubtry {gcTest();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("has exited gcTest!");System.in.read();System.in.read();System.out.println("out begin gc!");for(int i=0;i<100;i++){System.gc();System.in.read();System.in.read();}}private static void gcTest() throws IOException {System.in.read();System.in.read();Person p1 = new Person();System.in.read();System.in.read();Person p2 = new Person();p1.setMate(p2);p2.setMate(p1);System.out.println("before exit gctest!");System.in.read();System.in.read();System.gc();System.out.println("exit gctest!");}private static class Person{byte[] data = new byte[20000000];Person mate = null;public void setMate(Person other){mate = other;}}}
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。下面内容来自于网上(主要特点就是清空堆栈中的某个元素,并不是彻底把它从数组中拿掉,而是把存储的总数减少,本人写得可以比这个好,在拿掉某个元素时,顺便也让它从数组中消失,将那个元素所在的位置的值设置为null即可):我实在想不到比那个堆栈更经典的例子了,以致于我还要引用别人的例子,下面的例子不是我想到的,是书上看到的,当然如果没有在书上看到,可能过一段时间我自己也想的到,可是那时我说是我自己想到的也没有人相信的。
30、
作者:egg
邮箱:xtfggef@gmail.com
微博:http://weibo.com/xtfggef
博客:http://blog.csdn.net/zhangerqing(转载请说明出处)
大家有什么补充的,在下面回复,同时也希望提出宝贵的意见!
题目和答案有些来自网络和传智播客张孝祥老师的整理,本人收集的,如果有回答不恰当的地方,还望及时指出、改正!