关于集合 - summary

xiaoxiao2021-02-28  83

java中有好多集合:List,ArrayList,Vector,HashSet TreeSet

1. Set接口也是Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。而TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要在 每分别重复定义相同的排序算法,只要实现Comparator接口即可。集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、 复制、查找和填充等一些非常有用的方法,Arrays则是对一个数组进行类似的操作。 Set-->无序集合,元素不可重复EnumSet-->SortedSet->TreeSet   -->HashSet->linkedHashset List-->有序集合,元素可以重复linkedList-->ArrayList-->Vector

Queue队列-->deque-->PricrityQueue

Set集合的方法与Collection基本上完全一样,它没有提供额外的方法。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。 Set判断两个对象是否相同是根据equals方法。也就是说,只要两个对象用equals方法方法比较返回false,Set就会接受这两个对象。  1.HashSet是Set的典型实现,HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。    特点:不能保证元素的排列顺序;不是同步的,不是线程安全;集合值可以是null。    HashSet集合判断两个元素的相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等。

Set:扩展Collection接口

不允许重复元素 对 add()、equals() 和 hashCode() 方法添加了限制 HashSet和TreeSet是Set的实现 Set—》hashSet linkedHashSet SortedSet —》 TreeSet HashSet常用方法: public boolean contains(Object o) :如果set包含指定元素,返回true public Iterator iterator()返回set中元素的迭代器 public Object[] toArray() :返回包含set中所有元素的数组public Object[] toArray(Object[] a) :返回包含set中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型 public boolean add(Object o) :如果set中不存在指定元素,则向set加入 public boolean remove(Object o) :如果set中存在指定元素,则从set中删除 public boolean removeAll(Collection c) :如果set包含指定集合,则从set中删除指定集合的所有元素 public boolean containsAll(Collection c) :如果set包含指定集合的所有元素,返回true。如果指定集合也是一个set,只有是当前set的子集时,方法返回true 实现Set接口的HashSet,依靠HashMap来实现的。 我们应该为要存放到散列表的各个对象定义hashCode()和equals()。 如何达到不能存在重复元素的目的? “键”就是我们要存入的对象,“值”则是一个常量。这样可以确保,我们所需要的存储的信息 之是“键”。而“键”在Map中是不能重复的,这就保证了我们存入Set中的所有的元素都不重复。 HashSet如何过滤重复元素 调用元素HashCode获得哈希码--》判断哈希码是否相等,不相等则录入 ---》相等则判断equals()后是否相等,不相等在进行 hashcode录入,相等不录入 TreeSet: TreeSet是依靠TreeMap来实现的。 TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口 我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。 几种Set的比较: HashSet外部无序地遍历成员。 成员可为任意Object子类的对象,但如果覆盖了equals方法,同 时注意修改hashCode方法。 TreeSet外部有序地遍历成员; 附加实现了SortedSet, 支持子集等要求顺序的操作 成员要求实现Comparable接口,或者使用Comparator构造 TreeSet。成员一般为同一类型。 LinkedHashSet外部按成员的插入顺序遍历成员 成员与HashSet成员类似 HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。 HashSet的元素存放顺序和我们添加进去时候的顺序没有任何关系,而LinkedHashSet 则保持元素的添加顺序。TreeSet则是对我们的Set中的元素进行排序存放。

一般来说,当您要从集合中以有序的方式抽取元素时,TreeSet 实现就会有用处。为了能顺利进行,添加到 TreeSet 的元素必须是可排序的。 而您同样需要对添加到TreeSet中的类对象实现 Comparable 接口的支持。一般说来,先把元素添加到 HashSet,再把集合转换为 TreeSet 来进行有序遍历会更快。

2.list接口:

理解: List和Set接口都是Collection接口的子接口 1. List接口是Collection接口的子接口。List里面存放的元素是有序的,允许重复。常用的实现类有:Vector,ArrayList和LinkedList类。 List接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出 它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择 。前面说的Iterator只能对容器进行向前遍历,而ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法。 List常用方法: void add(int index, Object element) :添加对象element到位置index上 boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素 Object get(int index) :取出下标为index的位置的元素 int indexOf(Object element) :查找对象element 在List中第一次出现的位置 int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置 Object remove(int index) :删除index位置上的元素 ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex

List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素

Map接口:

集合框架的第二类接口树。 它提供了一组键值的映射。其中存储的每个对象都有一个相应的关键字(key),关键字决定了对象在Map中的存储位置。

关键字应该是唯一的,每个key 只能映射一个value。

3.Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复 ,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性 很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意 多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现:HashMap和 TreeMap。HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围 以取得其子Map。键和值的关联很简单,用pub(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

常用方法: Object put(Object key,Object value):用来存放一个键-值对Map中 Object remove(Object key):根据key(键),移除键-值对,并将值返回 void putAll(Map mapping) :将另外一个Map中的元素存入当前的Map中 void clear() :清空当前Map中的元素 Object get(Object key) :根据key(键)取得对应的值 boolean containsKey(Object key) :判断Map中是否存在某键(key) boolean containsValue(Object value):判断Map中是否存在某值(value) public Set keySet() :返回所有的键(key),并使用Set容器存放 public Collection values() :返回所有的值(Value),并使用Collection存放 public Set entrySet() :返回一个实现 Map.Entry 接口的元素 Set HashMap: Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许重复,但允许值重复。 HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null; HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。 HashMap实现原理---散列 Hash哈希算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系。散列表又称为哈希表。散列表算法的基本思想是:以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中地址。 当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除。在Java语言中,通过负载因子(load factor)来决定何时对散列表进行再散列。例如:如果负载因子0.75,当散列表中已经有75%位置已经放满,那么将进行再散列。

负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间越长。负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多。

HashMap的存入顺序和输出顺序无关。 LinkedHashMap 则保留了键值对的存入顺序。 TreeMap则是对Map中的元素进行排序。 因为HashMap和LinkedHashMap 存储数据的速度比直接使用TreeMap 要快,存取效率要高。 当完成了所有的元素的存放后,我们再对整个的Map中的元素进行排序。这样可以提高整个程序的运行的效率,缩短执行时间。 注意:TreeMap中是根据键(Key)进行排序的。而如果我们要使用TreeMap来进行正常的排序的话,Key 中存放的对象必须实现Comparable 接口。  

转载请注明原文地址: https://www.6miu.com/read-44650.html

最新回复(0)