集合: List和Set

集合

java.util.Conllection

作用是用来存储多个数据, 集合中把每个数据叫元素

和数组的比较:

  • 类型: 数组只能存相同类型的数据. 集合可以是多种数据类型
  • 长度: 数组一旦创建长度就不能改变, 集合长度改变
  • 遍历: 数组常用下标遍历, 方式单一. 插入, 删除操作繁琐. 集合则更加方便

集合的继承结构:

  • Conllection (接口)
    • List (接口)
      • ArrayList (实现类)
      • LinkedList (实现类)
    • Set(接口)
      • HashSet (实现类)
      • TreeSet (实现类)

如图:

Collection接口常用方法 (子类通用)

返回值 方法 说明
boolean add(E e) 添加元素(泛型)
void clear() 清空集合, 移除集合所有元素
boolean contains(Object o) 判断是否包含指定元素, 存在返回true, 否则返回false
int hashCode() 返回集合在内存中的哈希码
boolean isEmpty() 是否为空, 是为true, 否则为flase
boolean remove(Object o) 移除指定元素, 移除成返回true, 否则返回false(如果有重复, 移除第一次出现的元素)
int size() 返回集合的大小
Object[] toArray() 把集合转为数组
boolean addAll(Collection c) 把c集合中的所有元素都添加进来, 添加成功为true
boolean containsAll(Collection c) 如果集合包含c, 则返回true
boolean removeAll(Collection c) 删除c中包含的所有元素, 删除成功返回boolean (交集)
boolean retainAll(Collection c) 只保留集合中 c 包含的元素, 其余元素全部删除 (差集)
Iterator iterator() 返回一个迭代器, 用来迭代(遍历)数组(使用方法如下)

注意: iterator() 迭代方法使用

Collection c = new ArrayList();
c.add("艾迪");
c.add("杰克");
c.add("迪迦");
c.add("泰罗");

Iterator<String> it = c.iterator();
while (it.hasNext()) {// hasNext() 用来判断集合中是否还有下一个元素, 有就返回true
    String value = it.next(); // 获取元素'
    System.out.println(value);
}

结果:

艾迪
杰克
迪迦
泰罗

List (接口)

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

List常用特有方法

返回值 方法 说明
void add(int index, E e) 在指定下标处插入
boolean addAll(int index, Collection c) 插入一个集合到指定下标
E get(int index) 使用下标获取元素
int indexOf(Object o) 返回第一次出现指定元素的索引值
int lastIndexOf(Object o) 返回最后一次出现指定元素的索引
E remove(int index) 移除指定索引的元素, 并返回元素的值
ListIterator listIterator() 获取迭代对象, 实例看下面, 拥有(向前遍历, 向后遍历等特有方法)
E set(int index, E e) 替换指定下标的元素
List subList(int fromIndex, int toIndex) 按下标截取集合, 包含头, 不包含尾

listTerator()方法的使用

// 定义list...略
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()) { // 向后判断, 有没有元素
    String value = it2.next(); // 获取后面的元素
    System.out.println(value);
}

ArrayList(实现类)

特点:

  • 是list接口的实现类, 拥有list接口的特点, 有序, 有索引, 底层使用数组实现, 方便查询
  • 可以使用Collection抽象类和List接口的通用方法

常用构造方法

方法 说明
ArrayList() 无参构造

常用特有方法

注意: remove() 可以按照下标删除, 也可以直接指定元素值, 如果元素是Integer类型, 哪么可能会出现意外的结果

如下实例:

// 创建ArrayList对象
List<Integer> a1 = new ArrayList<>();
a1.add(1);
a1.add(2);
a1.add(3);
a1.add(4);
a1.add(100);

// remove() 可以按照下标删除, 也可以直接指定元素值
System.out.println(a1.remove(2)); // 按照下标删除
System.out.println(a1.remove(Integer.valueOf(100))); // 按照元素进行删除

由上例可见: 直接传入数字会默认按照下标进行删除, 只有传入包装类型的时候才会按元素删除

LinkedList(实现类)

特点:

  • List接口的实现类, 拥有List接口的特点, 可以重复, 有索引, 有序, 底层是一个链表结构的实现. 查询比ArrayList复杂, 但是适用于增删业务
  • 可以使用Collection抽象类和List接口的通用方法

常用构造方法

方法 说明
LinkedList() 无参构造

常用特有方法

返回值 方法 说明
void addFirst(E e) 添加首元素
void addLast(E e) 添加尾元素
E getFirst() 获取首 元素
E getLash() 获取尾元素
E removeFirst() 移除首元素, 并返回被移除元素的值
E removeLash() 移除尾元素, 并返回被移除元素的值

Set(接口)

set是一个不包含重复元素的集合, 至少包含一个null, set中不能存放重复元素, 常用来去重

注意: 去重自定义对象的时候, equals()和hashCode()必须都重写, 这样的话才可以识别两个对象是否相等, 才能达到去重的目的

  • hashCode() 是为了让底层运算哈希值是, 可以根据对象的属性值运算, 如果两个对象的属性值一样, 就可以认为是相等的hash值
  • equals() 是为了让底层在判断两个对象是否相等时, 让equals()返回true

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

Set接口几乎没有特有常用方法, 主要继承使用Collection的方法

HashSet(实现类)

HashSet是Set接口的实现类, 可以使用Set接口的所有功能, 拥有Set接口的特点, 数据无序, 不重复, 无索引

HashSet底层是哈希表(也叫散列表). 实际上底层维护了一个HashMap

常用构造器

方法 说明
HashSet() 无参构造

特有方法

同Set接口的方法

Collections 工具类

针对集合的工具类

常用方法

返回值和修饰符 方法 说明
static boolean addAll(Collection<? super T> c, T... elements) 添加多个数据
static T(泛型) max(Collection<? extends T> coll) 集合中的最大值
static T(泛型) min(Collection<? extends T> coll) 集合中的最小值
static void reverse(List<?> list) 把指定集合中的元素 反转
static void sort(List list) 给指定的list集合排序
static void swap(List<?> list, int i, int j) 将指定集合的指定下标元素进行交换

代码实例

public static void main(String[] args) {
    // 创建List集合
    List<Integer> list = new ArrayList<>();
    // 添加元素
    Collections.addAll(list, 1, 2, 3, 4, 5);
    System.out.println(Collections.max(list)); // 最大值
    System.out.println(Collections.min(list)); // 最小值

    Collections.reverse(list); // 把指定集合中的元素 反转
    System.out.println(list);

    Collections.sort(list); // 给指定的list集合排序
    System.out.println(list);

    Collections.swap(list, 2, 4); // 将指定集合的指定下标元素进行交换
    System.out.println(list);
}

结果

5
1
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
[1, 2, 5, 4, 3]
posted @ 2020-05-21 09:25  zpk-aaron  阅读(161)  评论(0编辑  收藏  举报