Java基础(五)——Collection集合、List集合、Set集合

248 阅读8分钟

Collection集合

  • public interface Collection<E>
    extends Iterable<E>
    

    集合层次结构中的根界面 。 集合表示一组被称为其元素的对象。 一些集合允许重复元素,而其他集合不允许。 有些被命令和其他无序。 JDK不提供此接口的任何直接实现:它提供了更具体的子接口的实现,如Set和List 。 该界面通常用于传递集合,并在需要最大的通用性的情况下对其进行操作。

    多重集 (可能包含重复元素的无序集合)应直接实现此接口。

    所有通用的Collection实现类(通常通过其子接口间接实现88446144404803)应提供两个“标准”构造函数:一个void(无参数)构造函数,它创建一个空集合,以及一个构造函数, Collection ,它创建一个与其参数相同的元素的新集合。 实际上,后一个构造函数允许用户复制任何集合,生成所需实现类型的等效集合。 没有办法强制执行此约定(因为接口不能包含构造函数),而是所有Java平台库中的通用Collection实现。

Collection集合概述

  • 是单例集合的顶层接口, 它示-组对象, 这些对象也称为C ollection的元素
  • JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)

实现创建Collection集合的对象

  • 多态的方式 
  • 具体的实现类ArrayList

例子:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDemo {
    public static void main(String[] args) {
        //创建collection集合的对象
        Collection<String> c = new ArrayList<String>();

        //添加元素:boolean add(E e)
        c.add("hi");
        c.add("good");
        c.add("morning");

        //输出集合对象
        System.out.println(c);
    }
}

实现效果:

 

Collection集合常用方法

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数

例子:

public class CollectionDemo {
    public static void main(String[] args) {
        //创建collection集合的对象
        Collection<String> c = new ArrayList<String>();

        //添加元素:boolean add(E e)
        c.add("hi");
        c.add("good");
        c.add("morning");
        //移出元素
        c.remove("good");
        //清空集合元素
//        c.clear();
        //判断集合中是否有指定元素
        System.out.println(c.contains("hi"));
        //判断集合是否为空
        System.out.println(c.isEmpty());
        //输出集合的长度
        System.out.println(c.size());

        //输出集合对象
        System.out.println(c);
    }
}

 结果:

查看源码快捷键 

快捷键:CTRL + 鼠标左键       快速查看源码

快捷键:alt + 7   打开一个窗口,能看到类的所有信息

比如Arraylist类

Iterator集合迭代器

Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合的iterator()方法得到

可以用来遍历集合

