1. 汇合

汇合与数组相似,都是一个容器将一些元素寄存在一起。不同的是数组长度和类型是确 定的,汇合是能够初始化之后扭转的。数组类型能够是根底类型也能够是援用类型,集 合只能是援用类型。

2. 汇合体系

汇合次要分为两大类:①单列汇合Collection ②双列汇合Map

  • 单列汇合:相似数组,每个元素只蕴含一个值。
  • 双列汇合:相似二维数组,每个元素蕴含键值对。

3. 单列汇合的体系

罕用汇合实现类如下图:

List:元素有序,反复和有索引。

  • ArrayList和LinkedList:有序、反复和有索引

Set:元素无序,不反复和无索引。

  • HashSet:无序,不反复和无索引
  • TreeSet:依照大小排序,不反复和无索引
  • LinkedHashSet:有序、不反复和无索引

汇合特点:

  • 汇合存储的都是援用类型,不可是根底类型,如果保留根底类型须要用包装类。
    <类型>,这个类型被称之为泛型,泛型只能是援用类型。泛型的应用之后补充。

4. 罕用办法

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()把汇合中的元素,存储到数组中

5. List

这是汇合下一个大的分支,有序、可反复和有索引,这是这一大类次要的特点。

  • 有序:存储和取出的元素程序统一
  • 反复:存储的元素能够呈现雷同的
  • 索引:能够通过索引间接找到对应元素

5.1 创立语法

// 例如ArrayList<String> arrayList=new ArrayList<String>();// jdk1.7之后省略        ArrayList<String> arrayList=new ArrayList<>();

5.2 List汇合遍历

汇合除了有存储功,还有增删改查性能。

5.2.1 for循环遍历

上面通过size办法取得长度,进行for循环便能够遍历所有元素了。

public class ListForTest {    public static void main(String[] args) {        // 创立单列汇合        ArrayList<Integer> arrayList = new ArrayList<>();        // 新增元素        arrayList.add(95);        arrayList.add(55);        arrayList.add(13);        arrayList.add(5);        // 通过下标遍历        for (int i = 0; i < arrayList.size(); i++) {            System.out.println(arrayList.get(i));        }    }}

5.2.2 加强for循环遍历

// 格局for(元素类型 变量名:汇合变量){        ...        }
public class ListForTest2 {    public static void main(String[] args) {        // 创立单列汇合        ArrayList<Integer> arrayList = new ArrayList<>();        // 新增元素        arrayList.add(95);        arrayList.add(55);        arrayList.add(13);        arrayList.add(5);        // 加强for循环        for (Integer integer : arrayList) {            System.out.println(integer);        }    }}

5.2.3 迭代器

这个类代表汇合中的元素,汇合中通过外部类实现Iterator。取得到的迭代器默认是 指向0索引的。

public class ListIterableTest {    public static void main(String[] args) {        // 创立单列汇合        ArrayList<Integer> arrayList = new ArrayList<>();        // 新增元素        arrayList.add(95);        arrayList.add(55);        arrayList.add(13);        arrayList.add(5);        Iterator<Integer> iterator = arrayList.iterator();        while (iterator.hasNext()) {            System.out.println(iterator.next());        }    }}

Iterator罕用办法如下:

办法阐明
Iterator<E> iterator();Collection汇合办法,返回迭代器
boolean hasNext()取得以后地位是否有元素,存在返回true ,不存在返回false
E next()取得以后地位元素并指向下一个元素,如果有的话,留神越界

5.2.4 Lambda表达式循环

通过Lambda表达式来实现汇合的循环

// 示例public class ListForEachTest {    public static void main(String[] args) {        // 创立单列汇合        ArrayList<Integer> arrayList = new ArrayList<>();        // 新增元素        arrayList.add(95);        arrayList.add(55);        arrayList.add(13);        arrayList.add(5);        // forEach循环        arrayList.forEach(new Consumer<Integer>() {            @Override            public void accept(Integer integer) {                System.out.println(integer);            }        });        // Lambda表达式        arrayList.forEach(i -> System.out.println(i));    }}

5.3 各个实现类特点

List特有的办法:

办法阐明
void add(int index,E element)在指定地位插入元素
E remove(int index)指定地位移除元素
E set(int index,E element)批改指定地位元素
E get(int index)取得指定地位元素

ArrayList:

  • 底层基于可变数组实现的,查问快增删较慢

LinkedList:

