一、集合的特点
二、继承结构图
三、List集合
1.特点 2.ArrayList类 3.LinkedList类 4.两者的对比 5.集合的遍历
四、Set集合
1.特点 2.HashSet类
五、Map集合
1.特点 2.HashMap类
六、Collections集合工具类
七、泛型
1简介 2.泛型类 3.泛型接口 4.泛型方法 5.泛型通配符
八、TreeMap和TreeSet
1.Set和Map的关系 2.继承关系 3.特点 4.构造方法
一、集合的特点
集合 | 特点 |
---|---|
数组特点 | 类型固定,长度固定 |
类的特点 | 不同类型的成员属性,共同描述一个实体类 |
集合的特点 | 类型不固定,长度也不固定,随意存放任何数据 |
二、继承结构图
三、List集合
1.特点
List 接口存储一组可重复,有序的对象。
2.ArrayList类(数组集合)
常用方法:
方法 | 功能 |
---|---|
.add()/.add( , ) | 添加元素(可通过下标参数指定添加位置) |
.get() | 通过索引查找元素 |
.indexOf() | 通过元素查找索引 |
.set( , ) | 替换指定索引位置的元素 |
.remove() | 删除并返回索引位置的元素 |
.isEmpty() | 判断集合是否为空 |
.contains() | 判断集合是否包含某元素 |
.addAll() | 集合加集合 |
.removeAll() | 集合减集合(会减掉前者里所有在后者里有的元素) |
如果要删除为1的元素,直接传入参数1时,会被当成要删除元素的下标,
写为.remove(new Integer(1)) 或者 .remove(list.lastIndexOf(1)) 可以避免这种情况。
3.LinkedList类(链表集合)
存储原理:
是一个链表,在元素的前后分别有一个前置结点和后置结点,用于连接集合中的上一个元素和下一个元素,依次“手拉手”,构成一条链式数据的集合。
特有方法:
方法 | 功能 |
---|---|
.addFirst() | 将元素插入集合头部 |
.addLast() | 将元素插入集合尾部 |
.getFirst() | 获得集合的第一个元素 |
.getLast() | 获得集合的最后一个元素 |
.removeFirst() | 移除并返回集合第一个元素 |
.removeLast() | 移除并返回集合的最后一个元素 |
4.两者的对比
- ArrayList实现了长度可变的Object类型数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
- LinkedList采用链表存储方式,插入、删除元素时效率比较高
效率不同的原因:
Linkedlist在执行删除和添加操作时,只会对相邻的两个元素有影响。
Arraylist由于它的本质是一个数组,在执行删除和添加操作时,后面所有的元素的地址值都将出现移位。
5.集合的遍历
(1)for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
(2)增强for
for (Object s:list) {
System.out.println(s);
}
增强for循环相当于迭代器的简写。
(3)迭代器
- 创建迭代器对象
- 使用while进行循环
Iterator it = list.iterator(); // 创建迭代器对象
while(it.hasNext()){ // 进行循环
System.out.println(it,next());
}
四、Set集合
Set集合其实是使用Map集合的键来实现。HashSet是Set接口常用的实现类。
1.特点
Set 接口存储一组唯一,无序的对象。
2.HashSet类
常用方法:
方法 | 功能 |
---|---|
.add() | 添加元素 |
.remove() | 删除元素 |
使用增强for或者迭代器实现 | 获取所有元素 |
HashSet类 由于无序的特性, 故没有修改和获取单个元素的方法。
五、Map集合
1.特点
Map接口专门处理键值映射的数据,可以根据键实现对值的操作(无序且唯一)。
2.HashMap类
常用方法
方法 | 功能 |
---|---|
.put(key,value) | 添加数据 |
.remove(key)/.remove(key,value) | 删除数据(前者返回删除的值,后者返回是否删除成功) |
.replace(key,value) / .replace(key,oldvalue,newvalue) | 替换数据 |
.get(key) | 查询单个数据 |
三种遍历方法* | 查询所有数据(遍历) |
.containsKey(key) | 判断集合中是否存在某键 |
.containsValue(value) | 判断集合中是否存在某值 |
.isEmpty() | 判断集合是否为空 |
.clear() | 清除所有元素 |
.keySet() | 获取所有键的集合 |
.values() | 获取所有值的集合 |
*三种遍历方法
(1)遍历key
Set keys = map.keySet();
for(Object key:keys){
System.out.println(key+map.get(key));
}
(2)遍历value
Collection values = map.values();
for(Object value:values){
System.out.println(value);
}
(3)遍历键值对
Set entries = map.entrySet();
for(Object entry:entries){
System.out.println((Map.Entry)entry).getKey()+((Map.Entry)entry).getValue());
}
六、Collections集合工具类
常用方法(静态)
方法 | 功能 |
---|---|
.shuffle() | 随机打乱 |
.sort() | 排序(类似数组的排序,也可以自定义排序方法) |
.swap( , , ) | 交换 |
.binarySearch( , ) | 查找(集合必须事先用内部比较器按某种规律升序排列) |
1.Collections类的排序只能使用内部比较器。
2.查找方法的第二个参数类型与集合中元素类型保持一致。
七、泛型
1.简介
Java泛型是jdk 1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)。
泛型这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
2.泛型类
类的后面定义一个或多个任意类型 ,可以在类的成员属性或方法中使用。
如:
public class Hello<T,A,B,C>{
private T t;
private A a;
public void fun1(B b){
System.out.println(b);
}
}
//测试类中,调用构造方法,传入不同的类型作为参数,创建对象。
3.泛型接口
接口的后面定义一个或多个任意类型,可在接口的成员属性或方法中使用。
如:
public interface Haha <T> {
void ff(T t);
}
4.泛型方法
在方法结构上声明一个或多个泛型,可用于方法的返回值或形参。
如:
public <T> T fun1(T t){
System.out.println(t);
return t;
}
5.泛型通配符
- <? extends 类型> 表示某个类型或它的任意子类型
- <? super 类型> 表示某个类型或它的任意父类型
如:
public static void cal(ArrayList<? extends Animal> s) {
...
}
泛型通配符一般放在形参的类型后面。
八、TreeMap和TreeSet
1.Set和Map的关系
set使用了map的key。
2.继承关系
Set接口有一个实现类是HashSet,还有一个子接口是SortedSet,该接口有一个实现类是TreeSet。
3.特点
都是一个有序集合,TreeSet会根据自然排序排列或比较器进行排序,TreeMap中的元素默认按照keys的自然排序排列或比较器进行排序,都没有重复元素,也没有下标。
4.构造方法
有参构造
new TreeSet<>();
new TreeMap<>();
无参构造
new TreeSet<>(外部比较器Comparator);
new TreeMap<>(外部比较器Comparator);