关于Java 部分的160道面试题(一)

1、列举出 JAVA 中 6 个比较常用的包【天威诚信面试题】
【参考答案】
java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing
2、JDK 中哪些类是不能继承的?【信雅达面试题】
【参考答案】
不能继承的是类是那些用 final 关键字修饰的类。一般比较基本的类型或防止扩展类无
意间破坏原来方法的实现的类型都应该是 final 的。
3、String 是最基本的数据类型吗? 【天能智健面试题】
【参考答案】
基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。
所以 String 不属于基本数据类型范畴内,但 String 属于最常见一种引用类型。
4、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 【博炎科
技面试题】
【参考答案】
对于 short s1 = 1; s1 = s1 + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结
果是 int 型,再赋值给 short 类型 s1 时,编译器会提示错误,需要强制转换类型。
对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,Java 编译器会对它
进行特殊处理,因此可以正确编译。
【分析】
主要考查几种基本数据类型在运算时的,由低到高会自动转换,而由高到低时会强制转
换。
5、Java 对象初始化顺序?【腾鹏科技面试题】
【参考答案】
分为两种,一种是本类的初始化,一种是含有父类的初始化顺序。这里分开来说,
本类的初始化顺序是:静态变量、静态初始化块、变量、初始化块、构造函数
继承类的初始化顺序是:父类静态变量、父类静态初始化块、子类静态变量、子类静态初
始块、父类变量、父类初始化块、父类构造函数、子类变量、子类初始化块、子类构造函数。
【分析】
static{
System.out.println(“静态块”);
}
{
System.out.println(“初始化模块”); }
public ClassName() {
System.out.println(“构造方法”);
}
说明:
原则上回答全面的话,应该是完整的说出带有继承的这种类的初始化过程,下面有个步骤
可以参考:
1.装载程序的时候首先找到的是它的基(父)类,如果有多层基(父)类则会一级一级的
往上找最后找到根基(父)类。
2.执行根基础(父)类中的 static 初始化,再执行下一个衍生类中的 static,依此类推,一直
保持这个顺序。
3.此时类已经装载完毕,开始创建对象,所有的基本数据类型都会设成它们的默认值,对象
句柄设为 null
4.调用基础(父)类的构造方法,基础(父)类的构建采用与衍生类构造方法完全相同的
处理过程。
5.构造方法初始完之后,进行变量的初始化。
6.执行构造方法中剩余的部分。
6、写几个线程安全类,不安全的,支持排序的类名?【软通动力面试题】
【参考答案】
 线程安全类:Vector 、Hashtable、Stack。
 线程不安全的类:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap
等。
 支持排序的类有 HashSet、LinkedHashSet、TreeSet 等(Set 接口下的实现都支持
排序)
【分析】
此题主要考查集合框架的知识。在集合框架中 Collection 接口为集合的根类型,提供
集合操作的常用 API 方法,该接口下派生出两个子接口,一个是不支持排序的 List 接口,
一个是有自身排序的 Set 接口,所以回答排序与不排序分别从两接口的实现中在作答。线程
安全上来说,Vector 类比同属于 List 接口的 ArrayList 要早,是一个线程安全的类,在
JDK1.2 以后才推出一个异步的 ArrayList 类,比 Vector 类效率高。同理 Stack 继承自 Vector
也线程安全的类,另外在在 Map 接口的实现在 Hashtable 也是个线程安全的类。
7、哪几个方法可以实现一个线程?【上海华信面试题】
【参考答案】
一是继承 Thread ,重写 Thread 类的方法 run 方法;另种是实现 runnable 接口并实
现 run 方法。
【分析】
考查线程的基本实现,很多公司喜欢考查这方面知识,另外补充一下关于线程的 run
方法,在多线程 API 中启动一个线程是调用 start()方法,线程进入就绪状态。
8、STOP()和 SUSPEND()不推荐使用的原因?
【参考答案】
stop()是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用 stop()
方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized
void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证 x,y 被同时赋值,而如果
一个线程正在执行到 x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地 stop 了,
这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的 stop 方法,以后我们再也不要说“停止线程”了。而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。
suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来,但却仍然持有
在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢
复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,
就 会造成死锁。所以不应该使用 suspend(),而应在自己的 Thread 类中置入一个标志,指出
线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志
指出线程应当恢复,则用一个 notify()重新启动线程。
【分析】
9、""和 equals 方法有什么区别?【中科软】
【参考答案】
操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所
存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用
操作
符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用
一块内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是
一个内存,new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对
象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一
个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用
操作符进行
比较。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否
相同,它比较的两个对象是独立的。例如,对于下面的代码:
String

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值