1.List接口下都有哪些集合,他们各自有什么特点
ArrayList:底层的数据结构使用的是数组结构;特点:查找快,但增加删除慢。
LinkedList:底层使用的是链表数据结构;特点:增删速度快,但是查找修改慢。
Vector:底层是数组结构,和ArraysList功能一样,但是Vector是同步的,ArraysList是不同步。被ArrayList替代。
2.Set接口下的集合是如何保证无序不可重复的
Set是一个接口,常用的Set实现类那就是HashSet了。
-------------------------------------------------
public HashSet() {
map = new HashMap<E,Object>();
}
-------------------------------------------------
这是HashSet的构造方法。 可以看到HashSet内部其实就是一个HashMap 。
因为HashMap在put一个Key时会判断,将要放进去的Key的hash值与目前HashMap中定位到的那个Key的hash值比较。
如果hash值相当,继续比较 这两个对象的地址或者内容是否相当。
如果相当:判断出来要添加的Key与HashMap中的Key重复,把Value的值给替换成最新的。
HashSet中的Value是一个固定值PRESENT。 所以修改不修改无所谓。
3.我们为什么要重写HashCode( )和equals()方法?
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;
我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。
继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。
4.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
就跟之前题目提到的为什么重写hashCode和equals里面说到的,hashCode的重写保证了元素的唯一性,而hashCode的值是int类型,数值比较的运算速度远远快于内容的比较速度,越是优秀的算法,哈希碰撞的概率越小,这样就大大减少了equals的使用次数,执行效率 就大大提高了。
5.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。 Compatator使用的多,因为可以实现自己想要的排序的排序方法,而Comparable,只有自一种然比较方法,不能满足我们不同的排序需求。
|