【转】Collection接口,List(ArrayList集合,LinkedList集合),Set(HashSet集合,LinkedHashSet集合,TreeSet集合)

Collection

集合概述:

  1. 集合作为容器用来存储,管理大量的对象(引用),这些集合内部用了不同的数据结构来存储元素,这些数据结构的不同导致了每种集合的增删改查效率不同。
  2. 内部存储的只能是“对象引用”,子类使用多态存储基本数据类型时,泛型需要使用他们对应的包装类。
    Java常用集合体系:
    在这里插入图片描述

Collection接口的常用方法

由于Collection是一个接口,所以该类中全部都是抽象方法,调用时会使用多态(父类型引用指向子类型对象)。主要了解这些方法的作用。

增:

public boolean add(E e);//把给定的对象添加到集合中

删:

  1. public void clear();//清空集合中所有元素。
  2. public boolean remove(E e);//把给定的对象在集合中删除

改:【无】

查:

  1. public boolean contains(Object obj);//判断当前集合是否包含给定元素
  2. public boolean isEmpty();//判断集合是否为空
  3. public int size();//返回当前集合元素的个数。
  4. public Object[] toArray();//把集合中的元素储存在数组中。
  5. public Iterator iterator();//获取一个迭代器,用于遍历集合元素
代码演示:
 1 package Collection集合的增删改查Test;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Collection;
 5 
 6 public class Demo01 {
 7     public static void main(String[] args) {
 8         //多态,父类型引用指向子类型对象
 9 
10         Collection<String> list = new ArrayList<String>();
11         //增:
12         //调用子类ArrayList重写的add方法:向集合中添加元素
13         list.add("张三");
14         list.add("李四");
15         list.add("王五");
16         list.add("赵六");
17         list.add("冯七");
18         for (String s:list) {
19             System.out.println(s);
20         }
21         //删:
22         //clear()删除集合中所有元素:
23         //list.clear();
24         System.out.println(list.size());
25         //remove(E e):将给定的元素在集合中删除。返回boolean值
26         list.remove("张三");
27         System.out.println("移除后元素有:");
28         for(String s:list){
29             System.out.println(s);
30         }
31         //改【无】
32         //查:
33         //contains(Object obj):查询给定元素是否存在集合中,返回boolean
34         boolean boo = list.contains("李四");
35         System.out.println(boo);
36         //isEmpty():判断集合是否为空,返回boolean;
37         boo = list.isEmpty();
38         System.out.println(boo);
39         //size()返回集合中元素的个数:
40         int sum = list.size();
41         System.out.println(sum);
42         //toArray():把集合元素储存在数组中;返回一个Object[]数组
43         Object[] obj = list.toArray();
44         for (int i = 0; i <obj.length ; i++) {
45             System.out.println(obj[i]);
46         }
47     }
48 }

List(接口)集合-继承Collection接口

List继承了Collection接口的方法

List集合的特点:

1).有序的;

2).可以存储重复元素;(不验证元素的重复性)

3).可以通过索引访问;(因为有序的) 

新增方法:

  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) :返回集合中指定位置的元素。
    共同特点是都带了“索引”的参数!

ArrayList集合:

  1. 底层是数组。
  2. 扩容机制:扩容后是原容量的1.5倍,初始容量为10.
  3. 没有新增方法。使用的都是List和Collection中的定义的方法
  4. 作用跟“数组”一样,作为“容器”,存储、管理大量的“对象(引用)”。
  5. 查询效率高,增删效率低

常用方法

1).增:

1).public boolean add(E e):向集合添加一个元素。返回值:对于ArrayList,永远返回true。

2).public void add(int index,E e):向集合的index位置插入元素e。

2).删:

3). public boolean remove(Object o):从集合中移出参数o。删除成功返回true,否则返回false。

4). public E remove(int index):从集合中移出index位置上的元素。

3).改:

5).public E set(int index,E e):用e替换当前集合中index位置上的元素,将“被替换的元素返回”。

4).查:

6). public E get(int index):获取index位置上的元素;

7). public int size():获取集合大小。和get()方法结合,就可以对集合进行遍历了。

代码演示:

