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);

猜你喜欢

转载自www.cnblogs.com/leaveMeAlone/p/9105238.html