一、集合接口
Collection接口是构造集合框架的基础,定义了操作对象集合的共同方法。
List接口是有序,可包含重复元素的列表。
Set接口是无序的,无重复元素的集合的列表。
案例分析:
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class CollectionTest1 {
public static void main(String[] args) {
//有序,重复,有索引
Collection c=new ArrayList();
c.add("a");
c.add("a");
c.add("b");
c.add("c");
c.add("d");
c.add("d");
System.out.println(c); //[a, a, b, c, d, d]
//无序,不重复,无索引
Collection c1=new HashSet();
c1.add("a");
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
c1.add("d");
System.out.println(c1); //[a, b, c, d]
}
}
二、Collection常用API
方法名称 | 说明 |
---|---|
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数。 |
public Object[] toArray() | 把集合中的元素,存储到数组中 |
案例分析:
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
public class Collection_API {
public static void main(String[] args) {
Collection<String> c=new ArrayList<>();
//添加元素
c.add("小马哥");
c.add("小飞侠");
c.add("罗西");
c.add("马奎斯");
c.add("罗西");
System.out.println(c); //[小马哥, 小飞侠, 罗西, 马奎斯, 罗西]
//获取集合大小
System.out.println(c.size()); //5
//判断集合是否为空
System.out.println(c.isEmpty()); //false
// System.out.println(c);
//判断集合中是否包含某个元素
System.out.println(c.contains("小马哥")); //true
//删除某个元素,如果是重复元素,则删除第一个
System.out.println(c.remove("罗西")); //true
System.out.println(c); //[小马哥, 小飞侠, 马奎斯, 罗西]
//把集合转换为数组
Object o=c.toString();
System.out.println(o); //[小马哥, 小飞侠, 马奎斯, 罗西]
//清空集合元素
c.clear();
System.out.println(c); //[]
//将集合c2中的元素倒入c1中
Collection<String> c1=new ArrayList<>();
c1.add("a");
c1.add("b");
c1.add("c");
Collection<String> c2=new ArrayList<>();
c2.add("d");
c2.add("e");
c2.add("f");
c2.add("g");
c1.addAll(c2);
System.out.println(c1); //[a, b, c, d, e, f, g]
}
}
三、collection集合遍历方式
1.Iterator迭代器
- Collection集合获取迭代器
方法名称 | 说明 |
---|---|
Iterator iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引 |
- Iterator常用的方法
方法名称 | 说明 |
---|---|
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true ,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。 |
案例分析:
package com.collection.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
//collection集合遍历方式
public class IteratorTest {
public static void main(String[] args) {
//iterator遍历
//创建Collection集合对象
Collection<String> c=new ArrayList<>();
//添加元素
c.add("小马哥");
c.add("小飞侠");
c.add("罗西");
c.add("马奎斯");
c.add("罗西");
//得到迭代器对象
Iterator<String> it = c.iterator();
//循环遍历
while (it.hasNext()){
System.out.println(it.next());
}
}
}
/*
小马哥
小飞侠
罗西
马奎斯
罗西
*/
2.增强for循环遍历
for(元素数据类型变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
案例分析:
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
//增强for遍历
public class ForTest {
public static void main(String[] args) {
Collection<String> c=new ArrayList<>();
//添加元素
c.add("小马哥");
c.add("小飞侠");
c.add("罗西");
c.add("马奎斯");
c.add("罗西");
for (String s : c) {
System.out.println(s);
}
}
}
/*
小马哥
小飞侠
罗西
马奎斯
罗西
*/
3.案例分析
package com.collection.Test;
public class Student {
private String name;
private int age;
private double height;
public Student() {
}
public Student(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
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;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
package com.collection.Test;
import java.util.ArrayList;
import java.util.Collection;
public class StudentTest {
public static void main(String[] args) {
Collection<Student> students=new ArrayList<>();
students.add(new Student("小马哥",34,180.5));
students.add(new Student("小飞侠",44,170.5));
students.add(new Student("马奎斯",24,190.5));
students.add(new Student("罗西",54,189.5));
for (Student student : students) {
System.out.println(student.getName()+"\t"+student.getAge()+"\t"+student.getHeight());
}
}
}
/*
小马哥 34 180.5
小飞侠 44 170.5
马奎斯 24 190.5
罗西 54 189.5
*/
四、List接口
List系列集合特点
- ArrayList、LinekdList :有序,可重复,有索引。
List的实现类的底层原理
- ArrayList底层是基于数组实现的,根据查询元素快,增删相对慢。
- LinkedList底层基于双链表实现的,查询元素慢,增删首尾元素是非常快的。
1.Arraylist类
方法名称 | 说明 |
---|---|
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
案例分析:
package com.list;
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
//创建一个List集合对象
List<String> list=new ArrayList();
list.add("小马哥");
list.add("小飞侠");
list.add("马奎斯");
list.add("小马哥");
//在某个索引插入元素
list.add(1,"罗西");
System.out.println(list); //[小马哥, 罗西, 小飞侠, 马奎斯, 小马哥]
//根据索引删除元素
list.remove(1);
System.out.println(list); //[小马哥, 小飞侠, 马奎斯, 小马哥]
//根据索引获取元素
System.out.println(list.get(2)); //马奎斯
//修改某索引的元素
list.set(1,"科比");
System.out.println(list); //[小马哥, 科比, 马奎斯, 小马哥]
}
}
2.List遍历方式
- for循环
- iterator迭代器
- 增强for循环
案例分析:
package com.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//List遍历方式
public class ListTest2 {
public static void main(String[] args) {
List<String> list=new ArrayList();
list.add("小马哥");
list.add("小飞侠");
list.add("马奎斯");
list.add("小马哥");
//for循环
for (int i = 0; i <list.size() ; i++) {
String s = list.get(i);
System.out.println(s);
}
System.out.println();
//iterator迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()){
String s = it.next();
System.out.println(s);
}
System.out.println();
//增强for循环
for (String s : list) {
System.out.println(s);
}
}
}
/*
小马哥
小飞侠
马奎斯
小马哥
小马哥
小飞侠
马奎斯
小马哥
小马哥
小飞侠
马奎斯
小马哥
*/
3.List遍历删除相同元素
package com.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//遍历删除相同元素
public class ListTest3 {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
System.out.println(list); //[a, b, b, c, d, e]
//迭代器删除元素
/* Iterator<String> it = list.iterator();
while (it.hasNext()){
String s = it.next();
if ("b".equals(s)){
it.remove(); //使用迭代器删除保证不后移
}
}
System.out.println(list); //[a, c, d, e]*/
//for循环删除元素(方式一)
/*for (int i = 0; i <list.size() ; i++) {
String s = list.get(i);
if ("b".equals(s)){
list.remove("b");
i--;
}
}
System.out.println(list); //[a, c, d, e]*/
//for循环删除元素(方式二)
for (int i =list.size()-1; i >=0 ; i--) {
String s = list.get(i);
if ("b".equals(s)){
list.remove("b");
}
}
System.out.println(list); //[a, c, d, e]
}
}
4.LinkedList类
package com.list;
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
//LinkedList可以完成队列结构和栈结构
//栈
LinkedList<String> ll=new LinkedList<>();
//入栈
ll.addFirst("第一块积木");
ll.addFirst("第二块积木");
ll.addFirst("第三块积木");
ll.addFirst("第四块积木");
ll.addFirst("第五块积木");
System.out.println(ll);
//出栈
System.out.println(ll.removeFirst());
System.out.println(ll.removeFirst());
System.out.println(ll.removeFirst());
System.out.println(ll.removeFirst());
System.out.println(ll);
/*
[第五块积木, 第四块积木, 第三块积木, 第二块积木, 第一块积木]
第五块积木
第四块积木
第三块积木
第二块积木
[第一块积木]
*/
//队列
LinkedList<String> ll1=new LinkedList<>();
//入队
ll1.addLast("1");
ll1.addLast("2");
ll1.addLast("3");
ll1.addLast("4");
ll1.addLast("5");
System.out.println(ll1);
//出队
System.out.println(ll1.removeLast());
System.out.println(ll1.removeLast());
System.out.println(ll1.removeLast());
System.out.println(ll1.removeLast());
System.out.println(ll1);
/*
[1, 2, 3, 4, 5]
5
4
3
2
[1]
*/
}
}
五、set接口
Set系列集合特点
- 无序:存取顺序不一致不重复:可以去除重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
Set集合实现类特点
-
- HashSet:无序、不重复、无索引。
- LinkedHashSet:有序、不重复、无索引。
- TreeSet:排序、不重复、无索引。
- set集合的功能上基本上与collection的API一致。
1.HashSet类
- HashSet:无序、不重复、无索引。
案例分析:
package com.set.hashSet;
import java.util.HashSet;
import java.util.Set;
public class Test1 {
public static void main(String[] args) {
Set<String> sets=new HashSet<>();
sets.add("小马哥");
sets.add("小飞侠");
sets.add("马奎斯");
sets.add("罗西");
System.out.println(sets); //[马奎斯, 小马哥, 罗西, 小飞侠]
}
}
综合案例分析:
package com.set.hashSet;
public class Student {
private String name;
private int age;
private char sex;
public Student() {
}
public Student(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
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;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
if (sex != student.sex) return false;
return name.equals(student.name);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + age;
result = 31 * result + (int) sex;
return result;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}
package com.set.hashSet;
import java.util.HashSet;
import java.util.Set;
public class StudentTest {
public static void main(String[] args) {
Set<Student> sets=new HashSet<>();
sets.add(new Student("小马哥",34,'男'));
sets.add(new Student("小马哥",34,'男'));
sets.add(new Student("小飞侠",24,'女'));
System.out.println(sets); //[Student{name='小飞侠', age=24, sex=女}, Student{name='小马哥', age=34, sex=男}]
}
}
注意:
如果希望Set集合认为2个内容相同的对象是重复的应该怎么办?
重写对象的hashCode和equals方法。
2.TreeSet类
- TreeSet:排序、不重复、无索引。
案例分析:
package com.set.TreeSet;
import java.util.Set;
import java.util.TreeSet;
public class Test1 {
public static void main(String[] args) {
Set<Integer> s1=new TreeSet<>(); //无序,不重复,可排序
s1.add(21);
s1.add(12);
s1.add(12);
s1.add(1);
s1.add(56);
s1.add(45);
System.out.println(s1); //[1, 12, 21, 45, 56]
Set<String> s2=new TreeSet<>(); ////无序,不重复,可排序
s2.add("小马哥");
s2.add("A");
s2.add("Z");
s2.add("D");
s2.add("z");
s2.add("a");
System.out.println(s2); //[A, D, Z, a, z, 小马哥]
}
}
1.自然排序和比较器排序
- 自定义排序规则
- TreeSet集合存储对象的的时候有2种方式可以设计自定义比较规则
方式一
- 让自定义的类(如学生类)实现comparable接口重写里面的compareTo方法来定制比较规则。
方式二
- TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。
案例分析:
package com.set.TreeSet;
public class Student implements Comparable<Student> {
private String name;
private int age;
private double score;
public Student(String name) {
this.name = name;
}
public Student(String name, int age, double score) {
this.name = name;
this.age = age;
this.score = score;
}
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;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
//第一种类定义比较规则
@Override
public int compareTo(Student o) {
//按照年龄排序
//return this.getAge()-o.getAge(); //去掉了年龄相同的元素
//[Student{name='小马哥', age=23, score=99.9}, Student{name='马奎斯', age=34, score=70.9}, Student{name='罗西', age=44, score=85.5}]
return this.getAge()-o.getAge()>=0?1:-1; //保留了年龄相同的元素
//[Student{name='小马哥', age=23, score=99.9}, Student{name='小飞侠', age=23, score=89.5}, Student{name='马奎斯', age=34, score=70.9}, Student{name='罗西', age=44, score=85.5}]
}
}
package com.set.TreeSet;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class StudentTest {
public static void main(String[] args) {
//集合自带比较器对象进行规则制定
Set<Student> s=new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// return (int) (o1.getScore()-o2.getScore()); //升序
return (int) (o2.getScore()-o1.getScore()); //降序
//[Student{name='小马哥', age=23, score=99.9}, Student{name='小飞侠', age=23, score=89.5}, Student{name='罗西', age=44, score=85.5}, Student{name='马奎斯', age=34, score=70.9}]
}
});
s.add(new Student("小马哥",23,99.9));
s.add(new Student("小飞侠",23,89.5));
s.add(new Student("马奎斯",34,70.9));
s.add(new Student("罗西",44,85.5));
System.out.println(s);
}
}
注意:
两种方式中,关于返回值的规则:
-
- 如果认为第一个元素大于第二个元素返回正整数即可。
- 如果认为第一个元素小于第二个元素返回负整数即可。
- 如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复。
注意:
- 如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序。
六、可变参数
可变参数
- 可变参数用在形参中可以接收多个数据。
- 可变参数的格式:数据类型...参数名称可变参数的作用
传输参数非常灵活,方便。可以不传输参数,可以传输1个或者多个,也可以传输一个数组
- 可变参数在方法内部本质上就是一个数组。
- 可变参数的注意事项:
- 一个形参列表中可变参数只能有一个
- 可变参数必须放在形参列表的最后面
案例分析:
package com.params;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//不传参数
//sum();
//可以传一个参数
sum(12);
//可以传多个参数
sum(23,34,45);
//可以传一个数组
//sum(new int[]{12,23,34,45});
}
public static void sum(int age,int ... num){
System.out.println("元素个数:"+num.length);
System.out.println("元素内容:"+ Arrays.toString(num));
}
}
/*
元素个数:0
元素内容:[]
元素个数:1
元素内容:[12]
元素个数:3
元素内容:[23, 34, 45]
元素个数:4
元素内容:[12, 23, 34, 45]
*/
七、集合操作的工具类Collections
collections排序相关API
- 使用范围:只能对于List集合的排序。
- 排序方式1:
方法名称 | 说明 |
---|---|
public static void sort(List list) | 将集合中元素按照默认规则排序 |
- 注意:本方式不可以直接对自定义类型的List集合排序,除非自定义类型实现了比较规则Comparable接口。
- 排序方式2:
方法名称 | 说明 |
---|---|
public static void sort(List list,Comparator<? super T> c) | 将集合中元素按照指定规则排序 |
案例分析:
package com.collection.collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
/*list.add("小马哥");
list.add("小飞侠");
list.add("马奎斯");
list.add("罗西");*/
//批量添加元素
Collections.addAll(list,"小马哥","小飞侠","马奎斯","罗西"); //[小马哥, 小飞侠, 马奎斯, 罗西]
System.out.println(list);
//打乱集合顺序
Collections.shuffle(list);
System.out.println(list); //[马奎斯, 小飞侠, 罗西, 小马哥]
//将集合中元素按默认规则排序
List<Integer> l=new ArrayList<>();
Collections.addAll(l,12,34,23,78,99,35);
Collections.sort(l);
System.out.println(l); //[12, 23, 34, 35, 78, 99]
//将集合中元素按指定规则排序
}
}
八、Map接口
1.Map集合概述
- Map集合是一种双列集合,每个元素包含两个数据。
- Map集合的每个元素的格式: key=value(键值对元素)。
- Map集合也被称为“键值对集合”。
Map集合整体格式:
- Collection集合的格式:[元素1,元素2,元素3..]
- Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}
Map集合体系特点
- Map集合的特点都是由键决定的。
- Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
- Map集合后面重复的键对应的值会覆盖前面重复键的值。
- Map集合的键值对都可以为null。
Map集合实现类特点
- HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
- LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
案例分析:
package com.map;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String,Integer> m=new HashMap<>();
m.put("小马哥",33);
m.put("小飞侠",44);
m.put("马奎斯",33);
m.put("罗西",45);
m.put(null,null);
System.out.println(m); //{null=null, 马奎斯=33, 小马哥=33, 罗西=45, 小飞侠=44}
}
}
2.Map集合API
Map集合
- Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
方法名称 | 说明 |
---|---|
v put(K key,v value) | 添加元素 |
v remove(0bject key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(0bject key) | 判断集合是否包含指定的键 |
boolean containsValue(0bject value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
案例分析:
package com.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test1 {
public static void main(String[] args) {
//创建Map集合
Map<String,Integer> m=new HashMap<>();
//添加元素
m.put("小马哥",33);
m.put("小飞侠",44);
m.put("马奎斯",33);
m.put("罗西",45);
//清空集合
//m.clear();
//System.out.println(m); //{}
//判断集合是否为空
System.out.println(m.isEmpty()); //false
//根据键获取对应的值
Integer i = m.get("小马哥");
System.out.println(i); //33
//根据键删除整个元素
System.out.println(m.remove("小马哥")); //33
System.out.println(m); //{马奎斯=33, 罗西=45, 小飞侠=44}
//判断是否包含某个键
System.out.println(m.containsKey("罗西")); //true
System.out.println(m.containsKey("小马哥")); //false
//判断是否包含某个值
System.out.println(m.containsValue(45)); //true
//获取全部键的集合
Set<String> keySet = m.keySet();
System.out.println(keySet); //[马奎斯, 罗西, 小飞侠]
//获取全部值的集合
Collection<Integer> values = m.values();
System.out.println(values); //[33, 45, 44]
//集合的大小
System.out.println(m.size()); //3
//合并其他Map集合
Map<String,Integer> m1=new HashMap<>();
m1.put("a",1);
m1.put("b",2);
Map<String,Integer> m2=new HashMap<>();
m1.put("c",3);
m1.put("d",4);
m1.putAll(m2); //把m2中的元素合并到m1中
System.out.println(m1); //{a=1, b=2, c=3, d=4}
}
}
3.Map集合遍历方式
1.键找值
- 先获取Map集合的全部键的Set集合。
- 遍历键的Set集合,然后通过键提取对应值。
方法名称 | 说明 |
---|---|
Set<K> keySet() |
获取所有键的集合 |
V get(Object key) | 根据键获取值 |
案例分析:
package com.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test2 {
public static void main(String[] args) {
Map<String,Integer> m=new HashMap<>();
//添加元素
m.put("小马哥",33);
m.put("小飞侠",44);
m.put("马奎斯",33);
m.put("罗西",45);
//键找值
//先获取所有的键
Set<String> keys = m.keySet();
for (String key : keys) {
Integer values = m.get(key);
System.out.println(key+"="+values);
}
}
}
/*
马奎斯=33
小马哥=33
罗西=45
小飞侠=44
*/
2.键值对
- 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了。
- 遍历Set集合,然后提取键以及提取值。
- 键值对涉及到的API:
方法名称 | 说明 |
---|---|
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
K getKey() | 获得键 |
v getValue() | 获取值 |
案例分析:
package com.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test3 {
public static void main(String[] args) {
Map<String,Integer> m=new HashMap<>();
//添加元素
m.put("小马哥",33);
m.put("小飞侠",44);
m.put("马奎斯",33);
m.put("罗西",45);
//把Map集合转换为set集合
Set<Map.Entry<String, Integer>> entries = m.entrySet();
//for遍历
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
/*
马奎斯=33
小马哥=33
罗西=45
小飞侠=44
*/
注意:
如果希望元素可以重复,又有索引,索引查询要快?
- 用ArrayList集合,基于数组的。(用的最多)
如果希望元素可以重复,又有索引,增删首尾操作快?
- 用LinkedList集合,基于链表的。
如果希望增删改查都快,但是元素不重复、无序、无索引。
- 用HashSet集合,基于哈希表的。
如果希望增删改查都快,但是元素不重复、有序、无索引。
- 用LinkedHashSet集合,基于哈希表和双链表。
如果要对对象进行排序。
- 用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。