Java基础总结

Aug 13, 2016


一、java中有哪些类是线程安全的,哪些类是线程非安全的。

这个问题是java面试中,经常问到的一道题,回忆一下,好像自己刷题的时候用到的所有容器类都是线程非安全的。。。

线程安全的类包括: StringBuffer、Vector、Stack、HashTable。 说明一下,其中Vector和Hash已经常用了,需要保证线程安全的时候一般都会用java并发工具包(java.util.concurrent)下面的容器替代。 线程非安全的类,一般都会在文档中特别注明。

线程非安全类包括 StringBuilder、ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet、HashMap、TreeMap、LinkedHashMap

List接口的实现类: LinkedList、ArrayList、Vector、Stack

Set接口的实现类: HashSet、TreeSet、LinkedHashSet

Map接口的实现类: HashMap、TreeMap、HashTable、LinkedHashMap

二、TreeMap和TreeSet的使用场景

TreeMap和TreeSet都是基于二叉搜索树(BST)的,所有要求泛型对象必须实现了comparable接口或者在构造时传入了comparator比较器。 而基于hash的HashMap和HashSet都是利用equals方法进行比较的,所有对象都有的内置方法,所有不需要特殊处理。

在效率上,肯定是hash的查找效率更高,为常数时间。但是tree结构更适合排序较多的场合。

三、关于linkedHashMap和LinkedHashSet

LinkedHashMap可以选择排列方式,默认的参数为false,表示按照插入顺序进行排列,遍历时也是按照插入的先后顺序进行遍历的。当传入的参数为true时,key的排列方式为哪个最后访问(插入或者更新),哪个就排在前面。这个时候就不能用迭代器进行遍历了。

LinkedHashSet是按照插入方式进行排列的。

注意:当按照插入方式进行排列时,如果set中已经存在某个value,或者map中已经存在某个key,重新插入并不会更改其排列顺序。

四、关于值类型和引用类型

对于java的基本类型(int long double char boolean byte) ‘==’ 符号比较的是值。 对于引用类型 ‘==’ 符号比较的是引用值,即是否是同一个对象。

五、关于对象的equals方法和hashCode方法

为了弄清这个问题,先来看一下Object规范: 1、在应用程序执行期间,只要对象的equals方法比较操作用到的信息没有被修改,那么对于同一个对象的多次调用,hashCode方法都必须始终如一的返回同一个整数。在同一个程序多次执行的过程中,每次执行返回的结果可以不同。

2、如果两个对象的equals方法比较是相等的,那么调用者两个对象的hashCode方法,必须返回同样的整数。

3、如果两个对象根据equals方法比较是不相等的,那么调用还是hashCode方法,可以返回相同的整数,但是不一样的整数可以提高散列表(hash表)性能。

六、设计一个新的对象,如果有可能用到toString方法,记得始终要覆盖toString方法。

对象默认的toString方法返回值为完整类名(包名+类名)+@+32位散列值的16进制表示。

七、关于Integer类数值小于128比较时自动解包

这算是一个细节问题了,不知道很正常,而且实际意义不大。重点是要记住,比较Integer类时,一定先解包,能用基本类型的时候,就用基本类型,不要用对应的打包类型。