Java面试题(二)

1、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

两种实现方式    

①继承于Thread类:有一个缺点就是单继承,如果继承Thread类,就必须产生多个Runnable实例对象,然后再用Thread产生多个线程。     

②实现Runnable接口:实现Runnable接口可以实现多继承,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。即实现了资源的共享性。

不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。

两种同步方法     ①同步代码块:同步块就是直接写:synchronized (这里写需要同步的对象){...}  

②同步方法:在方法返回类型后面加上synchronized,比如:public void synchronized add(){...}

2、在Java中,break、continue的区别?

①break 语句可用于跳出循环,break所在的循环体已经结束

②continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代,continue所在的循环体并没有结束。

3、String和StringBuilder、StringBuffer的区别?

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

StringBuffer类的对象则代表一个字符序列可变的字符串,当一个StringBuffer对象被创建以后,通过StringBuffer类提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

4、HashMap与HashTable的区别?

HashMap和HashTable都实现了Map接口。主要的区别有:线程安全性,同步(synchronization),以及速度。

①HashMap几乎可以等价于HashTable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而HashTable则不行)。

②HashMap是非synchronized,而HashTable是synchronized,这意味着HashTable是线程安全的,多个线程可以共享一个HashTable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。

③HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

       ---fail-fast迭代器:直接在容器上进行遍历,在遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出 ConcurrentModificationException异常导致遍历失败。常见的的使用fail-fast方式遍历的容器有HashMap和ArrayList等。

       ---fail-safe迭代器:fail-safe允许在遍历的过程中对容器中的数据进行修改,这种遍历基于容器的一个克隆。因此,对容器内容的修改不影响遍历。常见的的使用fail-safe方式遍历的容器有ConcerrentHashMap和CopyOnWriteArrayList等。

④由于HashTable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过HashtTable。

⑤HashMap不能保证随着时间的推移Map中的元素次序是不变的。

5、区分Collection和Collections?

①Collection是集合体系的最顶层,包含了集合体系的共性,继承与他的接口主要有Set 和List。

②Collections是一个工具类,方法都是用于操作Collection

6、int 和 Integer 有什么区别?

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

原始类型封装类:boolean-Boolean、char-Character、byte-Byte、short-Short、int-Integer、long-Long、float-Float、double-Double

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

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

8、说出ArrayList,Vector, LinkedList的存储性能和特性。

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差。

LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
 

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

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

10、error和exception有什么区别?

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

Java面试题(一)

Java面试题(二)

Java面试题(三)

Java面试题(四)

Java面试题(五)

Java面试题(六)

Java面试题(七)—— 线程

Java面试题(八)—— 泛型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值