集合类框架概要
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. LINUX系统文件类型分类

    使用LINUX过程中,时常会对文件进行操作.但是linux中文件究竟有哪些分类呢?今天让我们大家来总结一下吧! 概述: linux文件可以分为五种类型,分别为:普通文件.目录.字符设备或块设备.套接口 ...

  2. XISE菜刀V13.0 官网版 XISE菜刀VIP破解版 XISE官网

    诠释: 1. 破解VIP登陆限制 2.去后门 (自查) 下载地址 :https://pan.baidu.com/s/1eR2rUOM 查毒地址:http://a.virscan.org/a3983f3 ...

  3. 设计模式:Builder模式

    设计模式:Builder模式 一.前言    今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之 ...

  4. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具

    1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...

  5. June 23rd 2017 Week 25th Friday

    Life doesn't get easier, you just get stronger. 生活从未变得轻松,是你在一点一点变得坚强. So in the same way we can get ...

  6. whoami

    功能说明:显示当前登录的用户名,.

  7. Server Error in '/' Application. 报错

    控制面板--管理工具--服务--asp.netstate service 设置为自动,并启动

  8. luogu P4275 萃香的请柬

    嘟嘟嘟 打表不难发现,序列的长度以及序列中1的个数都是斐波那契数列.因为第 i 秒1的个数由 i - 1的1和 i - 2的0变换而来,那么f[i] = f[i - 1] + f[i - 2].序列的 ...

  9. 关注磁盘的两个指标: IOPS 和传输带宽(吞吐量)

    ㈠ IOPS                磁盘的 IOPS.也就是每秒能进行多少次IO        那么.如何才算一次IO呢?        其实.这是个定义很混乱的问题        因为.系统 ...

  10. R语言学习笔记2——绘图

    R语言提供了非常强大的图形绘制功能.下面来看一个例子: > dose <- c(20, 30, 40, 45, 60)> drugA <- c(16, 20, 27, 40, ...