第一章,集合框架与泛型(一)

高级编程

第一章,集合框架和泛型(一)
一,集合框架
  • 在 不知道 程序运行时会 需要多少对象 ,或者需要更 复杂的方式存储对象 ,可以使用Java 集合框架,集合中不可以存放基础数据类型,只可以放引用数据类型。

  • 集合框架位于java.util包中

1.1接口
  • (集合的父接口)Collection接口:储存一组不唯一,无序的对象
  • (集合的子接口)List接口:储存一组不唯一,有序地(插入顺序)的对象
  • (集合的子接口)Set接口:储存一组唯一,无序的对象
    在这里插入图片描述
1.2,实现类(Collection->List接口实现类)
  • List接口的特点:有序切不唯一

  • ArrayList:实现长度可变的数组,在内存分配连续的空间。遍历元素和随机访问元素的效率比较高

  • 在这里插入图片描述

  • 语法

    • ArrayList 集合名=new ArrayList();
      
  • LinkedList:采用链表存储方式。插入删除时效率比较高

  • 在这里插入图片描述

  • 语法

    • LinkedList 集合名 =newLinkedList();
      
  • 遍历有序且不唯一的集合

    //使用普通for循环遍历list中的元素
    for(int i = 0 ; i < list.size() ;i++){
        //list.get()方法获取当前下标中的元素,类型为Object类型,使用时需要强转
        News news = (News)list.get(i);
        //打印news中的Title属性
        System.out.println(news.getTitle());
    }  
    
    //使用增强型for循环取出list中的元素
    for(Object i : list){
        News news =(News) i;
        news.getTitle();
    }
    
    //使用迭代器迭代出list中的元素
    Iterator itor = list.iterator();//获得迭代器tior
    //通过迭代器迭代出集合元素
    while(itor.hasNext()){
        //News news = (News)itor.next();
        //System.out.println(news.getTitle());
        //将上面两句整合成一句
        System.out.println(((News)itor.next()).getTitle());
    }
    
1.3,实现类(Collection->Set接口的实现类)
  • Set接口的特点:唯一,无序

    • Set中放对象的引用(内存地址)
    • Set接口采用对象的equals()方法比较两个对象是否相等
  • HashSet(Set接口的常用实现类)

  • 语法

    Set 集合名 = new HashSet();
    
  • 遍历无序且唯一的集合

    //使用增强for遍历set元素
    for(Object obj : set){
        System.out.println(((News)obj).getTitle());
    }
    
    
    //使用迭代器遍历set元素
    Iterator itor = set.iterator();  //获得迭代器tior
    //通过迭代器迭代出集合元素
    while(itor.hasNext()){
        News news = (News)itor.next();
        System.out.println(news.getTitle());
    }
    
1.4,算法
  • Collection类:提供了对集合进行排序,遍历等多种算法实现
  • Arrays类:提供了对数组进行排序,遍历等多种算法实现
二,ArrayList和LinkedList的区别
2.1,ArrayList
  • 底层数据结构:ArrayList基于动态数组实现,内部维护一个Object数组,默认初始容量为10,当元素超过当前容量时自动扩容
  • 随机访问效率:由于基于数组,ArrayList支持通过索引快速访问元素,时间复杂度为O(1)
  • 插入和删除效率低:在中间或开头插入/删除元素时,需要移动后续元素,时间复杂度为O(n)
  • 适合随机访问:对于频繁随机访问元素的场景,ArrayList性能更好
2.2,LinkedList
  • 底层数据结构:LinkedList基于双向链表实现,每个节点包含数据元素和指向前后节点的引用
  • 插入和删除效率高:在任意位置插入或删除元素时,只需调整相邻节点的引用,时间复杂度为O(1)
  • 顺序访问效率低:由于基于链表,LinkedList不支持随机访问,需要从头或尾开始遍历,时间复杂度为O(n)
  • 适合频繁插入和删除:对于频繁插入和删除场景,LinkedList性能更好
2.3,总结
  • 如果需要频繁随机进行访问操作,应该选择ArrayList
  • 如果需要频繁进行插入和删除操作儿访问操作较少,应该选择LinkedList
  • 在需要同时大量随机访问和插入和删除元素时,可以根据具体场景具体分析
2.4,特殊情况
  • 头插法插入数据

    • ArrayList:使用头插法插入数据时,需要将已有元素依次向后移动,因为ArrayList在中间或开头插入元素的时间复杂度为O(n),效率较低。
    • LinkedList:LinkedList在头部插入元素时效率较高,只需要调整指针即可,时间复杂度为O(1)。
  • 尾插法插入数据

    • ArrayList:使用尾插法插入数据时,由于ArrayList在末尾添加元素的时间复杂度为O(1),效率较高。
    • LinkedList:LinkedList在末尾插入元素时也需要调整指针,但时间复杂度也为O(1)

    对于尾插法插入数据,无论是ArrayList还是LinkedList都能够以较高的效率进行插入操作。

    综上所述,使用头插法插入数据时应选择LinkedList,而使用尾插法插入数据时,ArrayList和LinkedList都可以达到较高的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值