1. ArrayList、Vector和LinkedList的区别
list是有序集合,一共有三个实现类:ArrayList、Vector、LinkedList
(1). ArrayList
基于数组实现,增删慢、查询较快,线程非安全
该集合提供了增加(add)、删除(remove)和访问(get)功能,ArrayList必须是连续存储,执行中间插入或者删除时,插入或者删除的节点后的元素进行移动,所以不适合增删操作,查询和遍历是更合适的。ArrayList定义时不需要指定数组长度,当数组的长度超出存储长度时,ArrayList会创建一个新的更大的数组,并且将数组中的数据复制到这个更大的数组中。
(2). Vector
基于数组实现,增删慢、查询快,线程安全
Vector支持线程同步性,只允许一个线程进行操作,保证多线程环境下数据能够保持一致性,再次过程中需要不断的对Vector进行添加锁或者释放锁的操作,因此效率较ArrayList低一些。
(3). LinkedList
基于双链表实现,增删快、查询慢,线程非安全
执行查询操作时,需要从链表头部一致遍历到所查询的节点为止,所以访问效率慢一些,LinkedList可以操作头部和尾部,有时可以当作堆和栈使用。
2. 解释Set集合
Set集合的特性是独一无二的,适合存储没有顺序且值不相等的元素,Java会根据对象的内存地址计算出对象的HashCode值。判断两个元素是否相等,必须同时覆盖hashcode方法和equals方法,而且hashcode和equals方法的返回值必须相同。
3. HashSet的原理
HashSet存放的哈希值,元素的哈希值是通过元素的hashcode方法计算得到的,HashSet先判断两个元素的哈希值是否相等,如果为true,在通过equals方法比较,equals方法返回的值也为true,HashSet就会认为两个为同一个元素,equals方法为false,就视为不同的元素。
4. TreeSet是如何比较元素的
TreeSet基于二叉树实现的,根据添加的对象按照指定的顺序排序,每添加一个对象都会进行排序,并存入二叉树中,Integer和String等基础类型可以根据TreeSet的默认排序进行存储,自定义的数据类型必须实现Comparable接口,并覆盖compareTo函数才可以进行顺序存储,其中,覆写compareTo函数,则在this.对象小于指定对象的条件下返回-1,大于返回1,等于返回0。