Java集合简单介绍
来源:互联网 发布:氮氧化物历年排放数据 编辑:程序博客网 时间:2024/06/07 06:11
学了这么长时间的Java集合框架了,虽然说细节方面掌握的不是很牢靠,但是具体的使用头脑里还是很清楚,接下来我就分享一下我对Java集合的认识:
话不多说,先上一张图看看:
(1)Collection接口最最基本的集合接口,它提供了多个最基本的方法,供其集合接口使用。Collection接口派生出了两个子接口List接口,Set接口。
(2)List接口实际派生出三个实现类:ArrayList、LinkedList、Vector
这三者共同的特点:允许元素重复,并且能记录元素添加的先后顺序!
ArrayList:本质底层实现是以数组形式,而且添加元素时,数组是可变的,线程不安全;
LinkedList:本质底层实现是以双向链表的形式,而且还实现了Stack、Quene、Deque类,具有栈,队列,双向队列的特点,线程不安全;
Vector:本质上底层也是使用数组的形式来实现,可变,线程安全,每一个方法都使用了synchronized关键字修饰,也是Stack(栈)的父类
(3)Set接口派生出两个实现类:HashSet、TreeSet以及HashSet派生出子类LinkedHashSet类
两者共同特点:不允许元素重复,线程不安全!
HashSet:底层使用哈希表算法,本质上借用了HashMap底层的实现,并且是线程不安全的;
LinkedHashSet:底层使用了哈希表 + 双向链表算法实现,不允许元素重复,但是能够保存元素添加的先后顺序。
话不多说,再来一张图耀耀眼:
(4)Map接口没有继承Collection接口:
Map接口俗称映射,是两个集合之间的关系(key集合,value集合),但是每一个元素Entry(key-value)对形式保存的,只保证key值不重复,value属于附属;所以Entry元素就不会重复,满足Set集合的定义,也就称之为集合!
Map接口派生出两个实现类HashMap、TreeMap以及HashMap派生出子类LinkedHashMap类,最常用为HashMap实现类:
特点:元素不能重复(重复是指key不能重复,value可以),线程不安全!
HashMap:底层使用了哈希表算法,键值对元素不重复,不能保证元素添加的先后顺序,线程不安全;
LinkedHashMap:底层使用了哈希表 + 链表的算法,元素依然不重复,却能保证元素添加的先后顺序,线程不安全!
(5)Collection接口继承了Iterable接口,Collection接口的实现类都可以调用iterator()方法,返回一个实现Iterator接口的实例对象,因此就可以使用Iterator接口提供的for-each增强for循环(for-each本质上底层也是使用了迭代器遍历元素)
注意:如果需要边迭代边删除集合元素,必须要使用迭代器迭代遍历集合元素(而且必须要使用 迭代器 中的remove()方法)
1)当迭代时,在A线程中会单独的创建一个新的B线程,A线程赋值迭代,B线程负责去删除元素;
2)注意:B线程在删除的过程当中,每次会自动检查和A线程中的元素个数是否相同,如果不同,就会报错(并发修改异常)
public static void main(String[] args) {List list = new ArrayList();list.add("A");list.add("B");list.add("C");list.add("D");Iterator it = list.iterator();while(it.hasNext()){Object ele = it.next();if("B".equals(ele)){list.remove(ele);//不能使用集合对象中的remove()方法//it.remove();}}System.out.println(list);}
这样做会出现并发修改异常:
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(Unknown Source)at java.util.ArrayList$Itr.next(Unknown Source)at com.xupt.iterator.ForEachDemo.main(ForEachDemo.java:25)
解决方案:(保证删除迭代器中元素时,同时也要删除集合中的元素)
a) 在Collection接口中存在删除指定元素的方法:boolean remove(Object ele),该方法只能从集合中删除元素,不能从迭代器中指定的元素也删除;
b) 使用Iterator中的remove(Object ele)方法即可解决,该方法会从两个线程中同时移除指定元素,保证了两个线程的同步。
(6)Arrays和Collections工具类:
Arrays这个工具类:主要提供数组中需要操作的一些静态方法,方便数组的数据操作!
主讲一个方法:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
这个方法,会返回一个固定长度的List集合:(注意:这个List集合在Arrays类内部,并且没有和java.util.*关联)
//将数组转换为List对象List<String> list1 = Arrays.asList("A","B","C","D");list1.remove(0);//报错:java.lang.UnsupportedOperationException(不支持操作异常)System.out.println(list1);
这个方法返回的List集合,不能添加、删除数据,否则报错,只能修改!
Collections类是Collection接口的工具类,主要提供了一些静态封装好的方法供其Collection集合实现类去使用!
在Collections工具类中使用这三个方法,实现线程同步:
List list = Collections.synchronizedList(new ArrayList());//返回一个线程安全的ArrayList集合 ...//当要迭代的时候得使用synchronized,因为迭代开启两个线程! synchronized(list) {//锁定当前ArrayList集合的实例对象 Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
常用方法简介:
//使用指定元素替换指定列表中的所有元素
public static <T> void fill(List<? super T> list,T obj)
//将所有元素从一个列表复制到另一个列表。执行此操作后,目标列表中每个已复制元素的索引将等同于源列表中该元素的索引
public static <T> void copy(List<? super T> dest,
List<? extends T> src)
//返回指定 collection 中等于指定对象的元素数
public static int frequency(Collection<?> c,Object o)
//根据元素的自然顺序,返回给定 collection 的最小、最大元素
public static <T> Tmin/max(Collection<? extends T> coll)
//反转指定列表中元素的顺序
public static void reverse(List<?> list)
sort()函数,底层使用了Arrays类中的sort()实现,二路归并算法!
- Java集合简单介绍
- 简单介绍Java集合类
- java关于集合简单介绍
- java 集合框架 简单介绍
- java 集合简单的介绍
- java 集合 容器类 简单介绍
- python集合简单介绍
- 集合的简单介绍
- 【集合】Java集合框架介绍
- JAVA集合类(介绍)
- Java集合Collection介绍
- Java集合介绍1
- Java集合介绍2
- java集合类介绍
- java 集合介绍
- Java集合Collection介绍
- JAVA集合类介绍
- Java集合介绍
- shell 脚本中的命令带换
- JQuery实现内容的显示与隐藏动作循环出现
- u-boot第一阶段分析(三)
- Net Use 命令用法
- 【OpenCV开发】OpenCV3后IPLimage转换成MAT的问题
- Java集合简单介绍
- java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射
- [bigdata-107] node.js的安装并实现一个运营商报告的提交功能
- 全球MCU市场和技术发展趋势
- 基于JAVA代码 获取手机基本信息(本机号码,SDK版本,系统版本,手机型号)
- EventBus 3.0源码学习(二)
- Wireshark抓包iOS入门教程
- 如何加快Gradle的构建速度
- opencv 最小二乘拟合平面