1.前一天重点内容复习
增强for循环的目的和格式
目的:替代迭代器,便于书写格式
格式:
for(数据类型 变量名: 集合对象){
使用变量名访问数组中的对象
}
注意事项:使用 集合对象不能为null
List集合如何给自定义对象去重
方式1:使用新建空集合思想,遍历之前的集合,判断新集合中是否有之前集合的当前元素,如果包含就添加,否则就遍历下一个之前集合对象,使用此方式调用contains()方法底层依赖于equals()方法
方式2:使用排序选择思想,改动条件和操作为如果前面元素和后面元素一样则将后面元素从集合中移除,角标减一,此方式直接调用equals()方法,必须重写equals()方法和hashcode()方法
选择排序思想和核心代码体现
核心思想:
在待确定位置顺序的数组中,第一位与其他位置的数据依次比较,如果比第一个小就交换位置,遍历完成后第一位则为已经确定的数据,之后其他数据又组成一个新的数据,重复以上操作,直至将数组中的顺序完全确定出来
选择核心代码:遍历arr[]
for(int x = 0 ; x < arr.length-1 ; x++){
for(int y = x+1 ; y < arr.length ; y++){
if(arr[y] < arr[x]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
List集合存储元素可能会出现的异常
异常现象:ConcurrentModificationException
名称:并发修改异常
原因:使用迭代器去遍历元素时,对元素进行操作(添加,修改,删除),由于迭代器正在访问集合元素,这个时候再对集合元素做其他操作,相当于有两个对象对集合元素进行了操作,就会出现异常
解决方案:
1.使用List迭代器遍历,再用List迭代器的相关操作方法去实现对集合对象的一些操作
2.通过List集合的get(int index)和size()加普通循环完成集合遍历,使用集合的功能去实现对集合对象的操作
List集合遍历方式
1.继承自Collection集合的object[] toArray()方法,将集合转换为数组进行遍历
2.Collection的迭代器Iterator iterator()
3.List集合的特有遍历方式,ListIterator listiterator()
4.get(int index)+size()+普通循环操作实现
5.增强for循环
2.List集合三个子实现类的特点
ArrayList:
是通用的,单线程中的执行效率高,List集合默认使用ArrayList来操作
底层的数据结构为数组结构,查询快,增删慢
单线程类,线程不安全,不同步,执行效率高
具有扩容性,可以1.5倍扩容
构造方法:
public ArrayList():构造一个初始容量为10的空列表
public ArrayList(int initialCapacity):构造指定初始化容量列表
Vector:
底层数据结构是数组,查询快,增删慢
多线程类,同步,安全,执行效率低
特有功能:
public void addElement(E obj):在vector的末尾添加一个新的元素
public E elementAt(int index ):获取指定位置处的元素
public Enumeration<E> elements():类似迭代器一样,返回一个Enumeration接口,里面有两个类似于迭代器接口的方法
boolean hashMoreElements():是否有更多的元素可以遍历
E nextElement():获取下一个元素
LinkedList:
底层数据结构为链表,查询慢,增删快
不同步,不安全,执行效率高,适用于单线程
特有功能:
public void addFirst(Object e):将任何类型元素添加到链表开头
public void addLast(Object e):将任何类型元素添加到链表末尾
public Object removeFirst():从链表中删除第一个元素并返回
public Object removeLast():从链表中删除最后一个元素并返回
public Object getFirst():获取链表第一个元素
public Object getLast():获取链表最后一个元素
3.数组和链表
数组
查询:通过索引值来快速访问到元素
添加,删除,修改:创建一个新的数组,遍历原来数组,找到需要操做的元素,元素之前按照原来方式存储在新数组中,对元素进行相应操作后存入新数组,之后将元素之后的存入新数组
特点:查询快,增删慢
链表
介绍:使用一个链子将元素链接起来的一个列表,由数据域和指针域组成,数组域存储数据值,指针域存储下一个数据地址值
查询:不论查询那个元素,都是从链表开头开始查询
添加,删除,修改:修改改动位置前一个元素的指针域,当前元素指针域和下一个元素指针域
特点:查询慢,增删快
4.set接口
特点:
元素不重复,元素唯一
元素无序性,存储的顺序和取出的顺序不一致
子实现类:
HashSet<E>:
存储和取出元素,不能保证次序不变,底层是哈希表,HashMap<K,V>实例
new HashSet集合对象,本质就是创建了一个HashMap的实例,HashSet集合中的add()方法,底层依赖于Object类的HashCode()和equals()方法,如果要存储自定义对象并且保证对象唯一,则自定义对象必须重写Object类的HashCode()和equals()方法,不仅要确定哈希码值一样,还要确定成员信息都一样,才可以保证自定义对象唯一
TreeSet<E>:
TreeSet底层依赖于TreeMap实现
TreeMap的底层数据结构是一个red-black-tree(红黑树结构)是一种自平衡的二叉树结构,使用不同的构造方法,完成的排序方式不一样
TreeSet():无参构造方法,如果里面存储的类型实现Compareable接口,重写Compareable接口中的compareTo()方法,即可对此对象实现自然排序
public TreeSet(Comparator<E> comparator):有参构造方法,实现比较器排序
此集合并不是只有存和取,还要按照某种条件排序