一、重点问题
集合中存储的只能是对象,引用数据类型,存储他们的地址
不能存储基本数据类型,但是自动装箱解决了这个问题
数组和集合都是引用类型的数据都存储在堆中
集合中的实现类都包含了重写了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相当于一个可变长度的数组,访问遍历效率较高。增加,删除元素,效率较低。