java基础系列——集合总结(7)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java基础系列——集合总结(7)

各集合类对比总结

集(Set):集里的对象不按任何特定的方式排列,按索引值来操作数据,不能有重复的元素 列表(List):序列中的对象以线性方式存储,按索引值来操作数据,可以有重复的元素 映射(Map):映射的每一项为“名称—数值”对,名称不可以重复,值可以重复,一个名称对应一个唯一的值

迭代器Iterator

迭代器是按次序一个一个地获取集合中所有的对象,是访问集合中每个元素的标准机制。 迭代器的创建:Collection接口的iterator()方法返回一个Iterator Iterator it=test.iterator(); //将test集合对象转为迭代器 迭代器的常用方法:

hasNext() //判断迭代器中是否有下一个元素 next() //返回迭代的下一个元素 Remove() //将迭代器新返回的元素删除


public interface Iterator {
    boolean hasNext();

    Object next();

    void remove(); // Optional
}

在调用remove()方法的时候, 必须调用一次next()方法. remove()方法实际上是删除上一个返回的元素.

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之前的一个元素

ArrayList

可以将其看作是能够自动增长容量的数组。 利用ArrayList的toArray()返回一个数组。 Arrays.asList()返回一个列表。 迭代器(Iterator) 给我们提供了一种通用的方式来访问集合中的元素。 ArrayList可以自动扩展容量 ArrayList.ensureCapacity(int minCapacity) 首先得到当前elementData 属性的长度oldCapacity。 然后通过判断oldCapacity和minCapacity参数谁大来决定是否需要扩容, 如果minCapacity大于 oldCapacity,那么我们就对当前的List对象进行扩容。 扩容的的策略为:取(oldCapacity * 3)/2 + 1和minCapacity之间更大的那个。然后使用数组拷 贝的方法,把以前存放的数据转移到新的数组对象中如果minCapacity不大于oldCapacity那么就不进行扩容。

LinkedList

LinkedList是采用双向循环链表实现的。 利用LinkedList可以实现栈(stack)、队列(queue)、双向队列(double-ended queue )。 它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等。

ArrayList和LinkedList的比较

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 尽量避免同时遍历和删除集合。因为这会改变集合的大小;


for( Iterator&lt;ComType&gt; iter = ComList.iterator(); iter.hasNext();){<!-- -->
    ComType com = iter.next();
    if ( !com.getName().contains("abc")){
        ComList.remove(com);}
}

推荐:


for( Iterator&lt;ComType&gt; iter = ComList.iterator(); iter.hasNext();){<!-- -->
ComType com = iter.next();
if ( !com.getName().contains("abc")){
iter.remove(com); }

无限制的在lst中add element,势必会造成lst占用内存过高

Map常用方法

常用方法:

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具有同步的能力,或者使用ConcurrentHashMap 使用HashMap ,当一个对象被当作键值需要对equals()和hashCode()同时覆写

LinkedHashMap和HashMap,TreeMap对比

Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。 TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。 我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,在Map 中插入、删除和定位元素,HashMap 是最好的选择。 TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。 LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

Set的使用

不允许重复元素 对 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()。 HashSet如何过滤重复元素 调用元素HashCode获得哈希码–》判断哈希码是否相等,不相等则录入—》相等则判断equals()后是否相等,不相等在进行hashcode录入,相等不录入

TreeSet

TreeSet是依靠TreeMap来实现的。 TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口,我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。

HashSet与TreeSet与LinkedHashSet对比

HashSet不能保证元素的排列顺序,顺序有可能发生变化,不是同步的,集合元素可以是null,但只能放入一个null TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。 TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0 自然排序 自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。 定制排序 自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(To1,To2)方法 LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。 LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

原文地址:https://sihai.blog.csdn.net/article/details/79999112

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java基础系列——集合总结(7)


 上一篇
java基础系列——集合总结(6) java基础系列——集合总结(6)
排序和搜索数组Arrays类为所有基本数据类型的数组提供了一个过载的 sort()和 binarySearch(),它们亦可用于 String 和Object。 public class Array1 { static Rand
2021-04-04
下一篇 
java基础系列——集合入门 java基础系列——集合入门
集合框架:Java中的集合框架大类可分为Collection和Map;两者的区别: Collection是单列集合;Map是双列集合- Collection中只有Set系列要求元素唯一;Map中键需要唯一,值可以重复- Collectio
2021-04-04