集合
集合是一组可变数量的数据项(也可能是0个)的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作。一般来讲,这些数据项的类型是相同的,或基类相同。
Java中的集合结构:
一:Collection
层次结构的集合接口,用于描述一组对象。
(Ⅰ):有序集合 List
List集合的特点:
- 线性存储数据;
- 允许写入重复的数据。
List集合的常用方法:
方法 | 说明 | 示例 |
add | 添加元素 | arrayList.add(“Chiang”); |
isEmpty | 判断集合中是否有元素 | arrayList.isEmpty() |
size | 获取集合中元素的数量 | arrayList.size(); |
remove | 移除元素 | arrayList.remove(0); |
indexOf | 获取元素在集合中的索引 | arrayList.indexOf(“Chiang”) |
set | 根据索引位置修改元素值 | arrayList.set(0, “TionsChiang”); |
contains | 判断集合中是否包含某个元素 | arrayList.contains(“Chiang”) |
get | 获取指定索引的元素 | arrayList.get(0) |
clear | 清空元素 | arrayList.clear(); |
遍历集合的方式:
//方式一
for(int i = 0; i < arrayList.size(); i++){
System.out.println(arrayList.get(i));
}
//方式二 使用迭代器迭代集合中的每个元素
//获取迭代器
Iterator iter = arrayList.iterator();
while(iter.hasNext()){
//得到每个元素
Object value = iter.next();
System.out.println(value);
}
//方式三 快速迭代,在迭代过程中不允许对集合进行增删改操作
//快速迭代语法 for(元素类型 元素名 : 被遍历的集合或数组名){}
//快速的特点:以只读只进的方式访问元素
for(Object value : arrayList){
System.out.println(value);
}
1.ArrayList(动态数组)
ArrayList集合实现List接口,List接口的特点是存储的元素是有序,并且可以写入重复的元素。
ArrayList在执行查询时由于直接通过数组索引访问,因此有着极高的性能,但在执行增删的时候性能较差。
创建ArrayList的方式:
ArrayList arrayList = new ArrayList();
基于多态性父接口可以接受集合的实例对象:
List list = arrayList;
Collection coll = arrayList;
泛型:
泛型是程序语言的特性,JDK1.5引入,用于限定集合中写入元素的类型,增强程序数据类型安全及减少类型转换的次数,并且只能写入引用类型。
ArrayList<Integer> intList = new ArrayList<>();
2.LinkedList(双向链表结构集合)
- 实现了List接口;
- 链表数据结构,通过指针形成物理上的同块数据;
- 链表结构在执行增删改的时候有着优异的性能,但是在执行查询性能较差。
创建LinkedList的方式:
LinkedList<String> list = new LinkedList<>();
3.Stack(栈)
- 栈结构集合;
- 元素先进后出。
创建Stack的方式:
Stack<String> stack = new Stack<>();
弹栈,获取栈顶的元素:
String value = stack.pop();
4.Vector(向量)
- 动态数组;
- 作用和ArrayList相同;
- Vector是线程安全的,ArrayList是非线程安全的。
创建Vector的方式:
Vector<String> vector = new Vector<>();
(Ⅱ):无序集合 Set
Set集合特点:
- 无序存储;
- 不能存储重复的元素。
1.HashSet(哈希集合)
创建HashSet的方式:
HashSet<String> set = new HashSet<>();
HashSet添加元素的原理机制:
HashSet中所有存储的元素都将存储在map中;
set.add(元素)执行后, 元素将作为键添加至map中;
set.add方法将通过map.put方法执行;
map.put键的原则是: 如果要添加元素的hash值和已有的键相同 并且 要添加元素和已有的键是同一个对象 或者 要添加的元素使用equals方法与键比较相同;
如果同时满足这两个条件则表示元素值已经存在;
判定重复数据的标准:hash值相同并且equals比较也相同。
2.TreeSet(树集合)
- 能够自定义序列规则;
- TreeSet添加元素对象必须要implements Comparabl接口。
创建TreeSet的方式:
TreeSet<String> set = new TreeSet<>();
二:Map
键值结构的集合接口,可以通过键值获取。
- Map接口
- 以键值对的方式存储数据
- 通过键获取值
- 键不能重复
- 值允许重复
Map集合的本质即Set<Entry>类型的集合,Map集合还将写入了Node[] 数组中(单向链表结构),并提供了相应的方法方法。
Map集合的常用方法:
方法 | 说明 | 示例 |
put | 添加键值对 | map.put(1001, “Chiang”); |
get | 根据键获取值 | map.get(1001) |
size | 集合中的元素数量 | map.size() |
keySet | 获取所有的键 | map.keySet() |
values | 获取所有的值 | map.values() |
entrySet | 获取所有的键值对 | map.entrySet() |
HashMap
键值结构,根据键获得值
HashMap<K,V> map = new HashMap<>();
遍历Map中元素的方式:
//Map中的每个元素的类型是Entry类型,一个Entry对象记录了一个键值对
for(Entry<Integer, String> element : map.entrySet()){
//通过entry对象获取键值对
System.out.println(element.getKey()+"\t"+element.getValue());
}
HashTable
HashTable和HashMap功能相同
区别点: HashTable线程安全,HashMap非线程安全