  • 底层基于双向链表实现的,查问慢增删较快

LinkedList特有的办法:

办法阐明
public void addFirst(E e)在列表首部插入
public void addLast(E e)指定地位插入尾部
public E getFirst()取得首部元素
public E getLast()取得尾部元素
public E removeFirst()移除首部元素并返回
public E removeLast()返回尾部元素并移除

5.4 存储自定义类型

自定义类型进行存储。

public class ListTest {    public static void main(String[] args) {        // Book类查看文章最初源码地址        ArrayList<Book> arrayList = new ArrayList<>();        arrayList.add(new Book("三体", "刘慈欣"));        arrayList.add(new Book("平庸的世界", "路遥"));        // 新增两次雷同也能够的        arrayList.add(new Book("活着", "余华"));        arrayList.add(new Book("活着", "余华"));        // 遍历        for (Book book : arrayList) {            System.out.println(book);        }    }}

6. Set

这是汇合中的第二大分支,次要特点是无序、不可反复和无索引。

6.1 格局

同汇合List一样的格局

HashSet<String> hashSet=new HashSet<>();

6.2 Set遍历

因为没有索引,所以除了通过长度循环外,其余的循环与List统一。

通过遍历显示能够看出,AA只被输入一次,所以Set汇合中不能呈现反复的。

public class SetForTest {    public static void main(String[] args) {        // 创立HashSet        HashSet<String> hashSet = new HashSet<>();        // 新增元素(因为不可反复,只能新增一次,反复新增只会)        hashSet.add("AA");        hashSet.add("BB");        hashSet.add("CC");        hashSet.add("AA");        // 加强的for循环        for (String s : hashSet) {            System.out.println(s);        }        // 迭代器        Iterator<String> iterator = hashSet.iterator();        while (iterator.hasNext()) {            System.out.println(iterator.next());        }        // forEach循环        hashSet.forEach(new Consumer<String>() {            @Override            public void accept(String s) {                System.out.println(s);            }        });        // forEach加Lambda        hashSet.forEach(s-> System.out.println(s));    }}

6.3 各个实现类的特点

HashSet:无序、不反复和无索引,底层应用的是哈希表。
LinkedHashSet:有序、不反复和无索引,底层是哈希表加双向列表
TreeSet:排序、不反复和无索引,红黑树

留神:_对于底层数据结构将在之后进行解说_

6.4 罕用子类示例

public class Dog {  private String name;  private int age;  public Dog() {  }  public Dog(String name, int age) {    this.name = name;    this.age = age;  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  @Override  public String toString() {    return "Dog{" +            "name='" + name + '\'' +            ", age=" + age +            '}';  }}
  1. HashSet
public class HashSetTest {    public static void main(String[] args) {        HashSet<Dog> hashSet = new HashSet<>();        hashSet.add(new Dog("旺财", 18));        hashSet.add(new Dog("旺财", 18));        // 输入能够看见,会有两个雷同的元素显示进去,依照不可反复原理,这是不正确的。那么问题呈现在哪了。        for (Dog dog : hashSet) {            System.out.println(dog);        }    }}

如果比照就不必须实现equals办法,这样的话才能够不呈现反复,在自定义类中重写equals和hashCode

@Overridepublic boolean equals(Object o) {    if (this == o) return true;    if (o == null || getClass() != o.getClass()) return false;    Dog dog = (Dog) o;    return age == dog.age && Objects.equals(name, dog.name);}@Overridepublic int hashCode() {    return Objects.hash(name, age);}
  1. LinkedHashSet
public class LinkedHashSetTest {    public static void main(String[] args) {        LinkedHashSet<Dog> linkedHashSet = new LinkedHashSet<>();        linkedHashSet.add(new Dog("旺财", 19));        linkedHashSet.add(new Dog("小强", 20));        for (Dog dog : linkedHashSet) {            System.out.println(dog);        }    }}
  1. TreeSet
public class TreeSetTest {    public static void main(String[] args) {        // 创立TreeSet须要实现排序办法,这里是倒序排列        TreeSet<Dog> treeSet = new TreeSet<>((o1, o2) -> o1.getAge() - o2.getAge());        treeSet.add(new Dog("张三", 20));        treeSet.add(new Dog("李四", 18));        treeSet.add(new Dog("王二", 19));        for (Dog dog : treeSet) {            System.out.println(dog);        }    }}

本章完结,用于集体学习和小白入门,大佬勿喷!心愿大家多多点赞珍藏撑持撑持!

源码 【GitHub】 【码云】