浅谈集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈集合相关的知识,希望对你有一定的参考价值。

1.集合和数组的区别

  集合:长度可变,可以存放不同类型的元素,只能存放引用类型
  数组:长度固定,只可以存放相同的同种类型的元素,可以存放数据类型也可以存放引用类型

2.java工具类  如下图:

.技术分享技术分享

3.List、Set、Map是这个集合体系中最主要的三个接口。List和Set继承自Collection接口。 Map也属于集合系统,但和Collection接口不同。

1.Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。Set只能通过游标来取值,并且值是不能重复的。
2.List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。ArrayList 是线程不安全的, Vector 是线程安全的,这两
   个类底层都是由数组实现的 LinkedList 是线程不安全的,底层是由链表实现的
3.Map 是键值对集合,其中key列就是一个集合,key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是Map的三个主要的实现类。
   HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 值

4..Collection 集合接口(没有获取元素的方法,在其子类中有)(主要说上图带有红框的部分)

Collection中的存放的数值可以重复,有序

List 和 Set接口继承Collection接口,

LIst接口可以由Vector,ArrayList,LinkedLIst实现

Set接口可以由HashSet,SortedSet实现

  • Collection 中的主要方法有(前者为返回值类型,后面是方法)(红色的为重要的方法)

  1. boolean add(Object element):向此collection中添加元素

  2. Int size():返回此collection中的元素个数(或者是集合的长度)

  3. boolean isEmpty():判断此collection中是否包含元素

  4. boolean contains(Object obj):判断此collection是否包含指定的元素

  5. boolean containsAll(Collection c):判断此collection是否包含指定collection中的所有元素

  6. boolean addAll(Collection c):将指定collection中的所有元素添加到此collection中

  7. boolean remove(Object element):从此collection中移除指定的元素(第一个与之匹配的数值)

  8. boolean removeAll(Collection c):移除此collection中包含在指定collection中的所有元素

  9. void clear():移除collection中所有的元素

  10. boolean retainAll(Collection c); 仅保留此collection中和指定collection的交集元素

  11. Iterator iterator():返回此collection元素的迭代器

  12. Object[] toArray():把此collection转成数组

  • List集合的主要方法(Collection接口中存在的方法,list接口可调用)还额外扩充了一些常用方法:

  1. Object get(int index) 获取指定位置索引的元素

  2. void add(int index, Object element);在指定位置插入指定元素,其他元素依次后移

  3. Object set(int index, Object element) 用指定元素替换指定位置的元素

  4. List subList(int fromIndex, int toIndex) 返回列表中指定的fromIndex(包括 )和 toIndex(不包括)之间的部分列表

  5. int indexOf(Object o) 根据元素获得索引;如果此列表不包含该元素,则返回 -1。(从左到右的第一个元素)

  6. int lastIndexOf(Object o)根据元素获得索引;如果此列表不包含该元素,则返回 -1。(从右到坐的第一个元素)
  • ArrayList是List接口的实现类,底层使用数组结构实现(调用的方法可以在List中找)在这里说Arraylist的三种遍历方式

  • 先创建一个集合

技术分享

  1. 使用索引遍历

技术分享

         2.使用Object类型的遍历

          技术分享

         3.迭代器遍历

         //hasNext()判断是否有下一个元素

        //next()获取下一个元素

技术分享

ArrayList排序

想要实现排序,集合中所存放的数据类型
这个类必须实现compareto接口(重写compareto方法)

在Java中数组排序的方法是java.util.Arrays.sort(数组)

 

  • LinkedList是List接口的另一个常用实现类,底层使用双向链表实现

  • LinkedList除了实现List接口外,还实现了Queue接口,并提供了对列表开头、结尾操作的方法,使得LinkedList具有栈、队列的双重特点。

  • 栈:后进先出,LastInFirstOut,LIFO

  • 入栈  push()(添加元素);出栈 pop()(删除栈顶元素)(弹栈);
  • 队列:后进后出,LastInLastOut,LILO

  • 入队 offer()(添加元素);  出队poll()(删除队首元素);
  1. add() 添加元素        addLast()在此时的队尾添加元素         addfirst() 在此时的队首添加元素
  2. offerLast() 在此时的队尾添加元素
  3. get(int index):返回此列表中指定位置处的元素    getFirst():返回此列表的第一个元素          getLast():返回此列表的最后一个元素
  4. peek():获取但不移除此列表的头(第一个元素)
  5. peekFirst():获取但不移除此列表的第一个元素    peekLast():获取但不移除此列表的最后一个元素
  6. pollFirst():获取并移除此列表的第一个元素      pollLast():获取并移除此列表的最后一个元素

 ArrayList和LinkedList对比
 1.查找元素时,ArrayList效率高
 2.进行插入和删除元素时,LinkedList效率高

