Java集合

JAVA集合小结

允许元素重复否

有序否

 

Collection

List

Set

AbstractSet

HashSet

TreeSet

是(用二叉树排序)

Map

AbstractMap

使用key-value来映射和存储数据,Key必须惟一,value可以重复

HashMap

TreeMap

是(用二叉树排序)



几个面试常见问题:
1.Q:ArrayListVector有什么区别?HashMapHashTable有什么区别?
   A:VectorHashTable是线程同步的(synchronized)。性能上,ArrayListHashMap分别比VectorHashtable要好。

2.Q:大致讲解java集合的体系结构
   A:ListSetMap是这个集合体系中最主要的三个接口。
      其中ListSet继承自Collection接口。
      Set不允许元素重复。HashSetTreeSet是两个主要的实现类。
      List有序且允许元素重复。ArrayListLinkedListVector是三个主要的实现类。
      Map也属于集合系统,但和Collection接口不同。Mapkeyvalue的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMapTreeMapHashtable是三个主要的实现类。
      SortedSetSortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

3.QComparableComparator区别
    A:调用java.util.Collections.sort(List list)方法来进行排序的时候,List内的Object都必须实现了Comparable接口。
        java.util.Collections.sort(List listComparator c),可以临时声明一个Comparator 来实现排序。
        Collections.sort(imageList, new Comparator() {
             public int compare(Object a, Object b) {
                 int orderA = Integer.parseInt( ( (Image) a).getSequence());
                 int orderB = Integer.parseInt( ( (Image) b).getSequence());
                 return orderA - orderB;
            }
         });
         如果需要改变排列顺序
        改成return orderb - orderA 即可。

4.Q:简述equals()hashCode()
1.Object类的public boolean equals(Object obj)方法是通过 return this == obj;这种方式比较两个对象是否相同。这里比较的是引用。
2.Object类的public int hashCode()方法,是通过该实例地址转换为int值。所以不同的Object实例在同一运行期hashCode一定不相同。

以上两点是针对Object类本身说的,但是不同的子类会重写这两个方法,满足他们各自的比较特性,比如众所周知的String中equals()方法就是比较内容,而不是比较this == obj。相同的,String对象的hashCode也不是内存地址的反应,而是通过对String的value计算得到一个int值来做hashCode()结果。

所以每个类都可以分别将equals和hashCode两个方法重写。但是一般都是一起重写,使其基于同样的比较方法,就像上面String那样。这是出于一种协定,因为很多情况下,从提高效率角度出发,比较两个对象时候,hashCode会优先于equals方法,这个可以看JDK源代码中HashMap的put(K,V)方法。源码中,首先比较K的hashCode然后再比较equals。说明JDK协定:如果hashCode不相同,那么两个对象一定不相同;如果hashCode相同,那么两个对象还得通过equals来比较(另外hibernate里面好像也有类似的机制来比较Entity Bean,但是说实话我不太了解详细情况,这里不敢多讲哈)。我想,这恐怕就是指导大家每次同时重写两个方法的原则吧。
public interface
Collection 
             extends Iterable

 public interface
List
             extends Collection


 public abstract class
AbstractList 
             extends AbstractCollection
             implements List

 public class
Vector 
             extends AbstractList
             implements List, 
                                   RandomAccess, 
                                   java.lang.Cloneable, 
                                   java.io.Serializable
基于Array
sychronized

public class 
ArrayList 
         extends AbstractList
         implements List, 
                           RandomAccess, 
                           Cloneable, 
                           java.io.Serializable
基于Array
ArrayList非同步的。所以在性能上要比Vector优越一些

public class 
LinkedList
         extends AbstractSequentialList
         implements List
                           Queue
                           Cloneable
                           java.io.Serializable
不基于Array

基于ArrayListVectorArrayList)适合查询,而LinkedList(链表)适合添加,删除操作

List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是SetList的根本区别
public abstract class AbstractSet 
     extends AbstractCollection 
     implements Set

 public class HashSet
     extends AbstractSet
     implements SetCloneable, java.io.Serializable
HashSet的存储方式是把HashMap中的Key作为Set的对应存储项

public class LinkedHashSet
     extends HashSet
     implements SetCloneable, java.io.Serializable

 public class TreeSet
     extends AbstractSet
     implements SortedSetCloneable, java.io.Serializable
它是通过SortedMap来实现的


public interface Map<K,V>
 public abstract class AbstractMap<K,V> 
     implements Map<K,V>

 public class HashMap<K,V>
     extends AbstractMap<K,V>
     implements Map<K,V>, CloneableSerializable

public class TreeMap<K,V>
     extends AbstractMap<K,V>
     implements SortedMap<K,V>, Cloneable, java.io.Serializable

HashMap通过hascode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMapHashMap中元素的排列顺序是不固定的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值