目录
2.采用带参数的构造方法 参数类型为Comparator(抽象类)的实现类
一、集合简介
集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。Java集合类是Java将一些基本的和使用频率极高的基础类进行封装和增强后再以一个类的形式提供。集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适合不同的场合,用以解决一些实际问题。
二、集合分类
Collection 接口(单列集合总接口)
Collection是一个基本的集合接口,Collection中可以容纳一组集合元素(Element),Collection有两个重要的子接口List和Set。List表达一个有序的集合,List中的每个元素都有索引,使用此接口能够准确的控制每个元素插入的位置。用户也能够使用索引来访问List中的元素,List类似于Java的数组。Set接口的特点是不能包含重复的元素。对Set中任意的两个元素element1和element2都有elementl.equals(element2)= false。另外,Set最多有一个null元素。
Map 接口(双列集合总接口)
Map没有继承Collection接口,与Collection是并列关系。Map提供键(key)到值(value)的映射。一个Map中不能包含相同的键,每个键只能映射一个值。
三、集合特点
1.List集合特点
有索引值、元素有放入顺序、元素可重复。
(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
2.Set集合特点
没有索引值,不能重复。
(1)HashSet:底层数据结构是哈希表,无序,储存元素不重复。
(2)LinkedHashSet:底层是链表+哈希表,有序,储存元素不重复。
(3)TreeSet:底层实现为二叉树,元素默认按升序排序。
3.Map集合特点
一个元素由(key,value)两部分组成,(k,v)可以是任意引用数据类型,一个k对应唯一一个v,且k不能重复。
(1)HashMap:底层是哈希表,无序,储存元素不重复。
(2)LinkedHashMap:底层是哈希表+链表,有序,储存元素不重复。
(3)TreeMap:底层是红黑树,可排序,储存元素不重复。
四、集合增删查改和遍历方式
1、常用增删查改方法
public class Test01 {
public static void main(String[] args) {
//List集合
ArrayList<String> list = new ArrayList<>();
//添加元素
list.add("Tom");
list.add("Lisa");
list.add("Andy");
//移除元素
list.remove("Andy");
//查询元素是否存在
list.contains("Young");
//查询索引为1的元素
list.get(1);
//修改元素 将索引为0的元素修改为“Wells”
list.set(0, "Wells");
System.out.println("---------------------");
//Set集合
HashSet<String> list1 = new HashSet<>();
//添加元素
list1.add("小李");
list1.add("小王");
list1.add("小武");
//移除
list1.remove("小李");
//查询元素是否存在
list1.contains("小李");
//修改 先删再加
System.out.println("---------------------");
//Map集合
HashMap<String,Integer>list2 = new HashMap<>();
//添加元素
list2.put("Jim", 20);
list2.put("Lisa", 20);
list2.put("Tom", 20);
//移除元素
list2.remove("Tom");
//查询元素
list2.get("Lisa");
//修改
list2.replace("Jim", 88);
}
}
2、遍历方式
public class Test02 {
public static void main(String[] args) {
//以Map为例演示 遍历Map需要先将双列转换成单列再遍历
HashMap<String,Integer>list = new HashMap<>();
list.put("AAA", 10);
list.put("BBB", 13);
list.put("CCC", 25);
list.put("DDD", 9);
list.put("EEE", 34);
//我们可以获取以key值组成的Set集合
Set<String> keySet = list.keySet();
//后面的遍历方式与Collection接口下的集合相同就不重复演示
//方式一、增强for遍历
for (String str : keySet) {
list.get(str);
System.out.println(str+" "+list.get(str)+" ");
}
//方式二、迭代器遍历
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()) {
String key = iterator.next();
list.get(key);
System.out.println(key+" "+list.get(key)+" ");
}
//方式三、通过stream 遍历
Stream<String> stream = keySet.stream();
stream.forEach((String k)->{System.out.println(k+" "+list.get(k)+" ");});
}
}
五 向TreeSet或TreeMap集合添加元素的注意事项
1、采用无参构造器创建对象
添加的元素必须是Comparable接口的实现类,因为TreeSet或TreeMap集合是会进行排序的如果没有比较方法无法正常排序。
2.采用带参数的构造方法 参数类型为Comparator(抽象类)的实现类
public class Test03 {
public static void main(String[] args) {
Comparator comparator = new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//按成绩升序排序
return s1.getScore()-s2.getScore();
}
};
TreeSet<Student> list = new TreeSet<Student>(comparator);
list.add(new Student("aa", 70));
list.add(new Student("bb", 40));
list.add(new Student("cc", 90));
list.add(new Student("dd", 60));
System.out.println(list);
TreeMap<Student,String> list1 = new TreeMap<Student,String>(comparator);
list1.put(new Student("小李", 80), "三班");
list1.put(new Student("小华", 60), "四班");
list1.put(new Student("小张", 90), "二班");
list1.put(new Student("小武", 70), "一班");
System.out.println(list1);
}
}
class Student{
private String name;
private int score;
public Student() {
}
public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", score=" + score + "]";
}
}
在Collections工具类中有个排序方法sort也有类似的用法,一种是传入List集合,但集合元素是Comparable的实现类,第二种就是传入List集合和比较器Comparator。
3.Comparable和Comparator的区别
Comparable是在集合内部定义的方法实现的排序,位于java.lang下。
Comparator是在集合外部实现的排序,位于java.util下。
Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。
如有问题请多指教