集合框架
什么是集合
java集合框架相关接口
java.until.Collection接口:
Collection下面有两个常见的子接口:
集合方法
集合的遍历
Collection提供了统一的遍历集合方式:迭代器模式
Iterator iterator()
java.util.Iterator接口
迭代器接口,定义了迭代器遍历集合的相关操作.
不同的集合都实现了一个用于遍历自身元素的迭代器实现类,我们无需记住它们的名字,用多态的角度把他们看做为Iterator即可.
迭代器遍历集合遵循的步骤为:问,取,删.其中删除元素不是必要操作
迭代器的使用:
迭代器要求在遍历过程中不得通过集合的方法增删元素,否则会抛出异常: ConcurrentModificationException,
迭代器的remove方法可以将通过next方法获取的元素从集合中删除,
it.remove();
增强型for循环
泛型
List集
List集合常见的方法 :
注: 对子集元素的操作就是对原集合对应元素的操作
集合与数组的转换
集合转换为数组
数组转换为list集合
集合的排序
排序自定义类型元素
实际开发中,我们并不会让我们自己定义的类(如果该类作为集合元素使用)去实现Comparable接口,因为这对我们的程序有侵入性.
侵入性:当我们调用某个API功能时,其要求我们为其修改其他额外的代码,这个现象就是侵入性.侵入性越强的API越不利于程序的后期可维护性.应当尽量避免
重载的Collections.sort(List list,Comparator c)方法
//匿名内部类的形式创建一个比较器
Comparator<Point> com = new Comparator<Point>() {
@Override
/**
* 实现比较器接口后必须重写方法compare.
* 该方法用来定义参数o1与参数o2的比较大小规则
* 返回值用来表示o1与o2的大小关系
*/
public int compare(Point o1, Point o2) {
int len1 = o1.getX() * o1.getX() + o1.getY() * o1.getY();
int len2 = o2.getX() * o2.getX() + o2.getY() * o2.getY();
return len1-len2;
}
};
Collections.sort(list,com);//回调模式
System.out.println(list);
最终没有侵入性的写法
Collections.sort(list,(o1,o2)->
o1.getX() * o1.getX() + o1.getY() * o1.getY() -
o2.getX() * o2.getX() - o2.getY() * o2.getY()
);
System.out.println(list);
排序字符串
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortListDemo3 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("传奇");
list.add("小泽老师");
list.add("苍老师");
System.out.println(list);
//按照字符多少排序
Collections.sort(list,(o1,o2)->o2.length()-o1.length());
System.out.println(list);
}
}
Map
Map常见方法
Map的遍历
public class MapDemo2 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("语文",99);
map.put("数学",98);
map.put("英语",97);
map.put("物理",96);
map.put("化学",99);
System.out.println(map);
/*
Set keySet()
将当前Map中所有的key以一个Set集合形式返回,遍历该集合等同于遍历所有的key
*/
Set<String> keySet = map.keySet();
for(String key : keySet){
System.out.println("key:"+key);
}
/*
Set entrySet()
将当前Map中每一组键值对以一个Entry实例形式表示,并存入Set集合后返回
java.util.Map.Entry的每一个实例用于表示Map中的一组键值对,其中方法:
K getKey():获取对应的key
V getValue():获取对应的value
*/
Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
for(Map.Entry<String,Integer> e : entrySet){
String key = e.getKey();
Integer value = e.getValue();
System.out.println(key+":"+value);
}
/*
Collection values()
将当前Map中所有的value以一个集合形式返回
*/
Collection<Integer> values = map.values();
for(Integer value : values){
System.out.println("value:"+value);
}
}
}
集合和Map都提供了支持使用lambda表达式遍历的操作
public class ForeachDemo {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
c.add("five");
System.out.println(c);
for(String s : c){
System.out.println(s);
}
c.forEach(s->System.out.println(s));
// c.forEach(System.out::println);
Map<String,Integer> map = new HashMap<>();
map.put("语文",99);
map.put("数学",98);
map.put("英语",97);
map.put("物理",96);
map.put("化学",99);
System.out.println(map);
// map.forEach((k,v)-> System.out.println(k+":"+v));
//1完整代码
// BiConsumer<String,Integer> action = new BiConsumer<String, Integer>() {
// public void accept(String k, Integer v) {
// System.out.println(k+":"+v);
// }
// };
// Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
// for(Map.Entry<String,Integer> e : entrySet) {
// String k = e.getKey();
// Integer v = e.getValue();
// action.accept(k,v);
// }
//2Map的forEache方法的回调写法
// BiConsumer<String,Integer> action = new BiConsumer<String, Integer>() {
// public void accept(String k, Integer v) {
// System.out.println(k+":"+v);
// }
// };
// map.forEach(action);//这个等效上面41-46行(可参考forEach源代码)
//3使用lambda表达式形式创建
// BiConsumer<String,Integer> action =(k,v)->System.out.println(k+":"+v);
// map.forEach(action);
//4最终写法
map.forEach((k,v)->System.out.println(k+":"+v));
}
}