目录
1.1 集合的体系结构:(集合需要通过具体的实现类来实现接口)
1. 集合概述
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
1.1 集合的体系结构:(集合需要通过具体的实现类来实现接口)
1.2 集合的遍历
1. lterator: (迭代器,集合的专用遍历方式)
lterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的
lterator中的常用方法:
E next(): 返回迭代中的下一个元素
boolean hasNext(): 如果迭代具有更多元素,则返回true
2. for循环遍历(带有索引的遍历方式)
3. 增强for循环(最方便的遍历方式)
简化数组和Collection集合的遍历,实现lterable接口的类允许其对象成为塔强型for语句的目标内部原理是一个lterator迭代器
格式:
for(元素数据类型变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
2.Collection集合
2.1 Collection集合概述
是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现。它提供更具体的子接口(如Set和List)实现
创建Collection集合的对象
- 多态的方式
- 具体的实现类ArrayList
Collection<Student> co = new ArrauList<Student>();
2.2 Collection常用方法
注意:
- co.add(); 返回值输出永远为true
- 可以存储重复的元素
2.3 Collection集合的遍历(迭代器)
3.List集合
3.1 List集合概述和特点
1. List集合概述
有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置
用户可以通过整数索引访问元素,并搜索列表中的元素
与Set集合不同,列表通常允许重复的元素
2. List集合特点
有序: 存储和取出的元素顺序一致
可重复: 存储的元素可以重复
3.2 List集合特有方法
3.3 List集合遍历
1. 遍历的两种方法
2.并发修改异常
ConcurrentModificationException
产生原因:
迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案:
用for循环遍历,然后用集合对象做对应的操作即可
3. Listlterator(列表特有的迭代器)
用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
解决了并发修改异常的问题
Listlterator中的常用方法:
E next(): 返回迭代中的下一个元素
boolean hasNext(): 如果迭代具有更多元素,则返回true
E previous(): 返回列表中的上一个元素
boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
void add(E e): 将指定的元素插入列表
3.4 List子类集合的特点
ArrayList: 底层数据结构是数组,查询快,增删慢
LinkedList: 底层数据结构是链表,查询慢,增删快
1. ArrayList集合(数组)
ArrayList<String>,ArrayList<Student>
2. LinkedList集合(链表)
4. Set集合
4.1 Set集合概述和特点
1.Set集合特点
- 不包含重复元素的集合
- 没有带索引的方法,所以不能使用普通for循环遍历
- 用HashSet实现接口,HashSet:对集合的迭代顺序不作任何保证(输出顺序无序)
Set < E> set = new HashSet<E>();
2. 哈希值
哈希值: 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值
public int hashCode(): 返回对象的哈希码值
对象的哈希值特点:
同一个对象多次调用hashCode()方法返回的哈希值是相同的
默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
4.2 HashSet集合概述和特点
1.HashSet集合特点
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所i以不能使用普通for循环遍历
- 由于是Set集合,所以是不包含重复元紊的集合
2.HashSet添加一个元素的过程
要保证元素的唯一性,则需要重写hashCode()和equals()方法
4.3 LinkedHashSet集合概述和特点
- 哈希表和链表实现的Set接口,具有可预测的迭代次序
- 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
- 由哈希表保证元素唯一,也就是说没有重复的元素
4.4 TreeSet集合概述和特点
1.TreeSet集合特点
- 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
TreeSet(): 根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以不包含重复元素的集合
2. 自然排序和比较器排序
a.自然排序(Comparable)
用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序
对元素进行排方的自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
b. 比较器排序(Comparator)
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1,T o2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
5. 泛型
5.1 泛型概述
泛型提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
参数化类型:
将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型
这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型定义格式:
<类型>: 指定一种类型的格式(形参)
<类型1,类型2...>∶指定多种类型的格式,多种类型之间用逗号隔开(形参)
将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
泛型的好处:
把运行时期的问题提前到了编译期间
避免了强制类型转换
5.2 泛型分类
1.泛型类
格式: 修饰符 class 类名 <类型> {}
范例: public class Generic <T> {}
此处T可以随便写为任意标识。常见的如T、E、K、V等形式的参数常用于表示泛型
2. 泛型方法
格式: 修饰符<类型>返回值类型方法名(类型变量名) {}
范例: public <T> void show(T t) { }
3. 泛型接口
格式: 修饰符 interface 接口名<类型>{}
范例: public interface Generic<T>{ }
实现接口: public class GeneriImpl <T> implement Generic <T>{
@Override
}
5.3 类型通配符
为了表示各种泛型List的父类,可以使用类型通配符.类型通配符:<?>
List<?>:表示元素类型未知的List,它的元素可以匹配任何的类型
这种带通配符的List仅表示它是各种泛型List的父类,并不能把元紊添加到其中
如果说我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限
类型通配符上限: <? extends类型>
List<? extends Number>: 它表示的类型是Number或者其子类型
类型通配符下限: <? super类型>
List<? super Number> : 它表示的类型是Number或者其父类型
5.4 可变参数
1. 可变参数的概述
可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
格式: 修饰符返回值类型方法名(数据类型...变量名){}
范例: public static int sum(int...a)[ ]
注意: 这里的变量其实是一个数组
一个方法中只能定义一个可变参数,如果一个方法有多个参数,包含可变参数,要先声明其他参数,可变参数要放在最后
2.可变参数的使用方法
a. Arrays工具类中有一个静态方法: (只能修改元素,不能增删元素)
public static <T> List<T> asList(... a):返回由指定数组支持的固定大小的列表
b. List接口中有一个静态方法: (增删改都不行)
public static <E> List<E> of(... elements):返回包含任意数量元素的不可变列表
c. Set接口中有一个静态方法: (没有修改方法,元素唯一)
public static <E> Set<E> of(... elements):返回一个包含任意数量元素的不可变集合
6. Map集合
6.1 Map集合概述和使用
Map集合概述:
lnterface Map<K V> K:键的类型; V:值的类型
将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值举例:学生的学号和姓名
创建Map集合的对象
- 多态的方式
- 具体的实现类HashMap
6.2 Map集合的功能
1. 基本功能
2. 获取功能
6.3 Map集合的遍历方法
1. 方式一
- 获取所有键的集合。用keySet()方法实现
- 遍历键的集合,获取到每一个键
- 用增强for实现根据键去找值。用get(Object key)方法实现
2.方式二
- 获取所有键值对对象的集合Set<Map.Entry<K,V> > entrySet():
- 获取所有键值对对象的集合遍历键值对对象的集合,得到每一个键值对对象
- 用增强for实现,得到每一个Map.Entry根据键值对对象获取键和值
- 用getKey0)得到键,用getValue()得到值
7.Collections类
是针对集合操作的工具类
Collections类的常用方法:
public static <T extends Comparable<? super T>> void sort(List<T> list):将指定的列表按升序排序
public static void reverse(List<?> list): 反转指定列表中元素的顺序
public static void shuffle(List<?> list): 使用默认的随机源随机排列指定的列表