Java集合总结

Java集合


集合简介:

1.定义:一系列储存数据的接口和类,位于Java.until包中。
2.作用:可以解决复杂数据问题,任何一个集合可以储存不同类型的数据且长度动态可变。



java集合结构:

这里写图片描述

图片引用自百度


Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。
Set中不能包含重复的元素。
List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
:集合的使用都直接或间接的实现了Collection、Map接口或者其他子接口。


Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。


Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。


Java集合分类:
  1. 数组
  2. List
  3. Set
  4. Map
  5. Queue
  6. 工具类


List :有序,可重复
ArrayList 动态数组,查询快、增删慢,初始大小为10
LinkedList 双向链表、增删快、查询慢
Vector线程安全、动态数组
Stack 栈,先进后出
CopyOnWriteArrayList CopyOnWriteArrayList是ArrayList的线程安全的变体

Vector和ArrayList区别
1,vector是 线程同步,线程安全,arraylist是线程异步,不安全的。一般用arraylist效率比较高(不管线程安全)。
2,vector增长率为目前数组长度的100%,arraylist增长率为目前数组长度的50%。
3. Java官方不建议使用Stack、Vector

需要并发编程,自 Java 5 以后,也推荐使用 java.util.concurrent 包


Arraylist和linkedlist
1.数据结构ArrayList底层是动态数组,LinkedList底层是链表。
2.查询 :ArrayList优于LinkedList
3.增删 :LinkedList优于ArrayList


Set :元素无序,不可重复
EnumSet 枚举类型专用Set,所有元素都是枚举类型。
HashSet以哈希码决定元素位置的set、不允许存放重复元素、存储元素的方式是散列存储,即存储是无序的。
LinkedHashSet使用链表维护集合元素中元素的顺序。遍历时是按照先进先出的顺序进行遍历;插入性能略低于HashSet,但是在迭代访问中仍具有很好的性能。
TreeSet有序;插入时会自动排序的set、若中途修改元素大小,不会重新排序,只会在插入时排序(TreeSet是SortedSet接口的唯一实现类)

Map:键值对、键唯一、值不唯一
:Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
TreeMap 自动排序map,根据key值自动排序
HashMapkey的哈希码决定元素位置,需要保证key的哈希码不一致,如果碰到值不同但哈希码相同的key,会以单向链表的方式扩展
HashTable线程安全的HashMap
ConcurrentHashMap线程安全,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行
LinkedHashMapLinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。
Properties 继承自HashTable,从可以从Property文件中加载数据,其读写操作更加方便
EnumMap Key值必须是Enum

HashMap与TreeMap
1、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
2、插入、删除和定位元素时,HashMap是较好的选择。但是需要按自然顺序或自定义的顺序遍历键,那么TreeMap会更好。并且HashMap使用中要求明确定义hashCode()和 equals()的实现。
两个map中的元素一样,但顺序不一样,导致hashCode()不一样。
对于测试:
在HashMap中,同样的值的map,顺序不同,equals时,false;
而在treeMap中,同样的值的map,顺序不同,equals时,true,代表着treeMap在equals()时是整理了顺序了的。


阻塞式队列:队满后,插入元素抛出异常;
ArrayBlockingQueue以数组方式实现 单端队列(一边进一边出)
PriorityBlockingQueue优先级组件的队列 单端队列
LinkedBlockingQueue通过链表实现的队列 单端队列
非阻塞队列可以持续追加 (内存允许)
PriorityQueue双端队列,支持在头尾两端插入和移除元素

数组工具类

  1. java.util.Arrays
  2. java.lang.reflect.Array :反射中的Array

集合工具类

  • java.util.Collections

Iterator

Iterator和ListIterator :

  1. ListIterator继承自Iterator接口,然后添加了一些额外的功能
    Iterator 方法:
  2. 通过Iterator的next()方法返回第一个元素(使用容器的iterator()方法获得一个Iterator)。
  3. 使用Iterator()的hasNext()方法判断容器中是否还有元素。
  4. 可以通过remove()方法删除迭代器返回的元素。
    ListIterator 方法:
  5. ListIterator它不仅可以向后迭代,它还可以向前迭代。
  6. ListIterator相对Iterator增加了如下3个方法:
  7. boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。
  8. Object previous():返回该迭代器的上一个元素。

Iterator(集合迭代器:一个接口):迭代集合的迭代器。主要就2个方法:
1、返回boolean类型的hasNext()方法,解释——判断集合中是否有数据实例。
2、返回object类型的next()方法,解释——通过迭代集合得到集合中的数据实例。


Enumeration和Iterator的区别

  1. Enumeration出现的比Iterator早,JDK1.0出现而Iterator在JDK1.2发布
  2. Iterator 可代替Enumeration
  3. Iterator有fail-fast机制
  4. Enumeration的内存占用相对较少、效率更高,而Iterator更加的安全

JAVA中Collection和Collections的区别
1.java.util.Collection 是一个集合接口。 它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现
2.java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。不可实例化,工具类,为Java的Collection框架提供服务。

Collections中的sort方法:
很常用的方法

下面的代码摘自Collections类中源码

 public static <T extends Comparable<? super T>> void sort(List<T> list) {
        Object[] a = list.toArray();
        Arrays.sort(a);
        ListIterator<T> i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set((T)a[j]);
        }
    }

按照需求选择所需的集合类型:

引用一张百度上比较好的图

引用自百度


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值