单列集合Collection-------------List和Set
为了弥补对象数组的不足:长度固定,进行里面的增删改查很不方便:所以有了集合对对象进行大规模的操作,将数组封装,操作都封装为公共方法
集合和数组的区别
相同点
都是用来存储数据的容器,一大堆零散的数据不方便进行管理,装进去进行统一的操作管理
不同点
存储内容不同
数组既可以存放基础数据类型,也可以存放引用数据类型;而且数组存储的类型是指定的
集 合只能够存储引用数据类型,如果要存放引用数据类型,封装成包装类;
存储数量不同
数组的长度时不可变的,一旦确定大小就无法更改
集合的长度时可变的,是一个可以伸缩的容器
可使用的方法不同
数组中只能调用Object中继承下来的方法
集合中有很多自己的方法
集合体系
集合分类
单列集合:每个元素都是一个单独的个体
双列集合:每个操作都是针对一对数据进行操作,一对数据作为一个单位:Key(键值)——Value(真实值)
单列集合体系
Collection:单列结合的顶层接口
List:有序的子接口
ArrayList:底层为数组,顺序存储
LinkedList:底层为链表,链式存储
Vector:被ArrayList取代
Set:无序的一个子接口
HashSet:哈希存储
TreeSet:二叉树存储
双列集合体系
Map:双列集合的顶层接口
HashMap:哈希存储
TreeMap:二叉树存储
Collection常用方法
add(E e):添加元素
remove(Object o):删除元素
clear():删除所有元素
isEmpty():判断是否为空
contains(Object o):判断集合中是否包含此元素
size():返回此集合中的元素个数
addAll(Collection c):将另外一个集合中的元素全部加到这个集合里面
All系列
containsAll(Collection c):判断这个集合是否为调用者集合的子集
removeAll(Collection c):删除调用者集合中c集合中也有的元素:除去相同元素:如果两个集合中没有相同元素返 回false
retainAll(Collection c):只保留两个集合中相同的元素,只保留子集
转换
toArray():返回一个Object对象的集合
toArray(T[] a):里面放一个字符串数组,可以不用返回直接载入到这个字符串数组中
Collection遍历方法
集合转化为数组,然后对数组进行遍历
Person[] p = new Person[c.size()];
c.toArray(p);
for(Person pp:p) {
System.out.println(pp.getName()+"...."+pp.getAge());
}
利用迭代器来进行遍历(增强for循环底层就是迭代器)
Iterator<Person> iterator = c.iterator();
while(iterator.hasNext()) {
Person p = iterator.next();
System.out.println(p.getName()+"...."+p.getAge());
}
List
是Collection的子接口
有序,每个元素都有自己的位置,不同元素是有分别的
有索引,每个元素都有自己的编号
可以存储相同的元素,位置和索引不同,所以也不是相同的。
List中的特有方法
add(int index,E element):在指定位置添加元素,如果指定位置大于文件的长度,那么会报角标越界异常,如果是在 集合末尾,那么直接缀杂末尾,如果是在中间,那么后面的元素统一后移,这个元素会放到这里。
remove(int index):如果是末尾,直接删除;中间的话后面的元素会统一往前移;会返回被删除的元素
set(int index,E element):替换指定位置的值;会返回被替换的元素
get(int index):会获得指定位置的值;会返回指定位置的值
List中的遍历方法
for(int i=0;i<l.size();i++) {
System.out.println(l.get(i));
}
并发修改异常
如果用迭代器进行遍历的时候,调用集合中的方法对集合进行修改,那么就会发生并发修改异常
解决办法 ①让集合本身进行遍历然后进行修改
②让迭代器进行迭代的时候调用迭代器中的方法进行修改
用第二种方法的时候如果利用Iterator迭代器的话里面功能太少,只有remove()操作,删除的是迭代器中迭代器最后的元素
这里调用子类listIterator,这里的功能比Iterator强大很多,
ListIterator<String> li = l.listIterator();
while(li.hasNext()) {
if(li.next()=="sdf") {
li.set("aaaa");
}
}
vector
线程安全,效率慢,顺序存储,增删较慢
特有方法
addElement(E obj):将其元素添加到集合的末尾,大小加1
removeElement(Object obj):删除指定元素,如果有重复,从前往后看,删除碰到的第一个
elements():返回一个枚举器类型
枚举器的遍历方法
Enumeration elements = v.elements();
while(elements.hasMoreElements()) {
System.out.println(elements.nextElement());
}
LinkedList
特有方法
addFirst(E e):在头部添加一个元素:因为其有头指针和尾指针,所以在头部和尾部添加速度特别快
addLast(E e):在尾部添加一个元素
getFirst():获取头部元素
getLast():获取尾部元素
removeFirst():删除头元素
removeLast():删除尾元素
Set
无序;没有任何前后的分别;所有的元素没有位置的概念;所有的元素都在集合中;没有索引;集合中没有任何的位置相关的方法
不能存储相同的元素:因为没有位置的区别,存储了相同的也没有办法进行调用查看
存取顺序可能不一样
HashSet
底层为哈希表,保证了元素的唯一性,值相同的元素都给去掉了,但是进行自定义类型存储时,会进行哈希值的比较,如果哈希值不相等,
即便内容一样,也会认为是不一样
保证不重复机制
先比较哈希值
相同:再进行equals比较
equals相同:重复元素,不进行存储
equals不相同:不重复元素,存储时会挂到相同哈希值的后面
不相同:直接进行存储
TreeSet
底层为二叉树,保证元素唯一,且可以进行排序。
如果是字符串就可以直接进行排序,但是对于自定义类就不可以直接进行排序,因为String类实现了Compable的接口
所以如果自定义类想实现排序则也必须进行实现Compable的接口重写compareTo方法。
返回值为0则相等,返回值为1向右存储,返回值为-1向左存储。这个存储顺序可以保证输出顺序。
下一篇: Navicat Premium连接MySQL报错:error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded
推荐阅读
-
单列集合Collection-------------List和Set
-
小王说来来斗地主,但是木有牌,怎么办-------模拟斗地主洗牌和发牌 对牌进行排序 并同时使用Map,List,Set等集合
-
java中循环遍历删除List和Set集合中元素的方法(推荐)
-
java中循环遍历删除List和Set集合中元素的方法(推荐)
-
python 学习之 数据结构 列表(list)和元组(tuple)字典 (dict)和 集合(set) 以及各自性能
-
Python中的列表(list),元组(Tuple),字典(Dict)和集合(Set)
-
Python学习之集合(set)的功能、定义和实例讲解
-
Java基础知识回顾之四 ----- 集合List、Map和Set
-
java基础语法集合框架与泛型(List和Set)
-
【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)