JavaSE之Collection

集合概述

集合是用来存储引用类型数据的容器
集合主要有两大类:
Collection集合: 存取数据时是单个存取,
Map集合: 是按<键,值>对的形式存取数据, <”lisi”,18> <”feifei”, 28>
java.util.Collection集合框架
在这里插入图片描述

集合的常用操作

boolean add(E e) 向集合中添加元素e
boolean addAll(Collection<? extends E> c) 把集合c中的元素都添加到当前集合中
void clear() 清空集合,删除集合中所有的元素.
boolean contains(Object o) 判断集合是否包含指定元素o
boolean containsAll(Collection<?> c) 判断当前集合是否包含指定c集合中的所有元素
boolean equals(Object o)
int hashCode()
boolean isEmpty() 判断集合是否为空.
Iterator iterator() 返回集合的迭代器对象.
boolean remove(Object o) 在集合中删除第一个与o匹配的元素
boolean removeAll(Collection<?> c) 把当前集合中出现在c集合里的元素都删除
boolean retainAll(Collection<?> c) 删除当前集合中的元素,如果该元素在c集合中存在就保留
int size() 返回元素的个数.
Object[] toArray() 把集合转换为数组.

  • 创建Collection集合
    Collection是一个接口,需要赋值实现类对象
  • 向集合中添加元素, 集合中存储引用类型数据, 只要是Object类型对象就可以添加到集合中,添加基本类型数据时,系统自动装箱为包装类对象再添加到集合中
  • 假设当前collection引用指向 的是ArrayList集合的对象
    在调用println()方法时, 把collection变量的值,即ArrayList对象的引用作为println()方法的实参在println()方法打印对象时, 调用的ArrayList对象的toString()方法,ArrayList的爷爷重写了toString()方法
  • 迭代遍历集合中的每个元素
    Iterator iterator = collection.iterator();
    获得迭代器后,迭代器有一个游标,指向集合第一个元素的前面 hasNext()判断是否还有下一个元素,next()返回下个元素,游标下移
while( iterator.hasNext() ){
	String str = iterator.next();
	System.out.print( str + "\t");
}

iterator迭代器的游标,经过while循环后, 指向 最后一个元素的后面,需要重新获得迭代器对象

iterator = collection.iterator();  	//重新获得迭代器后,游标又指向一个元素前面
		while (iterator.hasNext()) {
			String string = (String) iterator.next();
			if ("dd".equals(string)) {
				iterator.remove(); 	//通过迭代器删除
//				collection.remove("dd");   //java.util.ConcurrentModificationException异常
			}
		}

注意, 当已经获得了Iterator迭代器之后 , 如果再通过Collection集合的add()/remove()/clear()等方法修改了集合的结构,再使用迭代器的next()方法返回下个元素时, 可能会出现java.util.ConcurrentModificationException异常

List集合

List特点: 有序,可重复
List集合为每个元素指定了一个索引值, 主要增加了针对索引值的操作

  • 可以在指定的索引值添加数据 add(int index, E element)
  • 删除指定位置的元素remove(int index)
  • 返回元素第一次和最后一次出现的位置indexOf(Object o) lastIndexOf(Object o)
  • 返回列表中指定位置的元素get(int index)

几个需要注意的地方:

  1. List集合中 contains()/ remove()等方法,需要调用对象的equals()方法, 如果集合中存储的是自定义类型对象, 需要重写equals()方法
  2. 按照某个对象的属性进行排序两种方法:list.sort(new Comparator<>(){}) 该方法JDK1.8出现 ,Collections.sort(list, new Comparator<>(){})

ArrayList与Vector

  1. 底层都是数组, Vector是线程安全的, Arraylist不是线程安全的
  2. 初始化容量: 10
  3. ArrayList扩容: 1.5 倍速, Vector扩容: 2倍
    如果开发单线程选用ArrayList
    如果开发多线程选择CopyOnWriteArrayList

LinkedList

