一、Collection
Collection是所有单列集合的父接口
集合和数组的区别
描述 | ||||
---|---|---|---|---|
数组 | 是一个容器 | 可以存放同一种数据类型的多个元素 | 可以存放基本数据类型也可以存放引用数据类型 | 长度是固定的 |
集合 | 是一个容器 | 可以存放不同数据类型的多个元素(泛型 -> 存放相同数据类型) | 只能存放引用数据类型, 基本数据类型也可以直接存进去, 因为会自动装箱 | 长度是可变的, 随着元素个数的变化而变化 |
1. 单列集合的继承体系
2. Collection 常用功能
Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List,Set)通用的一些方法.
- public boolean add(E e) 把指定对象添加到集合中
- public void clear( ) 清空所有元素,集合长度变为0
- public boolean remove(E e) 删除指定元素
- public boolean contains(E e) 判断是否包含指定对象
- public boolean isEmpty( ) 判断当前集合是否为空
- public int size( ) 返回集合中元素的个数
- public Object[] toArray( ) 将集合转化为数组
3. Iterator 迭代器
3.1 Iterator 接口
Iterator 主要用于迭代访问(即遍历) Collection 中的元素, 因此 Iterator 对象也被成为 迭代器
迭代的概念
在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代 。
Iterator<E> iterator() : 获取指定集合对应的迭代器对象
Iterator接口的常用方法:
-
public E next()
:返回迭代的下一个元素。 -
public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
实例
Collection<String> c = new ArrayList<>();
c.add("梅西");
c.add("武磊");
c.add("德布劳内");
c.add("托雷斯");
// iterator() : 获取了集合对应的迭代器对象
Iterator<String> it = c.iterator();
// 判断集合中是否还有下一个元素
while (it.hasNext()) {
// 获取元素
String s = it.next();
System.out.println(s);
}
二、泛型
ArrayList<String> list = new ArrayList<>();
// 泛型的作用: 用来限定容器中元素的数据类型, 泛型中只能是引用数据类型
1. 泛型的好处
-
将问题从运行时期转换到编译时期
-
省去了强转的麻烦
2. 泛型类, 泛型方法, 泛型接口
-
泛型类: 在创建该类对象的时候, 确定具体的数据类型.
-
泛型方法: 在调用该方法的时候, 确定具体的数据类型.
-
泛型接口:
-
子类实现接口, 直接确定具体的数据类型.
-
子类实现接口, 不确定具体的类型, 等到创建子类对象时, 确定具体的数据类型.
-
3. 固定泛型边界
-
? extends E
:固定泛型的上边界. 传入集合的泛型可以是E, 也可以是E的子类. -
? super E
:固定泛型的下边界. 传入集合的泛型可以是E, 也可以是E的父类.
4. 泛型的定义与使用
- 定义和使用含有泛型的类
修饰符 class 类名<代表泛型的变量>{
}
/* class ArrayList<E> {
public boolean add(E e){
}
public E get (int index){
}
}
*/
- 在创建对象的时候确定泛型
ArrayList<String> list = new ArrayList<String>( );
ArrayList<Integer> list = new ArrayList<Integer>( );
public class Demo<Person>{
//没有Person类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
private Person student;
public void setStudent(Person student){
this.student = student;
}
public Person getstudent( ){
return student;
}
}
使用
public class Test{
public static void main(String[] args){
//创建String泛型类
Demo<String> d1 = new Demo<>();
//调用setStudent方法
d1.setStudent("三好学生");
// 调用getSudent方法
String student1 = d1.getStudent();
System.out.println(student1);
//创建Integer泛型类
Demo<Integer> d2 = new Demo<>();
d1.setStudent(123);
int student2 = d1.getStudent();
System.out.println(student2);
}
}
- 含有泛型的方法
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){
}
- 含有泛型的接口
修饰符 interface接口名<代表泛型的变量> {
}
三、List集合
1.List集合的特点
-
有序:存入元素和去除元素的顺序是相同的
-
有索引
-
可以重复: 可以存储相同的元素
2.List接口中常用方法
List作为Collection集合的子接口,不但继承了其中全部方法,还增加了一些根据元素索引来操作的特有方法
- public void add(int index,E element) 将指定元素,添加到集合中指定的位置上
- public E get(int index) 返回集合中指定位置的元素
- public E remove (int index) 移除列表中指定位置的元素,返回的是被移除的元素
- public E set(int index,E element) 用指定元素替换集合中指定位置的元素,返回值是更新前的元素。
3. ArrayList集合
ArrayList 集合数据存储的结构是数组结构. 元素增删慢,查找快,适合查询数据,遍历数据
4. LinkedList集合
LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。
- public void addFirst(E e)
- public void addLast(E e)
- public E getFirst( )
- public E getLast( )
- public E removeFirst( )
- public E removeLast( )
- public E pop( ) 从此列表所表示的堆栈处弹出一个元素。
- public void push(E e) 将元素推入此列表所表示的堆栈。
- public boolean isEmpty( ) 如果列表不包含元素,则返回true
四、Set集合
1.Set集合的特点
-
无序:存入元素和去除元素的顺序是相同的
-
无索引
-
不可以重复: 保证元素的唯一
2.HashSet集合介绍
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。
3.HashSet存储自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode 和 equals 方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
3.1 LinkdeHashSet集合介绍
LinkedHashSet 是链表和哈希表组合的一个数据存储结构
特点
-
能够保证元素的唯一
-
有序
4.TreeSet(扩展)
-
TreeSet的底层是二叉树
特点
-
保证元素唯一
-
排序
五、Collections
1.可变参数
修饰符 返回值类型 方法名(数据类型 ... 变量名) {
}
2.常用功能
- public static <T> boolean addAll(Collection<T> c, T... elements) 将可变参数中的内容,都添加到c集合中
- public static void shuffle(List <?> list) 打乱集合中的元素
- public static <T> void sort (List<T> list) 按升序排列
- public static <T> void sort (List<T> list, Comparator<? super T> ) 按指定规则排序
3. Comparator比较器
Java已经提供的类(String,Integer,Double)中,都具备自然排序的功能
Integer自然排序:
return (x < y) ? -1 : ((x == y) ? 0 : 1);
比较器排序
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 5, 2, 3, 4);
// 方法的参数列表是接口, 那么实际传入的是该接口的实现类对象
// new 接口名() {} : 实现了该接口的实现类对象
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 升序的逻辑
// 如果o1小于o2, 放在左边, 返回负数
// 如果o1大于o2, 放在右边, 返回正数
// 如果o1等于o2, 返回0
// return o1 - o2;
// 降序的逻辑
// 如果o1小于o2, 放在右边, 返回正数
// 如果o1大于o2, 放在左边, 返回负数
// 如果o1等于o2, 返回0
return o2 - o1;
}
});
System.out.println(list);