集合类框架概要
Collection<E> boolean removeIf(Predicate<? super E> filter)//删除满足条件的元素,如果Collection发生了变化则返回true
Collections.nCopies(n,o)方法是浅拷贝,且拷贝出来的数组不可修改,不能通过set(index,obj)方法改变元素
Set中元素不会被插入到特定位置,并且不允许重复元素,SortedSet允许按照顺序的迭代。
Queue会记住插入顺序,但是只能在尾端插入元素,在头部进行删除,Deque(双端队列)可以头尾删除或是插入元素
Collections.disjoint(Collection<?> cl,Collection<?> c2)如果两个集合不言有相同元素则返回true
Collections.copy(List<? super T> dest,List<? super T> src)从src复制元素到dest中的相同索引位置上
Collections.frequency(Collection<?> c,Object obj)返回c中与o相等的元素的数量
Collections.rotate(List<?> list,int distance)旋转列表,将i位置元素移动到(i+distance)%list.size()

迭代器
值得注意的是remove方法移除了迭代器返回的最后一个元素,而不是迭代器指向的元素,在中间没有next或是previous时不能连续两次调用remove方法
List<String> friends = new LinkedList<>();
ListIterator<String> iter = friends.listIterator();
iter.add("Fred");// Fred|
iter.add("Wilma"); // Fred wilma|
iter.previous(); // Fred|wilma
iter.set("Barney");// Fred|Barney
若果你使用多个迭代器访问一个数据结构,并且其中一个使数据结构发生改变,那么其他的迭代器可能会失效,如果继续使用的话,一个无效的迭代器可能会抛出ConcurrentModificationexception异常

Set
set可以高效的检测一个值是不是它的元素,但是相应的不会记得添加元素的顺序,即顺序无关键要时可以使用set.
HashSet和TreeSet类都实现了Set接口,一般说HashSet在元素提供了很好的hash函数的时候更为高效,TreeSet则在需要按顺序遍历集合时使用,
Set的元素类型必须实现Comparable接口,或者需要在构造函数中提供Comparator

map存储键与值之间的联系,调用put方法添加新的联系或者改变已存在键所对应的值
Map<String,Integer> counts = new HashMap<>();
counts.put("Alice",1);在map中添加键值对
counts.put("Alice",2);更新键所对应的值
和Set一样,在不需要按照顺序访问则考虑使用HashMap,需要按照顺序则使用TreeMap
int count = counts.getOrDefault("Alice",0);//可以防止当键不存在的时候,返回NullPointerException错误,而是直接返回默认值
当试图更细map里面的计数器的时候,首先要检查计数器是否存在,如果存在的话就加一,不存在赋初值为1;
counts.merge(word,1,Integer::sum);//简化了上述流程为一条指令
通过调用keySet()、entrySet()、values()方法查看视图
Map<String,Integer> counts = new HashMap<>();
counts.put("1",1);
counts.put("2",10);
counts.put("3",100);
Set<String> s = counts.keySet();
s.remove("1");//如果从视图中移除了键或记录,则该记录也将从实际关联的map中移除
for(String s1:s){
System.out.println(s1);
}
for(Map.Entry<String,Integer> entry:counts.entrySet()){//对HashMap中的数据进行处理
System.out.println(entry.getKey()+","+entry.getValue());//通过getKey和getValue方法获取到键和值
}
或者通过forEach((k,v)->{})//处理k、v
值得注意的是一些map实现不允许键或者值为null,例如ConcurrentHashMap。但是当你允许使用null值的map是,如HashMap,一定要小心使用null值,一些map方法将null值解释为不存在的或者应该删除的记录

其他集合
Properties类实现了较容易的使用纯文本格式保存和加载的映射
Properties setting = System.getProperties();//获取运行java虚拟机的一些参数
Path path = Paths.get("setting","setting.properties");//
if(!Files.exists(path)){
try {
Files.createFile(path);
}catch (IOException e){
e.printStackTrace();
}
}
try (OutputStream outputStream = Files.newOutputStream(path)){
setting.store(outputStream,"Program Properties 111");
}catch (IOException e){
e.printStackTrace();
}
位组
BitSet类用来存储一系列比特,位组将比特塞进一个long类型的数组里,所以与值为boolean类型的数组相比,使用位组更有效。位组对表示标志位序列或非负值的集合比较有用,第i个位置为1表示i在集合内。
值得注意的是BitSet类不是一个集合类,他没有实现Collection<Integer>接口
枚举set和枚举map
enum Weekday{MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY}
Set<Weekday> always = EnumSet.allOf(Weekday.class);
Set<Weekday> never = EnumSet.noneOf(Weekday.class);
Set<Weekday> workday = EnumSet.range(Weekday.MONDAY,Weekday.FRIDAY);
Set<Weekday> mwf = EnumSet.of(Weekday.MONDAY,Weekday.WEDNESDAY,Weekday.FRIDAY);
栈、队列、双端队列、优先级队列
尽管在java中有Stack类,但是推荐使用ArrayDeque类
使用栈时,用
ArrayDeque<String> stack = new ArrayDeque<>();
stack.push("sss");
stack.push("ss");
stack.pop();
使用队列则用
ArrayDeque<String> queue = new ArrayDeque<>();
queue.add("sss");
queue.add("ss");
queue.remove();
优先级队列 PriorityQueue
优先级队列在元素以任意顺序插入后,以有序方式检索元素。换句话说,当你调用remove方法时,会得到优先级队列中的当前最小元素
优先级队列可以容纳实现了Comparable接口的元素,或者在该类的构造方法中提供一个Copmparator。区别于TreeSet,优先级队列在添加和删除元素的算法到最最小元素总是在根部,没有浪费时间对所有元素进行排序。

