Java程序员面试题(基础篇)(二)

1、自增前置和后置操作符

  • ++i 在程序执行前进行自增
  • i++ 在程序执行完毕后自增

2、String,StringBuilder,StringBuffer 区别

  • String 是不可变类,线程安全的, 对象一旦被创建,字符串的内容将不能被改变。
  • StringBuffer 是可变类,线程安全的,当对象被创建后,仍然可以对字符串的内容进行修改。
  • StringBuilder是可变类,非线程安全的,当对象被创建后,仍然可以对字符串的内容进行修改 。
  • 执行效率:StringBuilder > StringBuffer > String

3、线程中方法

  • wait():使线程暂停执行的方法,如果线程对一个同步对象发出了一个 wait()调用请求,那么该线程会暂停执行,被调对象进入等待状态,直到被唤醒(通常使用 notify()唤醒)或等待时间超时。
  • sleep():使当前运行的线程休眠指定的时间。
  • stop():终止线程的执行,会释放已经锁定的所有的监视资源。
  • suspend():将一个线程挂起(暂停),并且不会自动恢复,必须通过调用对应的resume(),才能使得线程重新进入可执行状态。

4、 Hashtable和HashMap 相同点和区别

相同点:

  • 都是键值对(key-value)形式
  • 都实现了 Map 接口

区别:

  • HashMap允许空(null)键值(key)(注意,最多只允许一条记录的键为null),而Hashtable不允许。
  • Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。
  • Hashtable 的方法是线程安全的,而 HashMap 不是线程安全的。所以效率上HashMap可能高于Hashtable。
  • 由于Hashtable是线程安全的,没有采用快速失败机制;HashMap是非线程安全,迭代HashMap 采用了快速失败机制。
  • 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
  • Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

快速失败(fail-fast)是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,可能会产生 fail-fast事件。例:两个线程(线程1与线程2)当线程1通过 Iterator(迭代器)在遍历集合A中的元素,如果线程2修改了集合A(删除或增加新的元素),这个时程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast事件。

5、变量名、方法名和数组命名规范

  • 只有由字母,数字,下划线和$组成
  • 并且第一个字符只能是 字母,下滑线或$

6、List<? extends T>List<? super T>区别

  • <? extends T>表示类型的上界,参数化的类型可能是 T 或者 T 的子类。
  • <? super T>表示类型的下界,参数化的类型可能是 T 或者 T 的父类。

7、final,finally 和 finalize 有什么区别

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally 是异常处理语句结构的一部分,表示总是执行,try catch finally。
  • finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

8、equals 和==的区别

  • equals 比较引用对象类型内容,对象需要 override 覆写。
  • == 基本类型,比较的是栈内存地址。

9、Java默认序列化如何去做,哪些字段不会被序列化

  • 序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,默认序列化机制。
  • 使用默认机制,在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。所以,如果一个对象包含的成员变量是容器类对象,而这些容器所含有的元素也是容器类对象,那么这个序列化的过程就会较复杂,开销也较大。
  • 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。
  • static和transient字段不能被序列化。

10、Vector、ArrayList和LinkedList 有什么特点

相同点

  • 都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组

不同点

  • ArrayList 是线程序不安全的,它的元素可以通过get/set方法直接访问。
  • Vector 是线程安全的,和ArrayList类似。
  • LinkedList 是线程序不安全的,一个双链表,允许所有元素(包括 null)。在添加和删除元素时具有比ArrayList更好的性能。但在get与set方面弱于ArrayList。当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比。它还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer()、peek()、poll()等。

参考资料 https://zhuanlan.zhihu.com/p/34828859

发表评论