List集合
java.util.List 接口继承自 Collection 接口,
List接口的特点:
1).数据的存取是有序的,是一个带索引的集合,通过索引操作集合元素
2).可以存储重复的数据
常用方法:
除了继承Collection接口的方法外,还有特有的方法。(继承了七个+一个迭代)
1).增public void add(int index, E element),添加指定元素到指定位置
2).删public E remove(int index),删除指定位置的元素,并且返回删除的元素
3).改public E set(int index,E element), :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
4).查public E get(int index),返回集合中指定位置元素
数据结构
数据结构就是存储数据的方式,不同的存储方式,会影响增、删、改、查操作的效率。
常见的数据结构:
1).数组:
a)有序,可存储重复数据,
b)在内存中是连续的,
c)长度不可变。
d)可以通过索引访问
e)查找快,增删慢
2).链表:
a)多个节点,节点通过地址连接
b).查询慢,增删快,因为增删只要把地址插入就行
3).栈
a).先进后出
b). 受限的线性表:添加、删除元素都在同一端(栈顶);
4).队列
a).先进先出
b). 受限的线性表,添加、删除各占一端
5)红黑树
List的子类
ArrayList集合:
内部是数组实现--查询快;增删慢;
开发中常用于查询数据、遍历
LinkedList集合:
数据存储是链表结结构,方便元素添加、删除
常用方法:
1).push():模拟压栈
2).poll():模拟弹栈(获取第一个元素,并删除第一个元素)
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
poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常
Set集合
java.util.Set接口和List接口一样屙也是继承Collection接口,但是没有对功能进行补充
1.HashSet
java.util.HashSet 是 Set 接口的一个实现类。存储不可重复并且是无序的
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于: hashCode 与 equals 方法。
2.哈希表
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。
而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树
特点:
1).采用:数组 + 链表 + 红黑树实现
2).验证元素的唯一性:
1).先判断元素的hashCode()
不同:存
相同:再判断元素的equals()
不同:存
相同:不存
3.HashSet存储自定义对象:
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
public static void main(String[] args) {
HashSet<Student> set = new HashSet<>();
set.add(new Student("张三", 18));
set.add(new Student("李四", 19));
set.add(new Student("李四", 19));//先判断hashCode(),相 同,再判断equals(),相同:不存
System.out.println("集合大小:" + set.size());
}
4.LinkedHashSet:
链表、哈希表组合实现,是Set的特例,有序的哈希表
5.可变参数
格式:修饰符 返回值类型 方法名(参数类型 ... 形参名){ }
例如:public static void test(int ... nums){} 可以不传值,底层实际是数组
public static void test(int[] nums){}
public static void main(String[] args) {
test();
test(1,12,3,4);
}
public static void test(int ... nums){
}
在一个方法中最多只能有一个“可变参数”,而且必须位于参数列表的末尾
Collections类
1.常用功能:
java.utils.Collections 是集合工具类,用来对集合进行操作。
1).public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4,5);
}
2).public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4,5);
Collections.shuffle(list);
}
3).public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。升序
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list, 6,2,3,4,5);
Collections.sort(list);
System.out.println(list);
}
4).对自定义对象排序,对象类必须实现Comparable接口
public static <T> void sort(List<T> list)
ArrayList<Student> stuList = new ArrayList<>();
stuList.add(new Student("张三1", 18));
stuList.add(new Student("张三2", 19));
stuList.add(new Student("张三3", 17));
stuList.add(new Student("张三4", 10));
Collections.sort(stuList);//内部会调用compareTo()方法进行比较
public class Student implements Comparable<Student>{//这里要确定数据类型
String name;
int age;
//重写compareTo方法
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
5). public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
ArrayList<Student> stuList = new ArrayList<>();
stuList.add(new Student("张三1", 18));
stuList.add(new Student("张三2", 19));
stuList.add(new Student("张三3", 17));
stuList.add(new Student("张三4", 10));
Collections.sort(stuList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
});//匿名内部类实现Comparator接口,重写compare方法
System.out.println(stuList);
2.Comparator比较器:
Comparator<? super T>将集合中元素按照指定规则排序的时候,需要重写compare方法,对java定义的数据类型只会按照默认的排序规则,如果需要按照其他规则,需要重写方法,但是不可能修改Java源码,可以使用Comparator的接口的compare方法(也就是使用Comparator比较器)进行排序
使用Comparator比较器,需要先实现Comparator接口,可以定义一个类实现接口然后再实现类中重写compare方法,也可以写一个匿名内部类,一般使用匿名内部类作为Comparator比较器,使用方式就是public static <T> void sort(List<T> list,Comparator<? super T> )这个方法的使用