底层是双向链表
LinkedList新增的方法
增加了针对头与尾的操作
void addFirst(E e)把元素e添加到列表的头部
void addLast(E e) 把元素e添加到最后
E getFirst() 返回第一个元素
E getLast() 返回最后一个元素
E removeFirst() 删除第一个元素
E removeLast() 删除最后一个元素
执行remove()操作时,会返回被删除的元素
E peek() 返回第一个元素
有时, 使用LinkedList模拟栈, 栈的特点:后进先出
void push(E e) 模拟压栈, 把元素e添加列表的头部
E pop() 模拟出栈, 把列表的第一个元素删除
使用offer(e), poll()模拟队列, 队列特点: 先进先出,
boolean offer(E e) 模拟入队, 把元素e添加到列表的尾部
E poll() 模拟出队, 把列表的第一个元素删除

Set

  • 特点:无序,不可重复
  • 直接打印时,存储顺序可能和添加顺序不一样
  • 添加重复数据无效

HashSet

  1. HashSet底层是HashMap
  2. 向hashset中添加元素,实际上是把该元素作为键添加到底层的HashMap中
  3. HashSet就是HashMap键的集合

TreeSet

  1. TreeSet实现了SortedSet接口, 可以对元素自然排序, 要求集合中的元素必须是 可比较的
    (1)在创建TreeSet时,可以指定Comparator比较器
    (2)没有指定Comparator比较器, 要求元素的类实现Comparable接口
    如果以上两者同时存在,则Comparator优先
  2. TreeSet底层是TreeMap
    向TreeSet添加元素,实际上是把该元素作为键添加到了底层的TreeMap中
    TreeSet实际上就是TreeMap键的集合
    注意
  • TreeSet要求元素必须是可比较的, TreeSet集合先看是否有Comparator比较器,
    如果没有Comparator比较器, 再查找元素的类是否实现了Comparable接口
  • 程序员如何选择Comparator还是Comparable??
    一般情况下, 类实现Comparable接口定义一个默认的比较规则
    可以通过Comparator定义很多不同的比较规则
  • 在TreeSet集合中, 判断是否同一个对象是根据Comparator/Comparable的比较结果是否为0进行判断的
    如果两个元素的比较结果为0就认为是同一个元素

Collections工具类

java.util.Collections工具类提供了一些对Collection集合进行操作的方法
Collections工具类中有一组操作: synchronizedXXX(XXX)可以把XXX集合由不是线程安全的集合转换为线程安全的集合:
Collection synchronizedCollection(Collection c)
static List synchronizedList(List list)
static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
static Set synchronizedSet(Set s)
但是, 我们现在开发多线程程序,基本不再使用这些方法, 而是直接使用java.util.concurrent包中线程安全的集合类, 如:线程安全的List集合:copyonWriteArrayList,. 线程安全的Set集合: copyOnWriteArraySet, concurrentSkipListSet

小结

Collection存储数据时是单个存储的,只能存储引用类型数据
add() , remove() , contains() , iterator()
----List集合
有序, 可重复
为每个元素指定了一个索引值,
add(index, o), remove(index), get(index), sort(Comparator)
--------ArrayList
--------Vector
底层是数组, 访问快, 添加/删除慢
初始化容量: 10
扩容: ArrayList是1.5倍, Vector是2倍
Vector是线程安全的, ArrayList不是线程安全的
--------LinkedList
底层是双向链表, 添加/删除效率高, 访问慢
******************List集合如何选择
ArrayList应用于以查询访问为主,很少进行添加/删除操作
LinkedList应用于 频繁的进行添加/删除操作的情况

----Set集合
无序, 不可重复
--------HashSet
底层是HashMap
HashSet就是Hashmap键的集合
--------TreeSet
底层是TreeMap
TreeSet就是TreeMap的键 的集合
TreeSet实现了SortedSet接口, 可以对元素自然排序, 要求元素必须是可比较的
(1)创建TreeSet时指定Comparator比较器
(2)如果没有指定Comparator比较器, 元素的类要实现Comparable接口
*************如何选择HashSet还是TreeSet
如果不需要进行排序选择HashSet
如果需要根据某个字段排序,选择TreeSet

===================注意
List集合与HashSet集合中判断是否同一个元素, 需要调用对象的equals()方法, 元素的类需要重写equals()方法
TreeSet集合判断是否同一个元素,根据Comparator/Comparable的比较结果是否为0判断,如果比较结果为0就认为是同一个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值