测试类

 1 package com.itheima.demo02_ArrayList概述;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class Demo02 {
 6     public static void main(String[] args) {
 7         Student stu1 = new Student(1, "张三", 20);
 8         Student stu2 = new Student(2, "李四", 19);
 9         Student stu3 = new Student(3, "王五", 22);
10 
11         //1.创建一个ArrayList集合对象
12         ArrayList<Student> stuList = new ArrayList<>();
13 
14         //1).添加:add(E e)
15         stuList.add(stu1);//相当于:arr[0] = stu1;
16         stuList.add(stu2);//相当于:arr[1] = stu2;
17         stuList.add(stu3);//相当于:arr[2] = stu3;
18 
19         stuList.add(new Student(4, "周六", 21));//第四个元素:相当于:arr[3] = new Student(4,"周六",21);
20 
21         //2).添加:add(int index,E e)
22         //向"李四"的前面插入一个new Student(5,"成龙",22);
23         stuList.add(1, new Student(5, "成龙", 22));
24 
25 
26         //3).删除:remove(Object o):
27         System.out.println("删除stu1:" + stuList.remove(stu1));
28 
29         System.out.println(stuList);
30 
31         //4).public E remove​(int index)
32         System.out.println("删除索引0的元素:" + stuList.remove(0));
33 
34 
35         //5).public E set(int index,E e)
36         //将"王五"替换为:new Student(6,"柳岩",18);
37         System.out.println("替换索引为1替换为'柳岩':" + stuList.set(1, new Student(6, "柳岩", 18)));
38 
39 
40         //6).public E get(int index)
41         System.out.println("获取索引为1的元素:" + stuList.get(1));
42 
43         //7).public int size()
44         System.out.println("集合大小:" + stuList.size());
45 
46         //8).size() + get()对集合遍历
47         for(int i = 0; i < stuList.size() ; i++) {
48             Student stu = stuList.get(i);
49             System.out.println(stu);
50         }
51         //8.1使用iterator迭代器进行遍历:
52         Iterator it = stuList.iterator();
53         while(it.hasNext()){
54             System.out.prinltn(it.next());
55         }
56         //8.2使用foreach(for增强循环)进行遍历:
57         for(Student s : stuList){
58             System.out.println(s);
59         }
60 
61         //9).public int indexOf(Object o):查询参数对象在集合中的索引位置
62         System.out.println("stu2的索引:" + stuList.indexOf(stu2));
63     }
64 }

Student学生类

 1 package com.itheima.demo02_ArrayList概述;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6     private int age;
 7 
 8     public Student() {
 9     }
10 
11     public Student(int id, String name, int age) {
12         this.id = id;
13         this.name = name;
14         this.age = age;
15     }
16 
17     public int getId() {
18         return id;
19     }
20 
21     public void setId(int id) {
22         this.id = id;
23     }
24 
25     public String getName() {
26         return name;
27     }
28 
29     public void setName(String name) {
30         this.name = name;
31     }
32 
33     public int getAge() {
34         return age;
35     }
36 
37     public void setAge(int age) {
38         this.age = age;
39     }
40 
41     @Override
42     public String toString() {
43         return "Student{" +
44                 "id=" + id +
45                 ", name='" + name + '\'' +
46                 ", age=" + age +
47                 '}';
48     }
49 }

LinkedList集合:

  1. 底层是链表结构(增删快,查询慢)
  2. 无扩容机制

新增(常用)方法:

  1. public E pop() :从此列表所表示的堆栈处弹出一个元素。【弹栈】
  2. public void push(E e) :将元素推入此列表所表示的堆栈【压栈】
  3. public void addLast(E e):将元素添加到当前队列的末尾【排队】,跟add()方法一样。
代码演示:
 1     public class Demo02 {
 2     public static void main(String[] args) {
 3         //1.定义一个LinkedList集合
 4         LinkedList<String> list = new LinkedList<>();
 5 
 6         //2.模拟"栈"
 7 //        list.addFirst("aaa");
 8         list.push("aaa");
 9         list.push("bbb");
10         list.push("ccc");
11 
12         System.out.println("初始集合大小:" + list.size());
13         //3.弹栈
14         while (list.size() > 0) {
15             System.out.println(list.pop());
16         }
17 
18         System.out.println("----------------------------");
19         //******************************************************************//
20         //模拟队列
21         LinkedList<String> list2 = new LinkedList<>();
22         list2.addLast("aaa");//用add()也可以
23         list2.addLast("bbb");
24         list2.addLast("ccc");
25 
26         //遍历取出
27         while (list2.size() > 0) {
28             System.out.println(list2.pop());
29         }
30     }
31 }
LinkedList源码图解

在这里插入图片描述

Set接口–继承Collection接口

