Day15.01_____数组的特点
- 数组(数组是容器的一种)
- 既可以存储基本数据类型,又可以存储引用数据类型(对象)
- 长度是固定的,不能自动增长
- 存储引用数据类型时,存储的是数据的地址值,未赋值时,默认值为null;存储基本数据类型时,存储的是基本数据类型所对应的值,未赋值时,默认值为对应基本数据类型的默认值
Day15.02_____集合的特点
- 集合(集合是容器的一种)
- 只能存储引用数据类型(对象),当我们存储基本数据类型时,底层会帮我们自动将基本数据类型进行拆箱,转换成对象后再放入集合中
- 长度可以改变
- 有些集合底层其实也是用数组实现的。每次集合中的数据存储满了以后,底层就会增加1.5倍数组的长度。
- 为什么是1.5倍的数组呢?
解释: 如果是2倍的长度,当我们把长度为10的数组增加到长度为11时,会浪费9个空间,而1.5倍只浪费4个空间,相对来说节省了空间;如果是1倍的长度,当我们把长度为10的数组增加到长度为11时,就会把原来的抛弃,当成垃圾,当我们又想把长度为11的变成长度为12的时候,又会把11的抛弃,当成垃圾。也特别的浪费空间,因此选择1.5倍的增长是最合适的
- 为什么是1.5倍的数组呢?
Day15.03_____Collection接口
- Collection是所有接口的根接口
- Colleciton集合的分类
- List(底层由数组实现):
- List子类
- ArrayList
- Vector
- LinkedList
- List类型的集合特点:和数组类似
- 有序,即存和取的顺序一样,有索引
- 元素可以重复,因为有索引
- List子类
- Set:
- Set子类
- HashSet
- TreeSet
- Set类型的集合特点:
- 无序, 即存和取的顺序不一样, 无索引
- 元素不可以重复,因为没有索引
- Set子类
- List(底层由数组实现):
- Collection集合的抽象方法
- 1、基本功能:
- clear()
返回值类型Boolean,用于清空地址引用 - contains(Object o)
返回值类型Boolean,用于判断集合对象中是否包含对象o - equals(Object o)
返回值类型Boolean,用于集合和集合之间的比较。使用List类的子类创建Collection接口的子类对象时,里面的元素只有当个数一样且顺序相同时才会返回true - isEmpty()
返回值类型Boolean,用于判断集合中是否为空 - remove(Object o)
返回值类型Boolean,用于移除集合中的某个对象 - size()
返回值类型int,用于获取集合的长度 - toArray()
返回值类型Object[] ,用于将集合转换成数组 - iterator()
返回值类型Iterator,用于将集合对象转换成一个Iterator对象
- clear()
- 2、add()方法和toString()方法
- add(Object o)
返回值类型Boolean,用于向集合中添加数据,当我们用List类的子类创建Collection引用时,使用add方法无论添加什么都会返回true;那什么时候返回false呢?当我们用Set类的子类创建Collection引用时,如果集合中添加了相同的元素,就会报错,因为Set类是无序的,里面的元素是不可以重复的 - toString()
返回值类型String,用于返回集合中存储对象的属性值,这个方法不是在ArrayList类中重写的,是在它的爷爷类中重写的
- add(Object o)
- 3、高级功能(所有带All的方法):
- addAll(Collection c)
返回值类型Boolean,遍历o中的所有元素,并将元素加入调用addAll方法的接 口对象中。- addAll()与add()方法的区别:
- addAll()方法会将o对象先进行一个遍历,然后将遍历得到的每一个数据加入到调用addAll()方法中,此时集合的长度为调用集合长度+参数集合长度;add()方法不会遍历参数集合,而是直接将参数集合整体作为一个数据放入到调用集合中,此时集合的长度为: 调用集合长度+1
- addAll()与add()方法的区别:
- containsAll(Collection c)
返回值类型Boolean,用于判断调用集合是否包含参数集合,只要包含一个就返回true - removeAll(Collection c)
返回值类型Boolean,删除的是交集。如果两个集合没有交集,就返回调用集 合中的元素 - retainAll(Collection c)
返回值类型Boolean,取交集。需要注意的是取了交集后,如果调用集合里面的元素发生了改变就返回true;如果调用集合里面的元素没有发生改变就返回false。如果两个集合没有交集,就返回"[]"
- addAll(Collection c)
- 1、基本功能:
Day15.04_____Iterator接口
- Iterator是什么?
用于遍历集合东西,和for循环遍历数组是一个意思 - 为什么要用Iterator?
在没有学迭代器之前,我们每次遍历集合中的元素都需要先将集合转换成数组,然后再对数组进行操作。我们都知道数组的长度是不可变的,当我们想要再一次添加或者减少数据时,又必须重新创建一个集合,特别的浪费空间,操作也特别麻烦,因此提出了新的概念,迭代器。它是专门用于遍历集合的 - Iterator中的方法
- hasNext()
返回值类型Boolean,用于判断集合中是否还有元素。如果有就返回true,没有就返回false - next()
返回值类型Object,用于取出集合中的元素。next()方法相当于一个指针,第一次指向集合中的第一个元素,当我们调用next()方法的时候,首先取出这个元素,然后将指针指向第二个元素。需要注意的是在迭代器中next()方法只能用一次
- hasNext()
Day15.05_____List接口
- 因为List是一个接口,不能直接创建对象,因此只能采用父类引用指向子类对象的方式进行创建
- 成员方法:除了拥有Collection接口中的所有方法,还有一些自身的特定方法
- add(int index, Object o)
返回值类型void,用于在集合中的指定位置添加对象,例如在集合中1的位置添加对 象,那么在原集合中从索引1到最后会向后延,同时里面的index最大只能为集合的长度 - addAll(int index, Collection c)
返回值类型Boolean,用于在集合的指定位置添加集合,数据底层解析的原理和addAll(Collection c)一样,添加数据的原理和(1)的一样,其中index最大只能为集合的 长度 - get(int index)
返回值类型Object,返回集合中对应索引的对象,其中index最大只能为集合长度-1 - indexOf(int index)
返回值类型Object,用于获取某一对象在集合中第一次出现的位置 - lastIndexOf(int index)
返回值类型Object,用于获取某一对象在集合中最后一次出现的位置 - remove(int index)
返回值类型Object,移除指定位置的对象,并将这个移除的对象返回。其中index最大只能取集合的长度-1 - set(int index, Object o)
返回值类型Object,修改原集合中指定位置的元素 - subList(int fromIndex, int endIndex)
返回值类型List,截取原集合中的子集合,包含fromIndex,不包含endIndex - listIterator()
返回值类型ListIterator,用于将集合对象转换成ListIterator对象
- add(int index, Object o)
- 遍历List接口类型集合的方法
- 通过size()和get()方法去遍历并且获取集合中的每一个对象
* 注意:这种方法只适合List集合,不适合Set集合,因为Set集合没有索引 - 通过迭代器Iterator接口中的hasNext()和next()方法遍历并获取集合中的每一个对象
* 注意:这种方法对List和Set集合都适用 - 通过迭代器ListIterator接口中的hasNext()和next()方法遍历并获取集合中的每一个对象
- 通过size()和get()方法去遍历并且获取集合中的每一个对象
Day15.06_____ListIterator接口
- ListIterator是Iterator的子接口,专门给List集合用
- 成员方法:
- hasNext()
返回值类型Boolean,用于判断集合中是否还存在元素,与Iterator接口中的概念一样 - next()
返回值类型Object,用于返回集合中的某一个元素
- hasNext()
- 异常 ----> java.util.ConcurrentModificationException(并发修改异常)
此时这段代码会报异常,因为迭代器在迭代的过程中,集合又同时在往里 面加对象,两样东西同时在对同一样东西操作,因此报了一个同时并发异常,如果想不报错,我们可以使用List集合特有的ListIterator迭代器,这个迭代器中存在一个add()方法,以上可以修改成:class Demo{ List list = new ArrayList(); list.add(new Student("张三",23)); list.add(new Student("李四",24)); list.add(new Student("王五",25)); list.add(new Student("张麻子",26)); list.add(new Student("二哈",19)); Iterator it = list.iterator(); while(it.hasNext()) { Student stu = (Student)it.next(); if(stu.getName() == "李四") { list.add(new Student("二傻",29)); } } System.out.println(list); }
class Demo{ List list = new ArrayList(); list.add(new Student("张三",23)); list.add(new Student("李四",24)); list.add(new Student("王五",25)); list.add(new Student("张麻子",26)); list.add(new Student("二哈",19)); ListIterator it = list.listIterator(); while(it.hasNext()) { Student stu = (Student)it.next(); if(stu.getName() == "李四") { it.add(new Student("二傻",29)); } } System.out.println(list); }
Day15.07_____数据结构
- 栈结构特点 先进后出
- 队列特点 先进先出
- 数组构成特点 增删速度慢,查速度(通过索引查询)快,修改快
- 链表构成特点 增删速度快,查速度(通过记录的前后地址值查询)慢,修改慢
Day15.09_____List的三个子类特点
- ArrayList 底层由数组实现,查询快,增删慢,线程不安全,效率高
- Vector(淘汰) 底层由数组实现,查询快,增删慢,线程安全,效率低
- LinkedList 底层由链表实现,查询慢,增删快,线程不安全,效率高
- 面试题
- Vector和ArrayList区别?
- ArrayList和LinkedList区别?