目录
b)、Map接口:存储一对一对的接口(key-value键值对)
一、为何需要引入集合
- 内存层面需要针对于多个数据进行存储。此时,可以考虑的容器有:数组、集合类。但是数组在
- 数组存储多个数据方面的特点和弊端:
- 特点:数组一旦初始化,其长度就是确定的。对应弊端是一旦初始化,其长度就不可变了。
- 特点:数组中的多个元素是依次紧密排列的,有序的,可重复的。对应弊端是对于无序的、不可重复的场景的多个数据就无能为力。且数组中可用的方法、属性都极少。对于数组中元素的删除、插入操作,性能较差。
- 特点:数组一旦初始化完成,其元素的类型就是确定的,不是此类型的元素,就不能添加到此数组。
- 优点:元素的类型既可以是基本数据类型,也可以是引用数据类型
二、集合框架体系(两大平行接口)
a)、 Collection接口:存储一个一个的数据
常用子接口
1、List接口:存储有序的、可重复的数据。(其实List可看作“动态”数组)
常用实现类:ArrayList(主要)、LinkedList、Vector
2、Set接口:存储无序的、 不可重复的数据
常用实现类:HashSet、LinkedHashSet、TreeSet
b)、Map接口:存储一对一对的接口(key-value键值对)
没有子接口,直接提供其实现类:
HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
三、Collection接口中的常用方法
方法名 | 用途 |
boolean add(E e) | 向集合添加元素e,若指定集合元素改变了则返回true |
boolean addAll(Collection<? extends E> c) | 把集合C中的元素全部添加到集合中,若指定集合元素改变返回true |
int size(); | 返回集合的元素个数 |
boolean isEmpty(); | 判断当前集合是否是空集合 |
boolean contains(Object obj) | 判断当前集合中是否存在一个与obj对象equals返回true的元素,故重写equals后比较的是内容。 |
boolean containsAll(Collection c) | 判断指定集合是否包含集合c的所有元素 |
void clear() | 清空集合元素 |
boolean remove(Object obj) | 从当前集合中删除第一个找到的与obj对象equals返回true的元素 |
boolean removeAll(Collection c) | 从当前集合中删除所有与c集合中相同的元素 |
boolean retainAll(Collection c) | 从指定集合中保留包含集合c的元素,其他元素则删除 |
Object[] toArray() | 返回当前集合中所有元素的数组。集合—>数组 补充:数组—>集合:Arrays.asList(Object... objs) 可变形参为对象,即引用数据类型,不能放基本数据类型 |
hashCode() | 获取集合对象的哈希值 |
iterator() | 返回迭代器对象,用于集合遍历 |
补充数组转化为集合的方法:调用Arrays的静态方法asList(Object... objs):Arrays.asList(Object... objs)
注意包装类数组和基本数据类型的数组间转化为集合的区别:
@Test
public void test4(){
Integer[] arr = new Integer[]{1,2,3};//自动装箱
List list = Arrays.asList(arr);
System.out.println(list);//表示三个元素
int[] arr1 = new int[]{1,2,3};
List list1 = Arrays.asList(arr1);
System.out.println(list1);//仅表示一个元素
}
输出结果:
向Collection中添加元素的要求:
要求元素所属的类一定要重写equals()方法。
原因:因为Collection中的相关方法(比如contains() / remove())在使用中,要调用元素所在类的equals().
四、迭代器Iterator
1、作用:遍历集合元素
2、步骤:
i)获取迭代器对象
ii)用迭代器对象调用hasNext()方法判断是否有下一个元素,有则调用next()方法获取元素。
iii)增强for循环(foreach)的使用:其底层仍然是迭代器
1)作用:用来遍历数组、集合
2)格式 :for(要遍历的集合或数组元素的类型 临时变量:要遍历的集合或元素){
操作临时变量的输出
}
3)增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量。注意,循环体中对临时变量的修改,可能不会
导致原有集合或数组中元素的修改。
@Test
public void test() {
Collection coll = new ArrayList();
coll.add("AA");
coll.add(123);
coll.add("BBB");
Iterator iterator = coll.iterator();//获取迭代器对象
while (iterator.hasNext()){
System.out.println(iterator.next());//指针下移,并将下移以后集合位置上的元素返回
}
//使用增强for循环遍历集合
for (Object obj: coll ) {
System.out.println(obj);
}
}
五 List集合常用方法
1、因为List是有序的,进而就有索引,进而就会在以上Collection的方法上再增加一些对索引操作的方法。
a)插入元素
void add(int index,Object ele) :在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
b)获取元素
Object get(int index):获取指定index位置的元素
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合,含头不含尾
c)获取元素索引
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在集合中末次出现的位置
d)删除和替换元素
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set (int index,Object ele):设置指定index位置的元素为ele
六、List的实现类
i. ArrayList:最常用
1. 底层数据结构是Object[]数组存储,查询快、增删慢
2. 线程不安全,效率高
ii. Vector:
1. 底层数据结构是Object[]数组存储,查询快,增删慢
2. 线程安全,效率底
iii. LinkedList:
1. 底层数据结构是链表,查询慢,增删快
2. 线程不安全,效率高
七、Set集合
a) 无序的、不可重复的
i.无序性
不等于随机性,是与添加的元素的位置有关,不像ArrayList一样是依次紧密排列的。
这里是根据添加的元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的。
此表现为无序性。
ii.不可重复性
元素不能相同。
比较的标准,需要判断hashCode()得到的哈希值以及equals()得到的boolean型结果。
哈希值相同且equals()返回true,则认为元素相同。
b) 实现类
i. HashSet (主要实现类)
1. 底层数据是哈希表HashMap,即使用数组+单向链表+红黑树结构进行存储。
2. 通过两个方法hashCode()和equals()保证元素的唯一性,方法自动生成
3. 子类LinkedHashSet,在现有数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序,即我们
可以按照添加元素的顺序实现遍历,便于频繁的查询操作。由链表保证元素有序,由哈希表保证元素唯一。
4.基于Set上面的无序不可重复的两大特性:
对于添加到HashSet / LinkedHashSet 中的元素的要求有:
要求元素所在的类要重写两个方法:equals() 和 hashCode()
同时要求 equals() 和 hashCode() 要保持一致性。
ii. TreeSet
1. 底层数据是红黑二叉树。可以按照添加元素的指定的属性的大小进行遍历。
2. 排序方式:自然排序、比较器排序
3. 通过比较返回值是否为0来保证元素的唯一性。
4.要求添加到TreeSet中的元素必须是同一个类型的对象,否则会报ClassCastException
5.判断数据是否相同的标准
不再考虑equals() 和 hashCode()方法了,即添加到TreeSet中的元素所在的类不需要重写 equals() 和 hashCode()。
比较元素的大小或比较元素是否相等的标准就是考虑自然排序或定制排序中,compareTo()和compart()的返回值。
如果返回值为0,则认为两个对象是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中。
c)常用方法
即为Collection中定义的方法,没有新增的方法
d)使用场景
用来过滤重复数据。
八、针对Collection集合我们应该怎么使用
a) 是否元素唯一
i. 是:Set
1. 是否排序
a) 是:TreeSet
b) 否:HashSet
如果不知道用哪个Set就用HashSet
ii. 否:List
1. 是否对安全性有要求
a) 是:Vector
b) 否:
查询多:ArrayList
增删多:LinkedList
如果不知道用哪个List用ArrayList
如果知道是用集合但不知道用哪个用ArrayList