5.Set接口:set中存放的元素是无序的(存放顺序)无重复数据 无获取索引的方法

Set接口常用实现类:

HashSet:  不记录添加数据的顺序,且加入的元素不能重复,否则覆盖。(基于哈希散列,Set存、取、删 都有较高的效率

           加入HashSet集合的自定义类型的对象通常需要重写hashCode()和equals()方法。通过hashcode()获取到任何一个对象的哈希码值

           hashCode()用于判断是否是同一类型的,equals()标记,根据哪个属性排序

TreeSet  同样不记录添加数据的顺序,但是可以对存入的元素进行排序(基于红黑树实现),输出也会按照排序后的顺序 (排好序的)

LinkedHashSet  根据元素的哈希码进行存放,同时用链表记录元素的插入顺序(有序的:存取数据的位置无变化)

 

set常用的方法:

add()添加

remove()删除

clear()清空

6.Map接口:Map接口用来存储“键-值”映射对

Map中存储的“键-值”映射对是通过键来唯一标识,Map的“键”底层采用Set来存放。 因此,存入Map中的“键”如果是自定义类,应该重写hashCode()和equals()方法,确保键的唯一 常用String作为Map的"键"。

1.常用的方法

put(K key, V value):将指定的"键-值"对存入Map中

get(Object key):返回指定键所映射的值

int size():获得此Map中"键-值"对的数量

remove(Object key):根据指定的键把"键-值"对从Map中移除

*boolean containsKey(Object key):判断Map是否包含指定的键

*boolean containsValue(Object value):判断此Map是否包含指定的值

boolean isEmpty():判断此Map中是否有元素

void clear():清空Map中的所有"键-值"对

Set<K> keySet():返回此Map中包含的键的Set集合。

Collection<V> values():返回Map中包含值的Collection集合

replace(Object key,Object values)替代指定key值得values值

2.HashMap内部对“键”使用Set进行散列存放。因此,根据“键”取“值”的效率较高,也是Map接口使用频率较高的一个实现类。

   ①通过key值  获得value值

获取集合中所有key值(get)

技术分享

用foreach语句循环遍历key值    得到value值

技术分享 

②获取集合总所有value值

技术分享

③获取map集合中成对的数据

 技术分享

Map.Entry是Map内部定义的一个static接口,专门用来保存key-value对的内容。

通过entrySet()方法取到Entry对象,然后使用getKey(),getValue()获取键、值 一般情况下,map多用于存放、查找数据,遍历输出的情况较少。

3.TreeMap

TreeMap内部使用红黑树结构对“key”进行排序存放,所以放入TreeMap中的“key-value”对的“key”必须是“可排序”的

4.区别

 

HashMap的键采取哈希值存储,不记录元素插入的位置,也不排序

TreeMap的键采取红黑树存储,不记录元素插入的位置,但是可以排序

LinkedHashMap的键采取哈希值存储,并使用链表记录元素插入的位置,不排序

5.选择使用集合

存放要求
无序,无下标,不可重复,不能随机访问-Set
有序,有下标,可重复,可以随机访问-List
“key-value”对,较多存放,较少遍历-Map
读和改(插入删除)的效率
Hash-两者都较高
ArrayList-读(指定下标随机访问)快,插入/删除元素慢
LinkedList-读(指定下标随机访问)慢,插入/删除元素快

 

//^_^本人新人,以上是上课记得笔记和自己的理解,如有异议,欢迎一起讨论
















以上是关于浅谈集合的主要内容,如果未能解决你的问题,请参考以下文章

浅谈集合

浅谈集合与引用

浅谈JAVA集合框架

编程基础系列--之--浅谈ListSetMap和泛型——单列集合

浅谈Java集合(底层源码解析)

浅谈Java集合丨底层源码解析