Java 集合及相关数据结构,List系列集合和泛型使用


活动地址: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中引入的特性
注意:

集合都是泛型的形式,
可在编译阶段约束集合只能操作某种数据类型
//JDK1.7前的写法
Collection<Sting> lists=new ArrayList<String>();
//JDK1.7后的写法
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循环遍历并删除元素不会发生错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅花与竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值