【转】Collection接口,List(ArrayList集合,LinkedList集合),Set(HashSet集合,LinkedHashSet集合,TreeSet集合)
Collection
集合概述:
- 集合作为容器用来存储,管理大量的对象(引用),这些集合内部用了不同的数据结构来存储元素,这些数据结构的不同导致了每种集合的增删改查效率不同。
- 内部存储的只能是“对象引用”,子类使用多态存储基本数据类型时,泛型需要使用他们对应的包装类。
Java常用集合体系:
Collection接口的常用方法
由于Collection是一个接口,所以该类中全部都是抽象方法,调用时会使用多态(父类型引用指向子类型对象)。主要了解这些方法的作用。
增:
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();//把集合中的元素储存在数组中。
- 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).可以通过索引访问;(因为有序的)
新增方法:
- 增:public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
- 删:public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
- 改:public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
- 查:public E get(int index) :返回集合中指定位置的元素。
共同特点是都带了“索引”的参数!
ArrayList集合:
- 底层是数组。
- 扩容机制:扩容后是原容量的1.5倍,初始容量为10.
- 没有新增方法。使用的都是List和Collection中的定义的方法
- 作用跟“数组”一样,作为“容器”,存储、管理大量的“对象(引用)”。
- 查询效率高,增删效率低
常用方法
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集合:
- 底层是链表结构(增删快,查询慢)
- 无扩容机制
新增(常用)方法:
- public E pop() :从此列表所表示的堆栈处弹出一个元素。【弹栈】
- public void push(E e) :将元素推入此列表所表示的堆栈【压栈】
- 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 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集合
- 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集合
- 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