集合特点:
1.集合用于存储对象的容器,对象是用来封装数据,对象多了也需要存储集中式管理
2.和数组对比对象的大小不确定。因为集合是可变长度的。数组需要提前定义大小
集合和数组的区别:
1.数组是固定长度的;集合可变长度的。
2.数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
3. 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
常用的集合类:
Map接口和
Collection接口是所有集合框架的父接口:
1. Collection接口的子接口包括:Set
接口和
List
接口
2. Map接口的实现类主要有:HashMap
、
TreeMap
、
Hashtable
、
ConcurrentHashMap
3. Set接口的实现类主要有:HashSet
、
TreeSet
、
LinkedHashSet
等
4. List接口的实现类主要有:ArrayList
、
LinkedList
、
Stack
以及
Vector
等
安全的集合类:
Vector:就比
Arraylist
多了个
synchronized
(线程安全),因为效率较低,现在已经不太建议使用。
hashTable:就比
hashMap
多了个
synchronized (
线程安全
)
,不建议使用。
ConcurrentHashMap:是
Java5
中支持高并发、高吞吐量的线程安全
HashMap
实现。它由
Segment数组结构和
HashEntry
数组结构组成。
Segment
数组在
ConcurrentHashMap
里扮演锁的 角色,HashEntry
则用于存储键
-
值对数据。一个
ConcurrentHashMap
里包含一个
Segment
数组, Segment的结构和
HashMap
类似,是一种数组和链表结构;一个
Segment
里包含一个
HashEntry 数组,每个HashEntry
是一个链表结构的元素;每个
Segment
守护着一个
HashEntry
数组里的元 素,当对HashEntry
数组的数据进行修改时,必须首先获得它对应的
Segment
锁。(推荐使用)
确保集合不被修改
可以使用 Collections. unmodififiableCollection(Collection c)
方法来创建一个只读集合,这样改变 集合的任何操作都会抛出 Java. lang. UnsupportedOperationException
异常
List<String> list = new ArrayList<>();list. add("x");Collection<String> clist = Collections. unmodifiableCollection(list);clist. add("y"); // 运行时此行报错System. out. println(list. size());
Java遍历
遍历方式有以下几种:
1. for
循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素,
当读取到最后一个元素后停止。
2.
迭代器遍历,
Iterator
。
Iterator
是面向对象的一个设计模式,目的是屏蔽不同数据集合的特
点,统一遍历集合的接口。
Java
在
Collections
中支持了
Iterator
模式。
3. foreach
循环遍历。
foreach
内部也是采用了
Iterator
的方式实现,使用时不需要显式声明
Iterator
或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过
程中操作数据集合,例如删除、替换。
ArrayList
的优缺点
优点:
1.ArrayList 底层以数组实现,是一种随机访问模式。
ArrayList
实现了
RandomAccess
接口,
因此查找的时候非常快。
2.ArrayList 在顺序添加一个元素的时候非常方便。
缺点:
1.删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性
能。
2.插入元素的时候,也需要做一次元素复制操作,缺点同上
适用场景:ArrayList
比较适合顺序添加、随机访问的场景
多线程场景下适用ArrayList:
List<String> synchronizedList = Collections.synchronizedList(list);synchronizedList.add("aaa");synchronizedList.add("bbb");for (int i = 0; i < synchronizedList.size(); i++) {System.out.println(synchronizedList.get(i));}
List 和 Set 的区别
1.List , Set 都是继承自
Collection
接口
2.List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多 个null
元素,元素都有索引。常用的实现类有
ArrayList
、
LinkedList
和
Vector
。
3.Set 特点:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一 个null
元素,必须保证元素唯一性。
Set
接口常用实现类是
HashSet
、
LinkedHashSet
以及
TreeSet
。
4.另外 List
支持
for
循环,也就是通过下标来遍历,也可以用迭代器,但是
set
只能用迭代,因为他无序,无法用下标来取得想要的值。
1. Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
2. List:和数组类似,
List
可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变