java中集合部分的笔记
集合类框架概要
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中集合部分的笔记的更多相关文章
- Java中集合List,Map和Set的区别
Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...
- java中集合Collection转list对象
参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...
- JAVA中集合转数组遍历
JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) { ...
- Java中集合List,Map和Set的差别
Java中集合List,Map和Set的差别 1.List和Set的父接口是Collection.而Map不是 2.List中的元素是有序的,能够反复的 3.Map是Key-Value映射关系,且Ke ...
- Java中集合的概述
一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数 ...
- 【Java】集合_学习笔记
一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...
- Scala中集合类型与java中集合类型转换
对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...
- Java中集合关键字的区别
1. ArrayList.Vector和Stack有什么区别? 1.ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) 2.Stack继承了Vec ...
- Java中集合概念
集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行储存,而想要储存多个对象,就不能是一个基本的变量,而应该是一个 ...
随机推荐
- npm创建react项目
1:win+R 输入cmd ,打开cmd面板 2:安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 3:安装r ...
- 浅谈js冒泡事件1
什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这 ...
- 040同步条件event
条件同步和条件变量同步差不多意思,只是少了锁功能,因为条件同步设计于不访问共享资源的条件环境,event=threading.Event():条件环境对象,初始值为False.event.isSet( ...
- 简单封装的ajax请求
简单封装了一个ajax请求,做一下统一处理,少写重复代码,只是一个初步的代码,没有经过优化. $.extend({ myAjax: function (option, rollBack) { var ...
- codeforces793 B. Igor and his way to work (dfs)
题目链接:codeforces793 B. Igor and his way to work (dfs) 求从起点到终点转方向不超过两次是否有解,,好水啊,感觉自己代码好搓.. #include< ...
- mongodb在windows平台安装和启动
mongodb 官网:https://www.mongodb.com mongodb 官网下载: mongodb-win32-x86_64-2008plus-ssl-3.4.2-signed.msi ...
- pycharm 设置字体大写和显示代码行号
打开pycharm,我们看到左边是没有行号显示的. 在工具栏中点击扳手的标志,打开. 找到 Ide-setting ——>Editor ——>Apperance ——> ...
- ASP.NET Web API编程——客户端调用
可以使用HttpClient这个调用Web API,下面是HttpClient的定义,列举了一些常用的方法,其中还有一些没有列举,包括重载的方法. public class HttpClient : ...
- 制作二维码java
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 前端面试题(copy)
前端开发面试知识点大纲: HTML&CSS: 对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应. Jav ...