集合
集合本身是个对象(集合类的具体对象),作用是方便对多个对象进行操作
集合和数组的区别
只能存放对象 //不能是基本数据类型,但可以是包装类
存放的元素可以是多种类型 //默认是Object,如果放入泛型,只能放泛型指定的对象作为元素
长度是可变的 //可以增删,集合中元素被删除后, 后面的元素会向前进1
Collection
接口特点
元素是object类型(基本数据类型不能放入,需要改成包装类)
基本操作
add remove clear contains(比较的是equals) size isEmpty
两个集合间的基本操作
addAll removeAll containsALL retainAll 取交集
遍历
toArray方法(集合转数组) iterator方法(迭代器) foreach方法
由于collection是单列集合的根接口,其子类都可以这样进行遍历
List
接口特点
可重复,有序
//可以使用索引查询元素 可以用于遍历 list.get(index) list.set(index,object)
基本操作
add(index,object) //挤进去 同时也有add(object)
remove (index) //同时也有remove(object),删除元素后,后面元素向前进1
get(index) //用于遍历集合 set(index,object) //修改元素
ListIterator 迭代器
遍历、去重、排序
list.get(index) ListIterator + collection的三种
去重使用set集合,依据hashcode和equals
排序使用集合工具类的sort方法
实现类
Arrayslist 底层是数组 增删慢,查找快
LinkedList 底层是链表 增删块,查询慢
list遍历和去重的例题
1.获取Person集合中年龄大于20的对象的集合;
- 对list中的元素去重;两种方法,后面还有用set去重的方法,是最简单的,这两种只做了解
set
接口特点
无序,不可重复 // 必须提前重写hashcode和equals
遍历、去重、排序
collection的三种
自带去重,必须提前重写hashcode和equals
排序先转为list,使用集合工具类的sort方法
实现类
HashSet 底层是哈希,不能保证存入和取出的顺序
linkedHashset 底层是哈希+链表 可以保证存入和取出的顺序
Set去重的例题
-
定义10个1-20之间的随机数:使用linkedhashset编写一个程序,获取10个1-20之间的随机数,要求随机数不能重复;
//当时用数组做是多么的麻烦(双色球那道题),去重 选用set就很简单,然后再转回数组
-
利用set对list进行去重:给定一个Person的list集合,添加几个元素,对其去重
//相比于上面提到的方法,这个方法不需要进行循环
Map
接口特点
key和value作为一个entry成对存在;
key不能重复(必须提前重写hashcode和equals) ,可以为null
key一般较简单为了查value
基本操作
put(k,v) remove(k) clear() containskey(k) containsvalue(v) size()
map.get(key) 得到values map.values() 返回value的集合
遍历、去重
keyset entryset values
自带去重,只对key去重,必须提前修改key的hashcode和equals
排序 如何对values进行排序呢 entry成set,用sort排序
实现类
HashMap 本质是数组 其元素为链表 不能保证存入和取出的顺序
LinkedHashMap 可以保证存入和取出的顺序 ???
集合和数组的相互转化
集合转数组
Object[] ob = list.toArray(); //返回object类型的数组,需要向下转型
数组转集合
list<> list= new Arraylist<>(Arrays.aslist()); //不能增加元素
list和set相互转化
对list去重,
对set使用集合工具类进行操作;
如果相对list进行去重排序,可以转为treeset
数组工具类Arrays
Arrays.toString Arrays.sort 升序 Arrays.aslist() 创建数组
Arrays.binarysearch(arr,value) 必须先排序为升序,查找value对应的index,
集合工具类Collections
只对list进行操作
sort(list) max(list/set) reverse(list) shuffle(list) 乱序
binarysearch(list,value) //必须先排序为升序,查找value对应的index
比较器
comparable
内部比较器,使用Collections.sort(list)排序 ,元素所在类实现此接口并重写compareTo方法
comparator
外部比较器,重写compare方法
TreeSet/TreeMap
必须传入比较器,key不能为null
自带去重和排序且均按照比较器规则进行(不是equals),最好设置多个条件
集合排序例题
- 建立Person的list集合,先按照年龄升序;再按照name降序 (implements Comparable)
- 创建一个学生类,包含姓名 语文成绩 数学成绩 英语成绩 键盘录入三个学生对象,按照总分降序排序,总分相同 按照语文成绩降序排序,语文相同按照数学成绩降序排序,数学相同按照姓名升序排序
- 对TreeMap和TreeSet进行去重排序(TreeSet其实和TreeMap差不多)
泛型
如果不加泛型,集合可以装Object(任何对象),混装;在遍历集合时,取出的都是object类型,无法直接调用对象的方法,需要向下转型;
主要用于限制集合中的元素类型,使集合中元素类型一致;
foreach
方便对集合或数组进行遍历; 其底层还是迭代器,只要实现了iterable接口就可以使用foreach
for(数据类型 变量i: 集合/数组)
需要注意,此时 变量i 就是集合或数组中的一个元素(对象),无法得到索引值;
可变参数
在参数列表上 (参数类型**…** a) 只能存在1个 放在最后 其本质是数组
集合的重点总结
1. 根据集合的特点,选取特定的集合进行分析
list 有序可重复 可用set去重 可以用集合工具类操作(排序,查找,反转 最值)
set 无序不可重复 常用于去重 可转为list使用集合工具类
map 储存键值对 key不能重复
Treemap 去重自动排序 根据比较器进行去重和排序(最好设置多个条件) key不能为null
2. 集合的遍历 去重 排序
遍历: 集合无法像数组那样用索引取值(list除外),因此如何遍历很重要
collection 3种 list 5种 set 3种 map 3种(可扩展)
去重: hashcode&equals (contains 方法 本质也是调用equals)
排序: list和set均可以用集合工具类sort进行排序;
TreeSet和TreeMap依据比较器进行去重和排序
3. 集合的快速遍历
lambda表达式
list.foreach(s->system.out.println(s))