Day-19-集合--list
- 常见数据结构
①基于数组和链表的数据结构对链表的操作
- 添加: 数组复制创建新数组, 链表直接挂在尾端 :基于数组慢,变量链表快
- 删除: 数组需要复制数据 链表直接改变链接 : 基于数组慢,变量链表快
- 修改: 数组直接找到索引位置 链表需要遍历链表 : 基于数组快,变量链表慢
- 查找: 数组直接找到索引位置 链表需要遍历链表 : 基于数组快,变量链表慢
增加 删除 修改 查找
基于数组 慢 慢 快 快
变量链表 快 快 慢 慢
②集合框架
1.什么是集合:看成是一些容器;
装数据,感觉容器是一种高级数组, 集合相比数组而言,还要高级一点,集合可以存储任意多个任意类型的数据.
arrayList的使用
ArrayList() 构造一个初始容量为 10 的空列表。
ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
ArrayList list = new ArrayList();
- 集合的基本用法
- boolean add(E e) 添加元素;
size() 获取元素的个数;
② boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true
③E get(int index) 返回此列表中指定位置上的元素。
④E remove(int index) 移除此列表中指定位置上的元素
boolean remove(Object o) 移除此列表中首次出现的指定元素
E set(int index, E element)
③变量集合
- for循环
- 增强for循环
- 迭代器遍历
- 得到迭代器
ArrayList list = new ArrayList();
Iterator iterator = list.iterator();
- 迭代器遍历数据:迭代器相当于得到了集合的一个副本
- 迭代器中提供的方法
- next() 返回迭代的下一个元素。
- remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)
- 双向迭代
ListIterator迭代
- ListIterator lit = ages.listIterator();
- ListIterator 中的方法
- hasNext(),next()方法
- hasPrevious()是否有上一个元素,返回boolean类型
- previous()获取一个元素
- LinkedList--双向迭代器
- LinkedList() 构造一个空列表;
- LinkedList(Collection e) 构造一个包含指定collection中的元素的列表;
- addFirst(E e) 将指定元素插入此列表的开头
element() 获取但不移除此列表的头(第一个元素)。
peek() 获取但不移除此列表的头(第一个元素)。
- element方法与 peek 方法唯一的不同在于:如果此双端队列为空,它将抛出一个异常。
- peek方法 :如果此双端队列为空,则返回 null;
poll() 获取并移除此列表的头(第一个元素)。
pop() 从此列表弹出第一个元素。
- poll(): 如果此列表为空,则返回 null
- pop(): 如果此列表为空 抛出NoSuchElementException
集合框架--set
2.不重复元素的容器
2.1 如何自定义不能存放重复元素的容器
- 现在需要我们自己设计一个容器类,不能够添加重复元素(如果元素重复了就添加不进去)
- 在前面我们设计的基于数组的自定义容器类的基础上改版
- 需要在add方法内部判断重复
- 如何判断:
每一次调用add会传入一个参数: 用户希望添加的元素 ele
遍历内部的数组,判断数组中是否包含ele
- HashSet
3.1 语法特点:不重复,无序(不保证和添加顺序一致)
3.2.判断重复的方式
① 通过添加进去的元素的hashCode+eqauls 两者进行比较
② 如果两个对象的hashCode相等 并且 两个对象调用equals结果是true 才认为两个元素重复
- 应该怎么做: 在Student中覆写hashCode 和equals方法
2.覆写的时候应该参考实际业务中的比较规则,例如姓名,年龄等(还得看Student类中有哪些字段,并且这些字段是业务人员判断的标准)
自动生成:
- TreeSet
4.1 语法特点
无序:不保证(不记录)我们的添加顺序;但是可以保证添加里面元素是有序的。
4.2自然排序与定制排序(比较器)
- 自然排序
- 从TreeSet的API文档中点击 “自然排序” ---》 Comparable接口中
理解:
如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序
可以自定义排序的逻辑
2.定制排序(比较器)Comparator
- 上面的示例设计有点问题:Student类中覆写的compareTo方法按照年龄从小到大排列的,万一有的人也是用我们的Student,希望年龄从大到小进行排列,怎么办?
不管Student里面使用何种规则都不能满足所有的人
- 解决办法: 可以给TreeSet单独的提供一个比较器(理解为比较的一个工具)
- Comparator 是一个比较器的接口(标准),必须得有进行比较的方法 :compare(Object o1,Object o2);
自定义一个类实现Comparator接口,其中写比较规则 ---》 比较器的模板
4.3判断重复的标准
- 如果采用的是自然排序调用对象的compareTo方法,如果返回0 表示相等;
如果使用的定制排序(比较器),调用比较器的方法compare 返回0 表示相等;
- Collection体系
6.1 重点
- HashSet和TreeSet的基本使用
- 理解TreeSet和HashSet判断重复的实际开发场景以及标准
- Set体系结构
Collection(集合)
|---List(有序(添加顺序和存放顺序一致)可重复)
|---Set(无序不可重复)
|------HashSet hashCode&equals
|------TreeSet(添加进去内容可以进行排序) 无序是指添加顺序和存放顺序,有序只是指里面内容是排序的。 自然排序,定制排序
Map集合和泛型
- Map
- 什么是map?
存放对应关系的一种数据结构,简单理解成是映射
- Map :将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
- 现在需要创建一个Map对象,装里面的数据,但是发现Map是接口,应该怎么创建对象?
- 使用实现类 HashMap 创建对象;
② put方法
put(K key, V value) 在此映射中关联指定值与指定键。 |
put方法特点:
- 如果key不存在,直接添加进去
- 如果key相同,value值使用最新的值替换key对应的老值.
put方法会返回 对应key对应的老值
③ 其余方法
boolean containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
get(Object key) 返回指定键所映射的值。(通过键得到值)
remove(Object key) 从此映射中移除指定键的映射关系(通过key ,找到value,然后把一对键和值都删掉)
- map的特点
Map特点:
一个Map对象中不能有重复的键。
使用key作为判断重复的标准.只拿key 和已经存在的一对一对key进行比较;就少拿了一个value而已;这个原理和HashSet,TreeSet一样。设计Map的时候,并没有说具体按照什么进行判断重复,而是通过实现类进行判断;
Map 里面的方法: |
entrySet() 返回Set,(返回当前Map中所有的entry对象,使用Set存储起来。)
keySet() 返回Map当中所有的key,存储到一个Set集合当中。
values() 返回所有的values,存储到一个Collection。
get(Object key) 返回Collection,通过key查找对应的值。
③Map两种遍历方式
方式一:----------------------------------------------------->
①先得到所有key,怎么得到?
通过keySet方法取到;
②然后遍历keySet,依次通过key来查找value。
通过Object get(Object key)方法;
方式二:----------------------------------------------------->
①先得到所有的Entry对象,Entry对象就包装了key,values,
②遍历Entry对象的集合,然后依次从Entry对象中调用方法:
getKey(),getValue()