Java学习第十八天——集合,List和链表

Java学习第十八天——集合,List和链表,第1张

Java学习第十八天——集合,List和链表

1 概述

Java集合是使程序能够存储和 *** 纵元素不固定的一组数据。 所有Java集合类都位于java.util包中。

【问】:之前我们需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供Java集合工具类呢? 
我们通过对比数组和Java集合工具类来解释Java集合工具类的必要性。

数组

集合

长度固定

长度不固定

存放任意类型

不能存放基本数据类型,只能存放对象的引用


注意:如果集合中存放基本类型,一定要将其 “装箱”成对应的”基本类型包装类”。

2 Collection

2.1 继承体系

Java的集合类主要由两个接口派生而出:Collection和Map。Collection和Map是Java结合框架的根接口,这两个接口又包含了一些子接口或实现类。

层次结构如图所示

Java集合类有清晰的继承关系,有很多子接口和实现类。但是,并不是所有子接口或实现类都是最常用的。

下面我们列举出最常用的几个子接口和实现类:

Collection ——> List ——> ArrayList类

Collection ——> List ——> linkedList类

Collection ——> Set ——> HashSet类

Collection ——> Set ——> SortedSet接口 ——> TreeSet类

Map ——> HashMap类

Map ——> SortedMap ——> TreeMap类

 2.2 常用方法

 2.3 使用方法

 代码实现    

         // 创建集合对象
        Collection c1 = new ArrayList<>();
        // 判断是否为空,即个数是否为0
        System.out.println(c1.isEmpty());
        // 集合中是不能保存基本类型的,需要转换为对应的包装类才可以
        // 这里会进行自动装箱为Integer类型,然后发生多态转型为Object类型进行存储
        c1.add(123);
        c1.add(new Integer(1));
        c1.add(new Collection_01());
        // 个数
        System.out.println(c1.size());
        System.out.println(c1.isEmpty());
        // 删除,会调用要删除的元素的equals方法,但是Integer覆写了,所以可以把1删除掉
        c1.remove(1);
        A a = new A("张三");
        A a1 = new A("张三");
        c1.add(a);
        // 所以使用集合保存自定义类型的时候,要注意是否要覆写equals方法,定义怎么算相等
        c1.remove(a1);
        // 把集合转换为数组
        Object[] arr = c1.toArray();
        for (Object object : arr) {
            System.out.println(object);
        }
        // 清空集合
        c1.clear();
        System.out.println(c1.size());

2.4 注意Contains和Remove

Contains(数据) : 判断集合中是否包含某个元素

Remove(数据 ) : 删除指定元素

两个方法底层都会自动调用该对象的equals方法

因为不管是判断是否包含还是删除,都要先找到这个数据,而找到只能比较

但是集合中保存的都是引用类型,所以比较只能使用equals方法

所以如果存储的是自定义类型,就要考虑equals方法的覆写问题

3 Integer

3.1 概述

 在面向对象的编程中,迭代器模式是一种设计模式,是一种最简单也最常见的设计模式
 * 它可以让用户透过特定的接口寻访容器中的每一个元素,而不用了解底层的实现
 * 获取该集合的迭代器对象
 * Iterator it=集合对象.iterator();
 *               三个方法:
 *                       1 boolean hasNext():判断下面有没有元素,如果有就返回true,没有就返回false
 *                       2 E next():获取下一个元素,并指向下一个元素
 *                       3 remove(): 删除当前指向的元素
 *              三个方法的使用步骤就是1,2,3,按照这个顺序调用
 *   注意 : 迭代器一旦创建,集合中就不能添加和删除元素(长度就不能更改了)
 *            如果添加或者删除了元素,那么迭代器必须重新生成
 *   增强for循环:就是为了让用iterator循环访问的方式简单,写起来更方便,当然功能不太全,比如删除时还是要用iterator来删除

 3.2 常用方法

 3.3 使用方法

代码实现    

        Collection c1=new linkedList();
        c1.add(1);
        c1.add("abc");
        //判断是否包含
        System.out.println(c1.contains(1));
        //1 创建迭代器
        Iterator it=c1.iterator();
        //遍历  判断下面是否有元素
        while(it.hasNext()){
            //获取并指向下一个元素
            Object obj=it.next();
            System.out.println(obj);
        }
        //使用完之后想要再次使用需要重新创建
        it=c1.iterator();
        //迭代器创建之后不能添加和删除,必须重新生成迭代器
        c1.add(2);
        c1.add(3);
        c1.remove(1);
        it=c1.iterator();
        while (it.hasNext()) {
            //获取并指向下一个元素
            Object obj=it.next();
            System.out.println(obj);
            //使用迭代器的时候不能更改集合个数,所以删除数据的时候不能使用集合的删除,应该使用迭代器的删除
            //c1.remove(obj);
            it.remove();
        }
        System.out.println(c1.size()+"-----");

4 List

4.1 概述

 * List特点: 有序,可重复
 *               有序: 添加顺序和取出顺序是一致的
 *               可重复: 就是可以有重复的数据
 * ArrayList: 底层是个Object数组,随机查询和更改效率高,但随机添加和删除效率低
 * linkedList: 底层是一个双向链表,随机查询更该效率低,但随机添加和删除效率高

4.2 ArrayList

4.2.1概述

   ArrayList底层是数组,下标从0开始
 *                 默认初始化容量为10,扩大容量为原始容量的1.5倍
 *                 并且默认容量是第一次添加数据的时候设置的
 *            也就是说,我们new ArrayList()的时候,数组长度是为0的
 *                 1.5倍: 长度+长度>>1    

       

 4.2.2基本使用

        //创建对象
        //Vector已经过时了,ArrayList是Vector的升级版,Vector是线程安全,而ArrayList是非线程安全
        List list=new ArrayList();
        list.add(100);
        list.add(123);
        //[100,123]覆写了toString方法
        System.out.println(list);

4.2.3 常用方法

         //add(E e): 尾部添加
        //add(int index,E e): 添加到指定位置
        //set(int index,E e): 更改指定位置上的元素值
        //remove(Object object): 根据元素内容删除
        //remove(int index): 根据索引删除
        //get(int index): 获取指定位置的数据 

4.2.4 遍历

    代码实现    

         //传统for遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //foreach遍历
        for (Object object:list) {
            System.out.println(object);
        }
        //迭代器遍历
        Iterator it=list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());

4.3 linkedList

 4.3.1 基本使用及方法

    和 ArrayList *** 作 一样

4.3.2 底层实现

4.3.2.1 Node节点类

 链表: 保存的都是节点,每个节点都有三个属性,分别是: 添加的数据,上一个节点引用,下一个节点引用

 4.3.2.2linkedList类

 4.3.2.3 add方法实现

 

 4.3.2.4 Get方法实现

 

 

 获取数据

Get方法 只是模拟了下标获取数据的方式,本质就是遍历,从头挨个去找

所以这可以理解为 并不是下标,只是决定了循环次数

而 ArrayList的get才是根据下标获取

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4670261.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存