public class CollectionDemo {
    public static void main(String[] args) {
        //创建collection集合的对象
        Collection<String> c = new ArrayList<String>();

        //添加元素:boolean add(E e)
        c.add("hi");
        c.add("good");
        c.add("morning");

        //Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合的iterator()方法得到
        Iterator it = c.iterator();
        //判断集合中下一个数是否存在
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

例子:存储学生对象并遍历

public class Student {
    private String name;
    private int age;

    public Student() {
    }
    public Student(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;
    }
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo {
    public static void main(String[] args) {
        //先准备好一个学生类student

        //创建collection集合的对象
        Collection<Student> students = new ArrayList<Student>();

        //添加元素:boolean add(E e)
        Student s1 = new Student("曹操",18);
        Student s2 = new Student("刘备",23);
        Student s3 = new Student("袁绍",21);
        students.add(s1);
        students.add(s2);
        students.add(s3);

        //迭代器
        Iterator<Student> it = students.iterator();
        while (it.hasNext()){
            Student s = it.next();
            System.out.println(s.getName() + ":" + s.getAge());
        }
    }
}

结果: 

 

List集合

  • public interface List<E>
    extends Collection<E>
    

    有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

    与集合不同,列表通常允许重复的元素。 更正式地,列表通常允许元素e1和e2成对使得e1.equals(e2) ,并且如果它们允许空元素,它们通常允许多个空元素。 有人可能希望实现一个禁止重复的列表,当用户尝试插入时会抛出运行时异常,但是我们预计这种使用是罕见的。

    该List接口放置额外的约定,超过在Collection指定接口上的iterator,add,remove,equals和hashCode方法合同。 其他继承方法的声明也包括在这里以方便。

    List接口提供四种位置(索引)访问列表元素的方法。 列表(如Java数组)为零。 请注意,这些操作可能与某些实现的索引值(例如LinkedList类)成时执行。 因此,如果调用者不知道实现,则通过迭代列表中的元素通常优先于索引。

    所述List接口提供了一个特殊的迭代器,称为ListIterator,其允许元件插入和更换,并且除了该Iterator接口提供正常操作的双向访问。 提供了一种方法来获取从列表中的指定位置开始的列表迭代器。

    List接口提供了两种方法来有效地插入和删除列表中任意一点的多个元素。

List集合概述

  • 有序集合(也称为序列), 用户可以精确控制列表中海个元素的插入位置。驴可以通过整数索引|访问元素,并搜索列表中的元素
  • 与Set集合不同, 列表通常允许重复的元素

List集合特点

  • 有序:存储和取出的元素顺序-致
  • 可重复:存储的元素可以重复
  • List 继承自Collection集合

 

增强for循环

增强for:简化数组和Collection集合的遍历

  • 实现Iterable接口的允许其对象成为增强型for语句的目标
  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

增强for的格式
格式:

for(元素数据类型变量名:数组或者Collection集合) {
//在此处使用变量即呵,该量就是元素

}

范例:

int[] arr = {1,2,3,4,5};
for(int i:arr){
    System.out.println(i);
}

 

List集合子类特点

ArryList底层实现是数组,查询快,增删慢

  • 所述ArrayType类是开放类型类,其实例描述了作为开放数据值的n维阵列所有打开数据值。

LinkedList底层实现是链表,查询慢,增删快

  • 双链表实现了ListDeque接口。 实现所有可选列表操作,并允许所有元素(包括null )。

    所有的操作都能像双向列表一样预期。 索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引为准。

 

LinkedList集合特有功能

集合特有功能

方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

例子: 

import java.util.LinkedList;

public class ListDemo {
    public static void main(String[] args) {
        //创建集合对象
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("hello");
        linkedList.add("list");
        linkedList.add("java");

        linkedList.addFirst("this is");
        linkedList.removeLast();
        System.out.println(linkedList);
    }
}

效果:

 

Set集合

java.util

Interface Set<E>

使用Set集合需要导包util

  • public interface Set<E>
    extends Collection<E>
    

Set集合继承自Collection集合,功能全部来自于Collection集合

  • 不包含重复元素的集合。 更正式地,集合不包含一对元素e1e2 ,使得e1.equals(e2) ,并且最多一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学抽象。

    Set接口除了继承自Collection接口的所有构造函数的合同以及add,equals和hashCode方法的合同外 , 还 增加了其他规定。 其他继承方法的声明也包括在这里以方便。 (伴随这些声明的规范已经量身定做Set接口,但它们不包含任何附加的规定。)

    构造函数的额外规定并不奇怪,所有构造函数都必须创建一个不包含重复元素的集合(如上所定义)。

    注意:如果可变对象用作设置元素,则必须非常小心。 如果对象的值以影响equals比较的方式更改,而对象是集合中的元素, 则不指定集合的行为。 这种禁止的一个特殊情况是,一个集合不允许将其本身作为一个元素。

Set集合特点

  • 不包含重复元素的集合
  • 没有带索引的方法,所以不能使用普通for循环遍历

 

例子:

public static void main(String[] args) {
        //创建集合对象
        Set<String> set = new HashSet<String>();

        set.add("and");
        set.add("no");
        set.add("or");

        //HashSet对集合的迭代顺序不做任何保证
        for(String i:set){
            System.out.println(i);
        }
    }

结果:

 

哈希值

哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值

hashCode()方法:返回对象的哈希值

例子:

public static void main(String[] args) {
        Student s = new Student("桐谷",25);
        System.out.println(s.hashCode());
}

注意:同一个对象的哈希值是一样的 

HashSet集合概述

HashSet集合特点

  • 底层数据结构是哈希表
  • 对集合的迭代顺序不作任何保证, 也就是说不保证存储和取出的元素顺序一致
  • 没有带索引的方法, 所以不能使用普通for循环遍历
  • 由于是Set集合,所以是不包含重复元素的集合

 

哈希表

  • JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组
  • JDK8以后,在长度比较长的时候,底层实现了优化

 

 

 

 

 

 

 

 

一起学习,一起进步 -.- ,如有错误,可以发评论