集合类框架概要
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. 合并两个数组 以KEY 作为键

    <?php     $a= array(         array(             'ID'=> 2         ) );   $b= array(         arr ...

  2. 文本处理三剑客之 grep

    grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...

  3. tree结构统一修改属性名(递归)

    1 //data为需要修改的tree,这里主要是为antd design 里面select规范数据 const ass = (data) => { let item = []; data.map ...

  4. Ubuntu Tweak (linux下的优化大师)

    Ubuntu Tweak 是中国人开发的一款专门为Ubuntu准备的配置.调整工具,它类似与compiz,但是界面更友好. 下面是安装命令: 第一步:添加tweak源 sudo add-apt-rep ...

  5. hdu-5475 An easy problem---线段树+取模

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5475 题目大意: 给X赋初值1,然后给Q个操作,每个操作对应一个整数M: 如果操作是1则将X乘以对应 ...

  6. dba_tables、all_tables、user_tables

    本文摘抄自:http://blog.csdn.net/daxiang12092205/article/details/42921063 dba_tables : 系统里所有的表的信息,需要DBA权限才 ...

  7. MVVM的本质:视图逻辑处理、视图管理、视数中间层

    MVVM的核心是将原来Controller中的视图逻辑.视图管理.视数中间层的功能剥离出来,形成单独的模块: 大部分功能与视图相关.少部分与数据相关: 视图逻辑和业务逻辑不通: 解决的问题:UIVie ...

  8. springmvc进阶(5):mvc:default-servlet-handler详解

    我们在配置dispatchServlet时配置<url-pattern>/</url-pattern>拦截所有请求,这时候dispatchServlet完全取代了default ...

  9. PL\SQL设置中文

    打开PL\SQL 1.菜单->Tools ->preferences->User Interface -> Appearance -> Language 选择 Chine ...

  10. Truncated class file 问题的解决

    替换class 文件之后出现了 Truncated class file  问题,查找原因,可能是文件损坏,清理缓存可以解决 解决办法: 把tomcat的work目录直接删掉,让他重新启动.rm -r ...