? ?
活动地址:CSDN21天学习挑战赛
集合相比数组的优势
1.存储个数
数组定义后类型确定,长度固定
集合类型可不固定,大小可变
2.存储元素类型
数组可以存储基本类型和引用类型数据
集合只存储引用类型数据
3.各自适合的场景
数组适合数据个数和类型确定的场景
集合适合数据个数不确定,且可做增删元素的场景,
集合种类更多,功能更强
集合概述体系和常用API
1.体系结构
分为单列(Collection)和双列(Map)
单列集合,每个元素(数据)只包括一个值
双列集合,每个元素包含两个值,即键值对
Collection 单列
它的功能能被全部单列集合继承使用
List系列集合特点
添加的元素是有序,可重复,有索引的
如ArrayList、LinkedList
注:
有序:存储和取出元素顺序一致
有索引:可以通过索引操作元素
可重复:存储的元素可以重复
Set系列集合特点
HashSet:无序,不重复,无索引;
LinkedHashSet:有序,不重复,无索引;
TreeSet:按照大小默认升序,不重复,无索引
2.Collection API
如图:
Collection 集合的遍历方式
遍历即:一个一个的把容器中元素访问一遍
方式一:迭代器
代表:Iterator 对象 是集合的专用遍历方式
获取迭代器
方法:
Iterator <对象>iterator()
即返回集合中迭代器对象,
该迭代器对象默认指向当前集合的0索引
ArrayList list=new ArrayList();
list.add("张三");
如获取Iterator对象
Iterator it =list.iterator();
Iterator 中常用方法
1.查询当前位置是否存在元素,存在返回true
boolean hasNext()
2.获取当前位置元素,同时将迭代器对象移向下一个位置,注意此时这些元素默认为Object 类型,若要指定元素类型,则需要强制转换
对象.next()
//注意取元素越界时会导致NoSuchElementException 错误
如判断集合是否有下一个元素
while(it.hasNext){
Object obj=it.next()
if("张三".equals(obj))
list.remove(obj);
}
方式二:foreach或增强for循环
1.增强for循环 可以遍历集合和数组
for(元素数据类型 变量名: 数组或Collection集合)
{
}
如:
Collection<String> list=new ArrayList<>();
for(String e:list){
System.out.println(e);
}
注意:增强for修改第三方变量值不会影响集合中元素
方式三:lambda表达式
Lambda 表达式遍历集合
1.常用API
方法
default void forEach(Consumer<? super T>action)
一种结合lambda遍历集合的方法
Collection<String>lists=new ArrayList<>();
lists.forEach(new Consumer<String>(){
@Override
public void accept(String s){
System.out.println(s);
}
});
即:
lists.forEach(s->{
System.out.println(s);
});
Collection集合对自定义类型对象的存储
集合中存储的是元素的地址。 样例: 实现在后台存储三部电影,依次展现出来
class Movies{
private String name;
private double score;
private String autor;
public Movies(String name,double score,String autor)
{
this.name=name;
this.score=score;
this.autor=autor;
}
public String getName(){
return this.name;
}
public double getScore(){
return this.score;
}
public String getAutor(){
return this.autor;
}
}
public class Main{
public static void main(String []args){
Collection<Movies> m=new ArrayList<>();
m.add(new Movies("阿甘正传",9.5,"汤姆.汉克斯"));
m.add(new Movies("霸王别姬",9.6,"张国荣,张丰毅"));
m.add(new Movies("肖申克的救赎",9.7,"罗宾斯"));
for(Movies s:m){
System.out.println("片名:"+s.getName());
System.out.println("评分:"+s.getScore());
System.out.println("主演:"+s.getAutor());
}
}
}
内存图:
List系列集合
特有方法(索引操作API)
1.在指定位置插入指定元素
void add(int index,E element)
2.删除指定索引处元素,返回被删除元素
E remove(int index)
3.修改指定索引处元素,返回被修改的元素
E set(int index,E element)
4.返回指定索引处元素
E get(int index)
实现类的底层原理
1.ArrayList底层时基于数组实现,
特点是
查询元素快,增删相对慢;
第一次创建集合并添加第一个元素时,在底部创建一个默认长度为10的数组
2.LinkedList底层基于双链表实现的
特点是查询元素慢,增删首尾元素快
遍历方式
1.迭代器
2.增强for循环
3.Lambda表达式
4.for循环(List集合存在索引)
LinkedList特点
1.特有功能(首尾操作API)
1.列表开头插入指定的元素
public void addFist(E e)
2.追加指定元素到列表尾部
public void addLast(E e)
3.返回列表中首个元素
publc E getFirst()
4.返回列表中最后一个元素
publc E getLast()
5.列表删除并返回第一个元素
public E removeFirst()
6.列表删除并返回最后一个元素
public E removeLast()
2.LinkedList内存图 ArrayList内存图
泛型的使用
概念
泛型是JDk5中引入的特性 注意:
集合都是泛型的形式,
可在编译阶段约束集合只能操作某种数据类型
Collection<Sting> lists=new ArrayList<String>();
Collection<Sting> lists=new ArrayList<>();
Collection<int> lists=new ArrayList<>();
Collection<Integer> lists=new ArrayList<>();
Collection<Integer> lists=new ArrayList<>();
集合并发修改异常问题
1.遍历异常出现的可能
1.迭代器遍历集合且直接用集合删除元素时可能出现
2.增强for循环遍历集合且直接用集合删除元素时可能出现
2.遍历且删除元素正常情况
1.迭代器遍历集合,然后用迭代器自己的删除方法
2.使用for循环遍历并删除元素不会发生错误
|