美文网首页java学习记录
java集合---List接口与其实现类ArrayList

java集合---List接口与其实现类ArrayList

作者: 一花一世界yu | 来源:发表于2020-04-17 20:56 被阅读0次

一、重点问题

集合中存储的只能是对象,引用数据类型,存储他们的地址

不能存储基本数据类型,但是自动装箱解决了这个问题

数组和集合都是引用类型的数据都存储在堆中

集合中的实现类都包含了重写了toString方法,但是不一定是实现类自己重写的,也可能是他的抽象父类重写的tostring

集合中所存储的都是对象的地址

向下强转是有条件的,当父类是子类向上转型出的时,所以集合中整型转为的object可以转为int

retainall()代表交集

因为集合只能存储引用类型,所以泛型也要是一个引用数据类型

iterator.next()当没有元素取得时候会报空指针异常

迭代器工作期间不能改变集合结构

在单元测试中是不能执行键盘输入操作的

迭代器用一次后指针会移到末尾,想再次遍历集合,就要再定义一个迭代器的对象,此时新迭代器的指针是在集合最初位置的

迭代器遍历工作中,不要改变集合中元素的个数,不然会出现问题

iteactor.remove删除的是刚被迭代过的元素,但这个元素仍然被迭代了,但是你再看集合,集合中的这个元素是被删除了的

list扩展了collection的功能,使集合变得有序且可重复

数据流每次调用write后最好刷新一下缓冲区,确保数据写入硬盘

集合也可以作为属性,他也是引用数据类型

一般用集合作为属性都会在定义时给他赋值,创建内存空间,防止下面使用的时候出现空指针异常

list 和set[]装
map用{}装

ArrayList将list中的方法全部实现,没有新加方法

LinkedList也将list中的方法全部实现,而且也实现了Deque双端对列中的方法

Arrays.aslist中的参数如果你传的是基本数据类型数组,他默认只有一个参数,改成包装类数组就好了

hasNext只判断,不下移指针,下移指针的是next();

迭代器只是迭代器不是个容器

迭代器是用来遍历collections的,Map不用迭代器遍历

记住单例模式别忘了属性和方法要加static
切记,不然你的构造器都私有了,你不static怎么调用对象呢!

二、重点问题

1、关于remove方法的使用问题

public class HomeWork {

        public static void main(String[] args) {

            Collection c=new ArrayList();

            c.add(95);

            c.add(66);

            c.add(66);

            c.add(66);

            c.add(66);

            c.add(66);

            c.remove(0);

            System.out.println(c);

        }

    }

    此时默认调用的是remove(object o)这个方法,通过查看源码可知,remove是子类Arraylist中对父类remove方法的重载,collection中只有参数为object对的remove方法,通过多态性形式创建对象时,只能用子类重写的方法,子类自己重载的方法你是不能用的,想用只能向下强转为Arraylist,所以此时他是不会去删除的,他把0通过包装类去查找,但是此时并没有0,注意他是查找对象,而不是下标,注意观察IDEA中的参数标记

2、System.in  标准输入流

InputStreamReader i1 = new InputStreamReader(System.in);

System.in返回的是一个基础流iputstream,但是InputStreamReader的参数可以接受基础流,其他的流不行,要建立在节点流的基础上,System.in是一个特例

三、课堂知识

3.1、泛型Generics

概念:广泛的类型——>声明要存储的类型是什么。

引入泛型的原因:存入到容器中的元素,Object类型,向上转型。当获取的时候,需要手动的向下转型,降低效率,容易出错。

使用:在创建集合的时候,使用泛型来指明该容器中,能够存储的数据类型。

目的:保护容器中的数据的类型的安全。

语法:

    容器<数据类型> 容器对象 = new 容器<>();

​注意点:因为集合仅限于存储引用类型,所以声明泛型不能直接写基本数类型,需要写对应的包装类。

​()-->方法

[]-->数组

{}-->map

<>-->泛型

集合对象直接打印,不显示集合的地址,直接显示集合中存储的元素。集合对象,都重写了toString();

3.2、迭代器Iterator

集合:java容器-->装数据

使用迭代器Iterator来获取集合中的数据。一个一个一个的获取。

迭代器使用:

step1://先在要遍历的集合上,获取迭代器对象

    c1.iterator();--->Iterator it

step2:判断迭代器对象之后是否有元素

    it.hasNext();--->boolean

step3:获取该元素:

    it.next()-->元素

注意点:

    1、每次迭代获取前(调用next()),应该先判断是否有这个元素(hasNext()),如果有再获取,如果没有就不要获取,如果强行获取,就报错:java.util.NoSuchElementException

    2、迭代器在工作期间,集合本身不要去更改集合的结构。但是迭代器对象自己可以删除。(开发中一般不适用,需要移除直接在迭代器外面移除元素就好了)

3.3、List接口

作为Collection接口的子接口,也是一种容器。但是有自己的独特的存储特点。

有序,有下标。

可以允许数据重复。

新增了自己特有的功能方法:都是和下标有关系的。

set(index,E)-->指定位置替换元素

get(index)-->E,获取指定位置的元素

add(index,E)-->指定位置添加元素

remove(index)-->根据位置进行删除

indexOf()-->int,搜索指定的元素,返回下标,如果没有就返回-1

subList(fromIndex,endIndex)-->List,截取子集合

遍历一个List接口中的所有元素:

for-each,增强for循环

Iterator,迭代器

普通的for循环,结合get()方法。

3.4、ArrayList实现类

作为List接口的实现类,将接口中的方法全部实现。

底层:数组的结构来实现的。也叫动态数组。

数组结构:在内存中连续空间。

理解为ArrayList相当于一个可变长度的数组,访问遍历效率较高。增加,删除元素,效率较低。

相关文章

网友评论

    本文标题:java集合---List接口与其实现类ArrayList

    本文链接:https://www.haomeiwen.com/subject/lbquvhtx.html