Java面试(四)

1、如何把一段逗号分割的字符串转换成一个数组?

2、数组有没有 length()这个方法? String 有没有 length()这个方法?

3、下面这条语句一共创建了多少个对象:String s=a+b+c+d;

4、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?

5、final, finally, finalize 的区别

6、运行时异常与一般异常有何异同?

7、error 和 exception 有什么区别?

8、Java 中的异常处理机制的简单原理和应用。

9、sleep() 和 wait() 有什么区别?

10、同步和异步有何异同,在什么情况下分别使用他们?举例说明。



1、如何把一段逗号分割的字符串转换成一个数组?

1. 用正则表达式,代码大概为:

String [] result = orgStr.split(“,”);


2. 用 StingTokenizer ,代码为:

StringTokenizer tokener = StringTokenizer(orgStr,”,”); String [] result = new String[tokener .countTokens()]; Int i=0;  while(tokener.hasNext(){   result[i++]=toker.nextToken(); }

2、数组有没有 length()这个方法? String 有没有 length()这个方法?

数组没有 length()这个方法,有 length 的属性。String 有有 length()这个方法。

3、下面这条语句一共创建了多少个对象: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。

4、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 stub System.out.println(new Test().test());;     } 
<span class=kd>static</span> <span class=kt>int</span> <span class=nf>test</span><span class=o>()</span> <span class=o>{</span>     <span class=kt>int</span> <span class=n>x</span> <span class=o>=</span> <span class=n>1</span><span class=o>;</span>     <span class=k>try</span> <span class=o>{</span>         <span class=k>return</span> <span class=n>x</span><span class=o>;</span>     <span class=o>}</span> <span class=k>finally</span> <span class=o>{</span>         <span class=o>++</span><span class=n>x</span><span class=o>;</span>     <span class=o>}</span> <span class=o>}</span> 

}

---------执行结果 ---------
1
运行结果是 1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返 回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了, 你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

5、final, finally, finalize 的区别?

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成 final 类型,例如,一段代码...... finally 是异常处理语句结构的一部分,表示总是执行。

finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃 圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用。

6、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕 获的运行时异常。

7、error 和 exception 有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

8、Java 中的异常处理机制的简单原理和应用。

异常是指 java 程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java 使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。
Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为 java.lang.Throwable, Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题, 程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的 问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如, 数 组 脚 本 越 界 ( ArrayIndexOutOfBoundsException ), 空 指 针 异 常 ( NullPointerException )、 类 转 换 异 常 (ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断 线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try..catch 处理或用 throws 声明继续 抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器 不强制用 try..catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常。

9、sleep() 和 wait() 有什么区别?

sleep 就是正在执行的线程主动让出 cpu,cpu 去执行其他线程,在 sleep 指定的时间过后,cpu 才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep 方法并不会释放锁,即使当前线程使用 sleep 方法让出了 cpu,但其他被同步锁挡住了的线程也无法得到执行。wait 是指在一个已经进入了同步锁的线程内,让自己暂时让 出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了 notify 方法(notify 并不释放锁,只是告诉调用过 wait 方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里, 别人还没释放。如果 notify 方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在 notfiy 方法后 增加一个等待和一些代码,看看效果),调用 wait 方法的线程就会解除 wait 状态和程序可以再次得到锁后继续向 下运行。

10、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该 使用异步编程,在很多情况下采用异步途径往往更有效率。



原文链接:https://zhuanlan.zhihu.com/p/347538942