1、Collections工具类
集合工具类,定义了除了存取以外的集合常用方法。
方法 | 描述 |
---|---|
sort | 升序排序(元素类型必须实现Comparable接口) |
addAll | 将所有指定元素添加到指定 collection 中。 |
max | 根据元素的自然顺序,返回给定 collection 的最大元素。 |
min | 根据指定比较器产生的顺序,返回给定 collection 的最小元素。 |
代码示例:
package Day14_set.collections;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 18:51
*/
public class Demo01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
//通过工具类进行多个数据添加
Collections.addAll(list,"1","2","3","4");
System.out.println(list);
String[] strs = {"wzy","p","ljd"};
Collections.addAll(list,strs);
System.out.println(list);
for (int i=0;i<strs.length;i++){
list.add(strs[i]);
}
System.out.println(list);
}
}
代码示例2:
package Day14_set.collections;
import java.util.ArrayList;
import java.util.Collections;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 19:03
*/
public class Demo02 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4,5,656,1000);
System.out.println(list);
//将集合中的对象存储到数组中,再通过Collections.sort进行排序,在存储到list集合中
Collections.sort(list);
System.out.println(list);
}
}
2、Set接口
2.1 set接口
- 特点:无序、无下标、元素不可重复。
- 方法:全部继承自Collection中的方法。
- 使用foreach循环遍历: for(数据类型 局部变量 : 集合名){ //循环内部的局部变量,代表当次循环从集合中取出的对象 }
使用set接口存储数据:
public class Demo1 {
public static void main(String[] args) {
//创建集合
Set<String> set=new HashSet<>();
//1添加数据
set.add("小米");
set.add("苹果");
set.add("华为");
//set.add("华为");
System.out.println("数据个数:"+set.size());
System.out.println(set.toString());
//2删除数据
// set.remove("小米");
// System.out.println(set.toString());
//3遍历 【重点】
//3.1使用增强for
System.out.println("-----增强for-------");
for (String string : set) {
System.out.println(string);
}
//3.2使用迭代器
System.out.println("-----使用迭代器------");
Iterator<String> it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
//4判断
System.out.println(set.contains("华为"));
System.out.println(set.isEmpty());
}
}
3、Set实现类
3.1 TreeSet
set:无序不可重复的集合
- TreeSet:无序不可重复的集合,不可以存储null对象
- 存储Integer类型数据会自动从小到大排序
- 存储自定义数据对象 需要实现 自然排序或者比较器,否则会报类型异常
自然排序:
- 存储的对象需要事先Comparable接口,重写compareTo()方法,在
- compareTo()实现比较规则
- compareTo返回正数则在节点的右边,返回负数则在节点的左边,返回0则不存储
比较器:
- 在实例化TreeSet集合的时候,通过构造方法传递Compareator实现类的对象
- 并重写compare(),根据compare()中的规则进行排序
代码示例:
package Day14_set.treeSet;
import java.util.Iterator;
import java.util.TreeSet;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 19:16
set:无序不可重复的集合
TreeSet:无序不可重复的集合,不可以存储null对象
存储Integer类型数据会自动从小到大排序
存储自定义数据对象 需要实现 自然排序或者比较器,否则会报类型异常
自然排序:
存储的对象需要事先Comparable接口,重写compareTo()方法,在
compareTo()实现比较规则
compareTo返回正数则在节点的右边,返回负数则在节点的左边,返回0则不存储
比较器:
在实例化TreeSet集合的时候,通过构造方法传递Compareator实现类的对象
并重写compare(),根据compare()中的规则进行排序
当实体类无法修改时,使用比较器进行排序,反之则使用自然排序。
*
* ctrl+alt+b 罗列方法实现的类
*
*
*
*/
public class Demo01 {
public static void main(String[] args) {
TreeSet<Integer> set = new TreeSet<>();
//添加
set.add(10);
set.add(62);
set.add(80);
set.add(101);
set.add(1);
set.add(7);
set.add(98);
System.out.println(set);
//迭代器
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
System.out.println(set);
//删除
set.remove(98);
System.out.println(set);
//lambda表达式
set.forEach(item-> System.out.println(item));
//修改 先删除,再添加
set.remove(100);
set.add(101);
System.out.println(set);
//lambda表达式
set.forEach(i-> System.out.println(i));
}
}
代码示例2:
存储数据对象
- 建立User.java类
- 建立Demo02.java实现类类
package Day14_set.entity;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 19:43
*/
public class User implements Comparable<User>{
private int id;
public User(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
'}';
}
@Override
public int compareTo(User o) {
return o.id-this.id;
}
}
package Day14_set.treeSet;
import Day14_set.entity.User;
import java.util.TreeSet;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 19:43
*
*/
public class Demo02 {
public static void main(String[] args) {
TreeSet<User> set = new TreeSet<>();
set.add(new User(1));
set.add(new User(2));
set.add(new User(3));
set.add(new User(5));
set.add(new User(10));
set.add(new User(1));
set.forEach(i-> System.out.println(i));
System.out.println(set);
}
}
代码示例3
- 使用TreeSet存储数据
- 重写compare()方法
- 建立 Animal.java
- 建立 MyComparator.java
- 建立 Demo04.java
package Day14_set.entity;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 15:09
*/
public class Animal {
private int id;
private String name;
private int age;
public Animal(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Animal{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
package Day14_set.treeSet;
import Day14_set.entity.Animal;
import java.util.Comparator;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 15:08
*/
public class MyComparator implements Comparator<Animal> {
//第一个参数是要存储的对象
//第二个参数是已存储的对象
@Override
public int compare(Animal o1, Animal o2) {
if (o1.getId()!=o2.getId()){
return o2.getId()-o1.getId();
}
return o1.getAge()-o2.getAge();
}
}
package Day14_set.treeSet;
import Day14_set.entity.Animal;
import java.util.TreeSet;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 15:08
*/
public class Demo04 {
public static void main(String[] args) {
/**
* 首先按id进行从大到小排序,如果id相等则按年龄进行从小到大排序
*/
TreeSet<Animal> set = new TreeSet<>(new MyComparator());
set.add(new Animal(1,"wzy",18));
set.add(new Animal(1,"wzy",17));
set.add(new Animal(1,"wzy",16));
set.add(new Animal(2,"wzy",20));
set.add(new Animal(2,"wzy",21));
set.add(new Animal(3,"wzy",21));
set.add(new Animal(4,"wzy",91));
set.forEach(item->{
System.out.println(item.getId()+":"+item.getAge());
});
}
}
3.2 HashSet
HashSet:无序不可重复集合
- JDk1.7 hash表(不可变数组)+链表
- JDk1.8 hash表(可变数组)+链表+红黑树
- hash表中的元素超过当前容量的负载因子,则会发生数组扩容机制容量扩展为原来的两倍
- 如果链表中的元素超过8个,则会转变为红黑树(平衡二叉树)
代码示例:
package Day14_set.hashset;
import java.util.HashSet;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 19:08
*/
public class Demo01 {
/**
HashSet:无序不可重复集合
JDk1.7 hash表(不可变数组)+链表
JDk1.8 hash表(可变数组)+链表+红黑树
hash表中的元素超过当前容量的负载因子,则会发生数组扩容机制
容量扩展为原来的两倍
果链表中的元素超过8个,则会转变为红黑树(平衡二叉树)
* @param args
*/
public static void main(String[] args) {
HashSet<Integer> list = new HashSet<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(4);
list.forEach(item-> System.out.println(item));
}
}
3.3 Queue
Queue:线性队列
特点:先进先出,用完即删
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
package Day14_set.queue;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author wzy
* @version 1.0
* @date 0003 2020-12-03 16:50
*/
public class Demo01 {
/**
* Queue:线性队列
* 特点:先进先出,用完即删
* 作业:研究Queue队列的呃poll()方法如何先进先出,用完即删的效果
* @param args
*/
public static void main(String[] args) {
Queue<Object> queue = new LinkedList<>();
for (int i=1;i<=10;i++){
queue.offer(i);
}
System.out.println(queue);
System.out.println(queue.size());
System.out.println(queue.poll());
System.out.println(queue.size());
System.out.println(queue);
}
}