1).Set集合的特点:

1).无序

2).不能存储重复元素

3).不能通过“索引”访问元素。

 

2).它没有新增方法,都是Collection的。

HashSet集合

代码演示:HashSet集合存储字符串

 1     public class Demo07 {
 2     public static void main(String[] args) {
 3         //1.定义一个Set集合
 4         Set<String> set = new HashSet<>();
 5 
 6         set.add("郭德纲");
 7         set.add("于谦");
 8         set.add("杨幂");
 9         set.add("迪丽热巴");
10         set.add("迪丽热巴");//不存储重复元素
11         set.add("郭德纲");//不存储重复元素
12         
13         System.out.println(set);//[于谦, 郭德纲, 迪丽热巴, 杨幂]——无序的
14         //1.可以使用"迭代器"遍历
15         Iterator<String> it = set.iterator();
16         while (it.hasNext()) {
17             System.out.println(it.next());
18         }
19         System.out.println("------------------------------");
20         //2.可以使用"增强for"遍历
21         for (String s : set) {
22             System.out.println(s);
23         }
24     }
25 }

代码演示:HashSet存储自定义对象

自定义类(需要重写hashCode()和equals()):

 1 public class Student {
 2     private String name;
 3     private int age;
 4 
 5     public Student(String name, int age) {
 6         this.name = name;
 7         this.age = age;
 8     }
 9     public String getName() {
10         return name;
11     }
12     public void setName(String name) {
13         this.name = name;
14     }
15     public int getAge() {
16         return age;
17     }
18     public void setAge(int age) {
19         this.age = age;
20     }
21     @Override
22     public String toString() {
23         return "Student{" +
24                 "name='" + name + '\'' +
25                 ", age=" + age +
26                 '}';
27     }
28 
29     @Override
30     public boolean equals(Object o) {
31         System.out.println("equals()...");
32         if (this == o) return true;
33         if (o == null || getClass() != o.getClass()) return false;
34         Student student = (Student) o;
35         return age == student.age &&
36                 Objects.equals(name, student.name);
37     }
38 
39     @Override
40     public int hashCode() {
41         System.out.println("hashCode()...");
42         return Objects.hash(name, age);
43     }
44 }

 

  1. 测试类:
     1 public class Demo08 {
     2     public static void main(String[] args) {
     3         //1.定义一个Set
     4         Set<Student> stuSet = new HashSet<>();
     5 
     6         stuSet.add(new Student("张三", 18));
     7         stuSet.add(new Student("李四", 19));
     8 
     9         stuSet.add(new Student("李四", 19));//如果重写了hashCode()和equals(),不存储
    10 
    11         for (Student stu : stuSet) {
    12             System.out.println(stu);//只有两个元素。
    13         }
    14     }
    15 }
    代码图解(哈希表结构)

    在这里插入图片描述

    LinkedHashSet集合

    1. LinkedHashSet:链表 + 哈希表结构,它是Set特例,它是“有序的”但仍然不能通过“索引”访问。
    代码演示:
     1 public class Demo09 {
     2     public static void main(String[] args) {
     3         LinkedHashSet<String> set = new LinkedHashSet<>();
     4         set.add("郭德纲");
     5         set.add("于谦");
     6         set.add("杨幂");
     7         set.add("迪丽热巴");
     8         set.add("迪丽热巴");//不能存储重复元素【哈希表结构】
     9 
    10         for (String s : set) {
    11             System.out.println(s);//有序的【链表结构】
    12         }
    13     }
    14 }

    TreeSet集合

    1. TreeSet:红黑树结构(平衡二叉树)
    代码演示:
     1     public class Demo10 {
     2     public static void main(String[] args) {
     3         TreeSet<Integer> treeSet = new TreeSet<>();
     4 
     5         treeSet.add(60);
     6         treeSet.add(10);//它内部的"比较"是基于对象的compareTo()方法
     7         treeSet.add(20);
     8         treeSet.add(70);
     9         treeSet.add(15);
    10         treeSet.add(18);
    11         treeSet.add(55);
    12         treeSet.add(55);//不存
    13 
    14         //遍历
    15         for (Integer n : treeSet) {
    16             System.out.println(n);
    17         }
    18     }
    19 }

    转自于原文链接:https://blog.csdn.net/weixin_45144691/article/details/107343478

posted @ 2020-10-30 10:54  A_xiba  阅读(84)  评论(0编辑  收藏  举报