视图
集合视图是一个实现了集合接口的轻量级对象,但是其不存储元素,例如,映射的KeySet和values方法生成了映射的视图。
通常视图并不支持其接口定义的所有操作。例如,在map的keySet上,或者Arrays.asList返回的列表上调用add方法是没有意义的
范围(range)
sublist方法,任何字列表的变化(设置、添加、删除元素)都将会影响原先的列表,对于子列表来说,第一个界限是包含在内的,而第二个不包含在内
空视图和单例视图
Collections.emptyMap();//空视图
Collections.singletonMap("id",id);//单例视图
相比于直接构建一个重量级的HashMap或者TreeMap节约空间
不可修改视图
Collections.unmodifiableList(friends);
在一个不可修改的视图上调用修改器方法时,会抛出异常
检查视图
将错误类型元素偷偷插入到泛型集合中是可能的(详见“堆污染”现象),当这个不适合的元素被检索的时候会被抛出运行错误,可以使用检查视图来调试该问题
List<String> strings = Collections.checkList(new ArrayList<>(),String.class);

java中集合部分的笔记的更多相关文章

  1. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  2. java中集合Collection转list对象

    参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...

  3. JAVA中集合转数组遍历

    JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) {     ...

  4. Java中集合List,Map和Set的差别

    Java中集合List,Map和Set的差别 1.List和Set的父接口是Collection.而Map不是 2.List中的元素是有序的,能够反复的 3.Map是Key-Value映射关系,且Ke ...

  5. Java中集合的概述

    一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数 ...

  6. 【Java】集合_学习笔记

    一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...

  7. Scala中集合类型与java中集合类型转换

    对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...

  8. Java中集合关键字的区别

    1. ArrayList.Vector和Stack有什么区别? 1.ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) ​   2.Stack继承了Vec ...

  9. Java中集合概念

    集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行储存,而想要储存多个对象,就不能是一个基本的变量,而应该是一个 ...

随机推荐

  1. python 匿名函数&装饰器

    匿名函数 关键字lambda表示匿名函数,冒号前面的x表示函数参数匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> list(map(l ...

  2. sql 嵌套查询

    sql 某一字段 数量大于1 SELECT * FROM ecm_goods_spec AWHERE ( SELECT count( * ) FROM ecm_goods_spec BWHERE A. ...

  3. 如何在 MSBuild Target(Exec)中报告编译错误和编译警告

    编译错误和编译警告 MSBuild 的 Exec 自带有错误和警告的标准格式,按照此格式输出,将被识别为编译错误和编译警告. 而格式只是简简单单的 error: 开头或者 warning: 开头.冒号 ...

  4. 使用burpsuite对移动app抓包分析

    测试移动APP的联网请求,需要获取路径或者参数的时候,使用该工具burpsuite非常方便! 要求: 移动终端和PC处于同一个wlan环境下 第一步:获取本地地址,cmd-->ipconfig  ...

  5. PHP5.5的新特性

    看了@轩脉刃 今天出炉的PHP 5.5 新特性.不过没有翻译全,我这里稍微补充下,整理成完整的一篇:) 原文:http://www.php.net/manual/zh/migration55.new- ...

  6. NET平台微服务

    .NET平台微服务项目汇集   最近博客园出现了一篇文章<微服务时代之2017年五军之战:Net PHP谁先死>,掀起了一波撕逼,作者只是从一个使用者的角度来指点江山,这个姿势是不对的.. ...

  7. SQL 关联两个表的视图总结

    视图就是一条select查询语句,是一张虚拟表. table a  , table b  以表a基表(a LEFT  JOIN b) 1.1 当update view时 更新view中表b字段并且表b ...

  8. Ajax实例二:取得新内容

    Ajax实例二:取得新内容 通过点击pre和next按钮,从服务器取得最新内容. HTML代码 <div id="slide">图片显示区</div> &l ...

  9. MVC学习十一:合并资源文件(BundleConfig)

    在BundleConfig.cs文件下 //1.用户可以 手动 添加 js绑定对象,取一个 名字(虚拟路径),添加要绑定的JS文件 路径 bundles.Add(new ScriptBundle(&q ...

  10. java线程安全单例

    public class MySingleton { // 使用volatile关键字保其可见性 volatile private static MySingleton instance = null ...