1、Set
Set集合:没有顺序的,没有索引的,数据不能重复的一个集合。常用子类HashSet
利用哈希值判断数据是否在集合中存在
构造方法
HashSet() 创建一个底层用HashMap实现的容量为16 的加载因子为0.75的空集合
常用方法:
add(Object o) 向集合中添加数据
clear()清空集合
remove(Object o) 根据一个对象移除数据
iterator() 来之于Iterable接口的方法用于返回迭代器对象 遍历Set集合的唯一方法
注意:
1.HashSet集合在添加数据是保存的位置是计算后自定选决定的
2.HashSet后台使用了HashMap进行数据存放 采用的是顺序加链式的存放方式
3.数据随机存放可能会出现重叠那么将采用链式存记录重叠的元素 此时通过 Set集合的容量*加载因子决定何时开始扩容默认为16*0.75=12 当数据超12个时重复率较高开始扩容
4.HashSet集合默认情况是根据对象的内存地址进行判断数据是否重复
控制HashSet中的数据不能重复 注意:对象地址不同但不能代表对象所表示的数据是不同的
例如new 了n次的对象但 身份证这样的数据相同那么我们就认为是同一个人
注意:
1.根据Set集合存放数据的行为如果需要控制更精确数据唯一性那么需要重写hashCode和equals
2.一定要根据真实可唯一性属性做为判断条件例如身份证
Iterator 接口迭代器接口,用于遍历集合和数组的
常用方法
boolean hashNext() 判断下一个元素是否存在
Object next() 指针向下移动并返回下一个元素
remove() 移除数据 并同时更新集合
注意:
1.是那个Iterator与使用forEach是等效的但区别在于使用forEach不能在循环中移除集合中的数据如果需要在循环中移除集合数据 需要使用Iterator方法迭代并通过 Iterator的对象进行移除
TreeSet
与HashSet的判断为的衡量标准不同 HashSet先根据hashCode方法如果相同然后根据equals方法判断
TreeSet是根据对象的字典顺序进行判断的 因此TreeSet是可以排序的但依然是无序集合
注意:
1.如果需要将数据添加到TreeSet中那么这个数据对象需要实现Comparable接口并重写唯一方法提供一个排序的标准
2.compareTo方法返回1表示升序 返回-1表示降序 返回0表示重复 重复的数据不会添加到集合中
3.可以使用对象中的多个属性记性排序 但是必要拥有一个唯一标识的属性参与排序 例如身份证
解决方案
单独定义n个排序类并实现Comparator 重写接口中的compara(Object o1,Object o2)提供排序规则并通过TreeSet的TreeSet(Comparator comparator) 的构造方法创建TreeSet对象
注意:
1.排序时必须先使用唯一标识的属性作为衡量标准进行判断是否相等然后在用其他属性排序
2.排序是谁在前面就先按照那个属性进行排序
2、Map
Map集合是用键值对存放数据的一个集合键是不允许重复的值是可以重复的Set集合如果数据重复那么第二个数据不会给更新到集合中而Map集合如果键重复会将第二的数据覆盖到以存在的键值中
Map集合控制键不重复的原理与Set集合的原理相同
HashMap构造方法
HashMap() 创建一个容量为16的加载因子为0.75的空的Map集合
常用方法
containsKey(Object key) 查找键是否存在 存在返回true
containsValue(Object value) 查找值是否存在 存在返回true
entrySet() 返回Map中所有的值并封装到一个Set集合中
get(Object key) 根据键获取对应的值 返回一个对象 如果键不存在则返回null
keySet() 返回所有的键 并封装到Set集合中 通常用于遍历Map集合
put(Object key, Object value) 将数据value 添加到Map集合中 键为key
注意:通常情况key的数据类型为String
remove(Object key) 根据键移除指定的数据
values() 获取Map集合中所有的值并封装到 Collection 中(可以表示List 和Set) 通常用于遍历Map中所有的数据内容
注意:
通过keySet和value 都可迭代集合但是在迭代过中如果使用迭代器那么不能通过被迭代的对象或map集合直接删除 必须使用迭代器对象进行remove
TreeMap
与HashMap的操作相同 但是控制唯一性的标准不同TreeMap是可以排序的一个Map集合
HashMap和HashTable 和TreeMap的比较
HashMap 线程不安全的 key是没有顺序的 速度快 键和值允许为null
Hashtable 线程安全的 key是没有顺序的 速度慢 键和值不允许为null
TreeMap 与HashMap的区别在于TreeMap的键可以自动排序 控制键唯一的方式不同
集合的使用场景
1.用于存放多个数据对象例如 需要定义一个用于表示多个学生的对象 可以选用数组或集合 推荐使用集合,通常情况这个集合来自与其他的方法或者是后期的数据库
2.在需要经常遍历的时候通常选择Collection 接口的集合如果不要求保持数据的唯一那么选择list 否则选择set 如果需要对集合中的数据进行精确的操作 通常选择list
如果不需要遍历还要包装唯一性那么选择Map集合 如果要通过个不确定值访问集合时选择Map集合 例如 允许用户输入一个值访问集合那么这个值及可以是索引 也可是key的话
那么建议使用Map集合让用户输入key Map接口获取数据的精度比Collection 要高
工具类
Arrays 数组工具类
提供了数组的拷贝 查找 排序 输出的功能
Collections 集合工具类
包括 拷贝 排序查找 线程同步等方法
List包括linkedList、vector、ArrayList,是一个允许数据重复,有索引,有顺序的集合接口。
linkedList 采用对象进行数据存储,采用的数据结构是双向链表结构。
ArrayList采用数组进行数据存储,采用的数据结构是顺序结构。
线程不安全,但是速度快。
Set是一个没有顺序,没有索引的数据内饰一个不能重复的HashSet、TreeSet
HashSet是使用哈希表进行控制数据补充的Set集合,适合内部不可排序
TreeSet内部可以进行排序的需要,通过Comparable和Comparator提供的方法进行字典的比较判断排序的先后以及重复数据的过滤。
Map:Map集合顶级父接口,使用键值对的形式进行数据存储的,键值不能重复,value值可以重复。包括:HashMap、HashTable、TreeMap
HashMap:使用哈希值保持键值的唯一性,是线程不安全的但是速度快允许null作为键和值
HashTable:使用哈希值保持键值的唯一性,是线程安全的但是速度慢,不允许null作为键和值
TreeMap:与TreeSet相似都是使用字典顺序控制键的唯一
顺序结构的特点:
1、内存地址是连续的不间断的;2、遍历速度快;3、插入速度慢移出速度慢;4、不可扩容
实现顺序结构扩容需将原有的数据拷贝一个更大的连续存储空间中并固定大小
链式结构特点
1、存储空间不连续;2、插入速度快删除速度快;3、遍历速度慢;4、可以任意扩容;5、比较消耗内存空间
如果需要将数据插入到链式结构中只需要修改相邻的两个元素后置节点和前置节点即可完成插入因此插入速度快,数据越多优势越明显
但是遍历速度慢,因为每个元素之间是不相邻的需要跳转地址才能访问
相对同等数量的数据存放的空间比例顺序结构至少多3倍
但是存储数据的个数可能要比顺序结构要多
对数据的存空间要求相对较低

浙公网安备 33010602011771号