• Java---单列集合详解


    目录

    一、单列集合的介绍

    二、单列集合的使用

    1:关于Collection

    (1)迭代器遍历

    (2)增强for循环遍历

    (3)Lambda表达式遍历 

    2:List的使用

    (1)ArrayList的使用

    (2)LinkedList的使用

    2:Set的使用

    (1)HashSet的使用

     (2)LinkedHashSet的使用

    (3)TreeSet的使用


    一、单列集合的介绍

    单列集合我们可以把它理解成是一个储存数据的容器,任何类型都可以。单列集合包括有两大类。一个是Set,,一个是List。它们共同继承了Collection接口,并且在他们之下还有ArraryList,LinkedList,Vector,HashSet和TreeSet子类。总的来说它们就是帮我们存储数据的容器而已。

    List的特点:有序,可重复,有索引

    Set的特点:无序,不重复,无索引

    二、单列集合的使用

    1:关于Collection

    因为单列集合四是继承了Collection接口的,所以Collection的方法单列集合都是可以使用的。

    Collection方法:

    1. add(E e) 在末尾添加元素,返回值是boolean型,添加成功返回true
    2. remove(E e) 删除指定的元素,注意是元素,而不是下标,返回值是boolean型,删除成功返回true
    3. isEmpty() 判断集合是否为空,返回值是boolean
    4. clear() 清空集合,void类型无返回值
    5. size() 返回集合大小,返回值是int
    6. contains(E e) 判断元素是否存在于集合中,返回值是boolean

    我们知道了Set集合是无索引的,但是List集合是有索引的,遍历的话List可以通过索引,那么Set该如何遍历呢?所以我们就要学习通用的Collection遍历了。

    Colletion的三种遍历方式:

    (1)迭代器遍历

    迭代器,什么是迭代器呢?如果学过C语言的话就可以将它理解成是指针。没学过的话不要紧,之前不是说集合就相当于是个容器吗,那么集合就是一个很大的容器,其中的元素我们当成是一个一个的小容器,放在大容器中。那么现在我们想找到其中一个小容器,这时候迭代器就有用处了,它就相当于是一个箭头,指着某一个小容器,当我们获取迭代器时,我们就可以获得迭代器指向的该小容器获得元素,想要遍历只要控制好迭代器就好了。

    1. package article;
    2. import java.util.Collection;
    3. import java.util.*;
    4. public class first {
    5. public static void main(String[] args) {
    6. Collection s=new ArrayList<>();
    7. s.add("123");
    8. s.add("jkjk");
    9. s.add("iuiui");
    10. s.add("klk");
    11. System.out.println(s);
    12. System.out.println("遍历----------------");
    13. Iterator it=s.iterator();//创建迭代器对象
    14. while(it.hasNext()) {
    15. String h=it.next();//
    16. System.out.println(h);
    17. }
    18. }
    19. }

     

    1. 这里创建了Iterator的对象之后,我们遍历时用到了它的两种方法
    2. hasNext() 判断当前迭代器指向的位置是否有元素
    3. next() 获取迭代器当前指向的元素,并将迭代器往后移动一个位置
    4. 注意啊,使用迭代器遍历时是不能对集合进行增添和删除的

    (2)增强for循环遍历

    增强for循环就是固定格式,大家记住就行了

    1. package article;
    2. import java.util.Collection;
    3. import java.util.*;
    4. public class first {
    5. public static void main(String[] args) {
    6. Collection s=new ArrayList<>();
    7. s.add("123");
    8. s.add("jkjk");
    9. s.add("iuiui");
    10. s.add("klk");
    11. System.out.println(s);
    12. System.out.println("遍历----------------");
    13. for(String h:s) {
    14. //这里的s就是集合,而h就是一个替换的,也就是说将s集合中的每个元素都给了h
    15. System.out.println(h);
    16. }
    17. }
    18. }

    (3)Lambda表达式遍历 

    Lambda也是固定格式,使用的是匿名内部类形式

    1. package article;
    2. import java.util.Collection;
    3. import java.util.*;
    4. public class first {
    5. public static void main(String[] args) {
    6. Collection s=new ArrayList<>();
    7. s.add("123");
    8. s.add("jkjk");
    9. s.add("iuiui");
    10. s.add("klk");
    11. System.out.println(s);
    12. System.out.println("遍历----------------");
    13. s.forEach(h->System.out.println(h));
    14. }
    15. }

    2:List的使用

    List继承了Collection,包括他的方法,当然我们也有一些List常用的方法来掌握

    1. List中常见的方法:
    2. void add(int index,E e) 在集合中指定的下标处添加元素
    3. E remove(int intdex)删除指定下标处的元素,并返回
    4. E set(int index,E e)修改指定下标出的元素,返回被修改的元素
    5. E get(int index)返回指定下标处的元素
    1. package article;
    2. import java.util.Collection;
    3. import java.util.*;
    4. public class first {
    5. public static void main(String[] args) {
    6. List s=new ArrayList<>();
    7. s.add("123");
    8. s.add("opop");
    9. s.add("sdsds");
    10. System.out.println(s);
    11. s.add(1,"mmmmmm");
    12. System.out.println(s);
    13. String ss=s.remove(3);
    14. System.out.println("删除的元素是"+ss+" 现在集合:"+s);
    15. s.set(2,"klklkkkkk");
    16. System.out.println(s);
    17. for(int i=0;i
    18. String h=s.get(i);
    19. System.out.println(h);
    20. }
    21. }
    22. }

    (1)ArrayList的使用

    在之前我已经写过了关于ArrayList的文章:ArrayList的详解 。

    使用ArrayList只要会用Collection的方法就够了

    1. package article;
    2. import java.util.Collection;
    3. import java.util.*;
    4. public class first {
    5. public static void main(String[] args) {
    6. Collection s=new ArrayList<>();
    7. s.add("123");
    8. s.add("jkjk");
    9. s.add("iuiui");
    10. s.add("klk");
    11. System.out.println("该集合的大小="+s.size());
    12. System.out.println(s);
    13. //boolean b=s.remove("123");
    14. //System.out.println("删除:"+b);
    15. System.out.println(s);
    16. boolean bb=s.contains("123");
    17. System.out.println("包含:"+bb);
    18. }
    19. }

    (2)LinkedList的使用

    LinkedList顶层是双链表实现的(其中学过数据结构的同学应该更加了解,一个节点中有元素值同时还有前后节点的地址值,这就是它增删改快的原因),查找慢,但是删增改快。因此它也出现了一些特有的方法

    1. void addFirst(E e) 在该链表开头插入指定的元素
    2. void addLast(E e) 将指定的元素插入到末尾
    3. E getFirst() 获取当前链表中的第一个元素
    4. E getLast() 获取当前链表中的最后一个元素
    5. E removeFirst() 删除该链表中的第一个元素,并返回
    6. E removeLast() 删除该链表中的最后一个元素,并返回
    1. package article;
    2. import java.util.Collection;
    3. import java.util.*;
    4. import java.util.*;
    5. public class first {
    6. public static void main(String[] args) {
    7. LinkedList s=new LinkedList<>();
    8. s.add("122");
    9. s.add("shdj");
    10. s.add(">>>>>>>");
    11. s.addFirst("<<<<<<<-----");
    12. System.out.println(s.getFirst());
    13. }
    14. }

     

     

    2:Set的使用

    Set集合的特点不要忘记了,无序(取出顺序和拿出顺序不一致),无索引(不可再用索引的方法遍历了),不重复(重复的元素,会去除)。Set的基本方法也是和Collection的方法是一致的(原因就是继承啊)

    Set的实现类:

    (1)HashSet:底层实现结构是哈希表,无序不重复,无索引

    (2)LinkedHashSet:有序,不重复,无索引

    (3)TreeSet:可排序,不重复,无索引

    (1)HashSet的使用

    关于HanshSet的特点在强调一遍是无序,不重复,无索引。因为它是无索引的,所以遍历可以用Collection的三种方法来遍历。

    1. package article;
    2. import java.util.Collection;
    3. import java.util.function.Consumer;
    4. import java.util.*;
    5. import java.util.*;
    6. public class first {
    7. public static void main(String[] args) {
    8. Set s=new HashSet<>();
    9. s.add("8989");
    10. s.add("klkl");
    11. s.add(">>>>");
    12. Iterator it=s.iterator();
    13. while(it.hasNext()) {
    14. System.out.println(it.next());
    15. }
    16. System.out.println("-------------");
    17. //增强for
    18. for(String h:s) {
    19. System.out.println(h);
    20. }
    21. System.out.println("---------------");
    22. //Lambda表达式
    23. s.forEach(new Consumer() {
    24. public void accept(String st) {
    25. System.out.println(st);
    26. }
    27. });
    28. }
    29. }

    如果添加的类型是自写的,在自写类中需要重写equals和HashCode方法,因为equals比较的是地址值。 

    1. package article;
    2. import java.util.Objects;
    3. public class student {
    4. String name;
    5. int age;
    6. public student(String name,int age) {
    7. this.age=age;
    8. this.name=name;
    9. }
    10. public void setname(String name) {
    11. this.name=name;
    12. }
    13. public void setage(int age) {
    14. this.age=age;
    15. }
    16. public String getname() {
    17. return name;
    18. }
    19. public int getage() {
    20. return age;
    21. }
    22. @Override
    23. public int hashCode() {
    24. return Objects.hash(age, name);
    25. }
    26. @Override
    27. public boolean equals(Object obj) {
    28. if (this == obj)
    29. return true;
    30. if (obj == null)
    31. return false;
    32. if (getClass() != obj.getClass())
    33. return false;
    34. student other = (student) obj;
    35. return age == other.age && Objects.equals(name, other.name);
    36. }
    37. }
    1. package article;
    2. import java.util.Collection;
    3. import java.util.function.Consumer;
    4. import java.util.*;
    5. import java.util.*;
    6. public class first {
    7. public static void main(String[] args) {
    8. Set s=new HashSet<>();
    9. student s1=new student("uiu",190);
    10. student s2=new student("opop",200);
    11. student s3=new student("klkl",1000);
    12. student s4=new student("opop",200);
    13. System.out.println("添加情况:");
    14. System.out.println(s.add(s1));
    15. System.out.println(s.add(s2));
    16. System.out.println(s.add(s3));
    17. System.out.println(s.add(s4));
    18. //迭代器遍历
    19. Iterator it=s.iterator();
    20. while(it.hasNext()) {
    21. student ss=it.next();
    22. System.out.println(ss.getname()+" "+ss.getage());
    23. }
    24. }
    25. }

     (2)LinkedHashSet的使用

    LinkedHashSet的特点:有序,无重复,无索引。有序的话它的遍历输出就和放进去的元素是一样的,数据结构中的队列差不多吧。使用方法和前面说到的HahsSet是一样的。

    1. package article;
    2. import java.util.Collection;
    3. import java.util.function.Consumer;
    4. import java.util.*;
    5. import java.util.*;
    6. public class first {
    7. public static void main(String[] args) {
    8. Set s=new LinkedHashSet<>();
    9. s.add("klkl");
    10. s.add("99999");
    11. s.add(">>>");
    12. s.add("+++++");
    13. s.forEach(new Consumer(){
    14. public void accept(String ss) {
    15. System.out.println(ss);
    16. }
    17. });
    18. }
    19. }

    ()

    (3)TreeSet的使用

    TreeSet的特点:可排序,无重复,无索引。TreeSet的使用方法和其他集合还是一样的,不过最大的不同就是它可排序,它的底层是基于红黑树实现的,所以对于它,我们着重学习如何排序。它的排序方法有两种。一种是用Comparaable接口实现,一种是使用比较器进行排序。当然它是有着默认排序的,对于数字按照升序,对于字母按照ASCII升序。

    1:Comparable接口排序:

    这里的o代表的就是当前准备插入的元素,不明白排序规则,记住this在前就是升序就可以了

    1. package article;
    2. import java.util.Objects;
    3. public class student implements Comparable{
    4. String name;
    5. int age;
    6. public student(String name,int age) {
    7. this.age=age;
    8. this.name=name;
    9. }
    10. public void setname(String name) {
    11. this.name=name;
    12. }
    13. public void setage(int age) {
    14. this.age=age;
    15. }
    16. public String getname() {
    17. return name;
    18. }
    19. public int getage() {
    20. return age;
    21. }
    22. @Override
    23. public int compareTo(student o) {
    24. // TODO 自动生成的方法存根
    25. int t=this.name.compareTo(o.name);//先按年龄升序,相同按照年龄升序
    26. if(t==0) {
    27. return this.age-o.age;
    28. }
    29. return t;
    30. }
    31. }
    1. package article;
    2. import java.util.Collection;
    3. import java.util.function.Consumer;
    4. import java.util.*;
    5. import java.util.*;
    6. public class first {
    7. public static void main(String[] args) {
    8. Set s=new TreeSet<>();
    9. student s1=new student("abc",20);
    10. student s2=new student("abk",30);
    11. student s3=new student("dec",10);
    12. student s4=new student("dbc",29);
    13. student s5=new student("abc",30);
    14. student s6=new student("abc",40);
    15. s.add(s1);
    16. s.add(s2);
    17. s.add(s3);
    18. s.add(s4);
    19. s.add(s5);
    20. s.add(s6);
    21. s.forEach(new Consumer() {
    22. @Override
    23. public void accept(student t) {
    24. // TODO 自动生成的方法存根
    25. System.out.println(t.getname()+" "+t.getage());
    26. }
    27. });
    28. }
    29. }

    2:比较器排序

    这里的排序规则可以理解成o1在前就是升序,o2在前就是降序

    1. package article;
    2. import java.util.Collection;
    3. import java.util.function.Consumer;
    4. import java.util.*;
    5. import java.util.*;
    6. public class first {
    7. public static void main(String[] args) {
    8. Set s=new TreeSet<>(new Comparator() {
    9. @Override
    10. public int compare(student o1, student o2) {
    11. // TODO 自动生成的方法存根
    12. //先按照名字升序,相同则按照年龄降序
    13. int t=o1.name.compareTo(o2.name);
    14. if(t==0) {
    15. return o2.age-o1.age;
    16. }
    17. return t;
    18. }
    19. });
    20. student s1=new student("abc",20);
    21. student s2=new student("abk",30);
    22. student s3=new student("dec",10);
    23. student s4=new student("dbc",29);
    24. student s5=new student("abc",30);
    25. student s6=new student("abc",40);
    26. s.add(s1);
    27. s.add(s2);
    28. s.add(s3);
    29. s.add(s4);
    30. s.add(s5);
    31. s.add(s6);
    32. s.forEach(new Consumer() {
    33. @Override
    34. public void accept(student t) {
    35. // TODO 自动生成的方法存根
    36. System.out.println(t.getname()+" "+t.getage());
    37. }
    38. });
    39. }
    40. }

     

  • 相关阅读:
    NEFU数字图像处理(1)绪论
    LVS 负载均衡集群
    m基于PSO粒子群优化的第四方物流的作业整合算法matlab仿真,对比有代理人和无代理人两种模式下最低运输费用、代理人转换费用、运输方式转化费用和时间惩罚费用
    软件测试面试题集锦--持续汇总更新
    五、鼎捷T100月加权平均成本计算流程篇
    如何清理C盘
    爪哇,我初窥门径
    免费版Typora的使用
    Git实操学习笔记(跟着步骤来,命令行就会了)
    【JavaEE精炼宝库】网络原理基础——UDP详解
  • 原文地址:https://blog.csdn.net/gaoqiandr/article/details/127833431