Collection集合体系的特点:
Set系列集合的特点:添加元素,是无序,不重复,无索引。是基于哈希表储存数据的。
1、HashSet:添加的元素,是无序、不重复、无索引的
//创建
Set<String> sets = new HashSet<>(); // 一行经典代码!
2、LinkedHashSet:添加的元素是有序的,不重复、无索引。底层依然是使用哈希表存储元素的, 但是每个元素都额外带一个链来维护添加顺序!! 不光增删查快,还有序。缺点是多了一个存储顺序的链会占内存空间!!而且不允许重复,无索引。
//创建
Set<String> sets = new LinkedHashSet<>();
3、TreeSet: 不重复,无索引,按照大小默认升序排序!! ( 可排序集合 )
TreeSet集合自自排序的方式:
1.有值特性的元素直接可以升序排序。(浮点型,整型)
2.字符串类型的元素会按照首字符的编号排序。
3.对于自定义的引用数据类型,TreeSet默认无法排序,执行的时候直接报错,因 为人家不知道排序规则。
自定义的引用数据类型的排序实现:
对于自定义的引用数据类型,TreeSet默认无法排序 .
所以我们需要定制排序的大小规则,程序员定义大小规则的方案有2种:
( 注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。)
a.直接为对象的类实现比较器规则接口Comparable,重写比较方法(拓展方式)
// 如果程序员认为比较者大于被比较者 返回正数!
// 如果程序员认为比较者小于被比较者 返回负数!
// 如果程序员认为比较者等于被比较者 返回0!
b.直接为集合设置比较器Comparator对象,重写比较方法
// public TreeSet(Comparator<? super E> comparator)
// 集合自带比较器对象
// 如果类和集合都存在大小规则,默认使用集合自带的规则进行大小排序!!
Set<Employee> employees1 = new TreeSet<>(new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
// o1比较者 o2被比较者
// 如果程序员认为比较者大于被比较者 返回正数!
// 如果程序员认为比较者小于被比较者 返回负数!
// 如果程序员认为比较者等于被比较者 返回0!
return o1.getAge() - o2.getAge();
}
});
List系列集合:添加的元素是有序、可重复、有索引的
1、LInkedList:底层是基于链表的,增删比较快,查询慢!! LinkedList是支持双链表,定位前后的元素是非常快的,增删首尾的元素也是最快的 所以LinkedList除了拥有List集合的全部功能还多了很多操作首尾元素的特殊功能:
/*
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):将元素推入此列表所表示的堆栈。
*/
2、ArrayList:实现类集合底层基于数组储存数据的,查询快,增删慢。开发中ArrayList集合用得最多
- public void add(int index, E element):\\将指定的元素,添加到该集合中的指定位置上。
- public E get(int index)\\返回集合中指定位置的元素。
- public E remove(int index)\\: 移除列表中指定位置的元素, 返回的是被移除的元素。
- public E set(int index, E element)\\:用指定元素替换集合中指定位置的元素,返回更新前的元素值。
List的遍历方式:
1.for循环
2.迭代器
Iterator<String> it =list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
3.forreach
/*
格式:
for(数据类型 变量名 :被遍历集合){
System.out.println(变量名)
}
*/
4.lambda表达式
lists.forEach(s->{
System.out.println(s);
});
Collection工具类的使用:
java.utils.Collections:是集合工具类 Collections并不属于集合,是用来操作集合的工具类。 Collections有几个常用的API:
/* public static <T> boolean addAll(Collection<? super T> c, T... elements) 给集合对象批量添加元素!
- 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> ):将集合中元素按照指定规则排序。
*/
// 优先用方法自带的比较器对象Comparator而不会用类的比较规则!!
Collections.sort(oranges1, new Comparator<Orange>() {
@Override
public int compare(Orange o1, Orange o2) {
if(o1.getWeight() > o2.getWeight()) return -1;
if(o1.getWeight() < o2.getWeight()) return 1;
return 0;
}
});
System.out.println(oranges1);
}