zoukankan      html  css  js  c++  java
  • JAVA基础集合(一)


    一、整体结构

        Collection接口为一些单列集合的根接口,其常用子接口为List接口、Set接口。List接口常用实现子类为ArrayList(数组)
    LinkedList(链表)。Set接口常用实现子类为HashSet(哈希表)LinkedHashSet(哈希表和链表结合)。

    二、Collection接口

    Collection接口作为根接口,为我们提供了集合的一些常用操作:
    (1)增加、add(E e) - 返回值为boolean(是否添加成功)。
    (2)清除、clear() - 除去此数组的所有操作。
    (3)是否包含某一元素、contains(Object o) - 如果包含返回为true(可以用于进行if判断),如果集合里边的元素为自定义
    类的话需要重写自定类的equals方法(contains方法就是基于equals实现的)否则比较的是地址。
    (4)比较此collection与指定对象是否相等、equals(Object o) - 返回值为boolean(true为相等)。
    (5)此collection是否包含某元素、isEmpty() - 返回值为boolean(true为不包含)。
    (6)获取此collection的迭代器、iterator() - 用于遍历集合(此迭代器只能遍历集合,不能对集合进行修改,否则会报并发
    修改异常-ConcurrentModificationException)。
    (7)删除指定元素、remove(Object o) - 返回值为boolean(true表示删除成功)。
    (8)返回元素数(集合的长度)、size() - 返回值为int(集合中元素的个数)。
    (9)返回此集合中所有元素的数组、toArray() - 返回值是一个数组。

    举例:

     1 public static void main(String[] args) {
     2 //创建集合,这里为多态-向下转型
     3 Collection a = new ArrayList();
     4 //在集合里添加元素
     5 a.add("hello");
     6 a.add("world");
     7 //获取此集合的迭代器
     8 Iterator iterator = a.iterator();
     9 //通过迭代器遍历集合
    10 while (iterator.hasNext()) {
    11 String s = (String) iterator.next();
    12 System.out.println(s);
    13 }
    14 //集合里是否包含"hello"元素
    15 System.out.println(a.contains("hello"));
    16 //这个是调皮的分割线
    17 System.out.println("---------------------------");
    18 System.out.println(a.isEmpty());
    19 System.out.println("---------------------------");
    20 //删除某元素
    21 a.remove("world");
    22 System.out.println(a);
    23 //清空集合
    24 a.clear();
    25 System.out.println(a);
    26 }

    三、List接口

    List派系的数组特点为有序、具有索引、可以重复。他可以使用其父的所有方法,同时他还有一些自己的方法:
    (1)根据索引返回指定位置的元素、get(int index) - 返回值为指定位置的元素。
    (2)返回第一次出现指定元素的索引、indexOf(Object o) - 返回值为int(索引如果不存在则返回-1)。
    (3)返回最后一次出现指定元素的索引、lastIndexOf(Object o) - 返回值为int(索引如果不存在则返回-1)。
    (4)获取此列表的迭代器、listIterator() - 用于遍历集合(此迭代器同iterator()的别在于,此迭代器可以对
    数组进行增加等操作,因为ListIterator遍历的元素所在的容器都有索引)。
    (5)替换指定索引位置的元素、set(int index, E element)。
    举例:

     1 public static void main(String[] args) {
     2 // 创建集合
     3 List c = new ArrayList();
     4 // 添加元素
     5 c.add("aaaa");
     6 c.add("wqe");
     7 c.add("eqw");
     8 c.add("eqwe");
     9 c.add("aatyaa");
    10 // 获取迭代器
    11 ListIterator iterator = c.listIterator();
    12 while (iterator.hasNext()) {
    13 String s = (String) iterator.next();
    14 //如何集合里遇到"aaaa",则添加元素"哈哈哈哈"
    15 if (s.equals("aaaa")) {
    16 iterator.add("哈哈哈哈");
    17 }
    18 }
    19 System.out.println(c);
    20 }

    1、ArrayList类

    ArrayList类可以使用Collection、List的全部方法,具有List的特点-有序、具有索引、可以重复。常用的构造
    方法:ArrayList<泛型> 变量名=new ArrayList<>();

    2、LinkedList类

    LinkedList类为List接口的链表实现,常用构造方法与一般的集合一样,而除了其根类的方法外还有其自己的独有方法:
    (1)将元素添加到集合开头、addFirst(E e)。
    (2)将元素添加到集合结尾、addLast(E e)。
    (3)返回此集合的第一个元素、getFirst()。
    (4)返回此集合的最后一个元素、getLast()。
    (5)返回此集合中最后出现的指定元素的索引、lastIndexOf(Object o) - 返回值为int(索引)。
    (6)移除并返回此列表的最后一个元素、removeLast() - 返回值为被删除的元素。
    举例:

     1 public static void main(String[] args) {
     2 LinkedList ll = new LinkedList();
     3 ll.add("hello");
     4 ll.add("world");
     5 // 再集合首位增加元素
     6 ll.addFirst("java");
     7 System.out.println(ll);
     8 // 再集合末位增加元素
     9 ll.addLast("py");
    10 System.out.println(ll);
    11 // 获取末尾索引的元素
    12 System.out.println(ll.getLast());
    13 // 获取首位索引位置
    14 System.out.println(ll.getFirst());
    15 // 删除末尾元素
    16 ll.removeLast();
    17 System.out.println(ll);
    18 // 删除首位元素
    19 ll.removeFirst();
    20 System.out.println(ll);
    21 // contains里边用的也是equals方法比较,比的是谁。用的谁的equals
    22 boolean b = ll.contains("hekko");
    23 }


    四、Set接口

    Set接口则是Collection里的另一个派系,Set派系的特点是无序的、没有索引、不能重复。同样的他也可以
    使用Collection接口的全部方法。(学习类和方法时要从根开始学可以减少很多的无用功)。

    1、HashSet

    此类是以哈希表结构为基础,不保证其迭代顺序,所以说是无序的。
    其常用初始化方法:HashSet< > 变量名=new HashSet<>();
    举例:

     1 //主方法
     2 public static void main(String[] args) {
     3 //创建集合
     4 HashSet<Student> ah = new HashSet<>();
     5 //添加元素
     6 Student student = new Student("zhangsan1", 11);
     7 Student student2 = new Student("sA", 1313);
     8 Student s3 = new Student("sA", 1313);
     9 ah.add(student2);
    10 ah.add(student);
    11 ah.add(s3);
    12 for (Student s1 : ah) {
    13 System.out.println(s1);
    14 }
    15 }
     1 //学生类
     2 class Student {
     3 String name;
     4 int age;
     5 
     6 public Student() {
     7 super();
     8 // TODO Auto-generated constructor stub
     9 }
    10 
    11 public Student(String name, int age) {
    12 super();
    13 this.name = name;
    14 this.age = age;
    15 }
    16 
    17 @Override
    18 public String toString() {
    19 return "Student [name=" + name + ", age=" + age + "]";
    20 }
    21 
    22 @Override
    23 public int hashCode() {
    24 final int prime = 31;
    25 int result = 1;
    26 result = prime * result + age;
    27 result = prime * result + ((name == null) ? 0 : name.hashCode());
    28 return result;
    29 }
    30 
    31 @Override
    32 public boolean equals(Object obj) {
    33 if (this == obj)
    34 return true;
    35 if (obj == null)
    36 return false;
    37 if (getClass() != obj.getClass())
    38 return false;
    39 Student other = (Student) obj;
    40 if (age != other.age)
    41 return false;
    42 if (name == null) {
    43 if (other.name != null)
    44 return false;
    45 } else if (!name.equals(other.name))
    46 return false;
    47 return true;
    48 }
    49 }

    注意:这里如果你自己定义的学生类就要重写hashCode和equals方法,因为add()方法底层默认比对的是其地址值,所
    以每个对象一定是不同的,就会有重复的情况。而重写了hashCode和equals方法后,他会根据自定义类里的属性
    生成hashCode,如果相同在比较地址或equals。如果都相同则被认定为重复。
    (1)重写hashCode和equals方法的快捷方式:
    Alt+Shift+S,在按h或鼠标选择重写hashCode和equals。
    (2)判断是否重复的源码逻辑:
    if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

    2、LinkedHashSet类

    此类是哈希表和链表的结合,因此他具有不可重复、有序的特点。如果需要对数组进行去重,但是还不能改变数组中原来
    数字的大小顺序就可以用这个类。
    举例:

     1 public static void main(String[] args) {
     2 int[] arr = { 1, 2, 3, 4, 5, 1, 2, 6, 7, 10 };
     3 // 定义集合
     4 LinkedHashSet<Integer> lh = new LinkedHashSet<>();
     5 for (int i = 0; i < arr.length; i++) {
     6 lh.add(arr[i]);
     7 }
     8 //遍历集合
     9 for (Integer integer : lh) {
    10 System.out.println(integer);
    11 }
    12 }
    我们在键盘上留下的余温,也将随时代传递到更远的将来~
  • 相关阅读:
    基于Spring+SpringMVC实现AOP日志记录功能service注入异常为null的解决办法
    关于SpringBoot项目打包没有把依赖的jar包一起打包的解决办法
    JavaFx项目打包成exe,并集成Jre,使Java项目在任意机器运行
    常用正则表达式
    SqlServer 2005及其以上版本能用的查询数据的行号
    js 中的倒计时功能
    数据库删除重复列
    【转】svn文件清除批处理工具
    JS获取当前页面名称
    sql 去除重复记录
  • 原文地址:https://www.cnblogs.com/0813lichenyu/p/7515785.html
Copyright © 2011-2022 走看看