java8--集合(疯狂java讲义3复习笔记)
1、集合分四类:set,map,list,queue
位于java.util包下.
集合类和数组的区别,数组可以保存基本类型的值或者是对象的引用,而集合里只能保存对象的引用.
集合类主要由两个接口派生而出:Collection和Map
collection集合里面一共10个可用的类.

其中,
set里面4个: EnumSet, TreeSet, HashSet, LinkedHashSet
Queue里面2个: ArrayDeque, PriorityQueue,
List里面3个: ArrayList, Vector, Stack
同时实现Queue和List的一个: LinkedList
常用的有5个.
Map中实现类一共9个,常用的是HashMap, TreeMap

collection中方法,也就是Set, Queue, List共同的方法.
所有的collection的实现类都从写了toString()方法,该方法可一次性输出集合中所有元素.
包括:
求并集(添加元素或集合):
求补集(删除某元素或集合):
求交集:
是否包含某元素或集合:
是否为空:
遍历集合:
books.forEach(obj -> System.out.println("迭代集合元素:"+obj));
或者如下:
Iterator<String> it = books.iterator();
//这种形式遍历可以用it.remove()来删除元素,其他的方式都不可以,会引发异常.
while(it.hasNext()){
System.out.println(it.next());
}
或者如下:
for(String book : books){
System.out.println(book);
}
清空集合:
元素个数:
转成数组:
2、用java8增强的Iterator遍历集合元素
Iterator接口里定义了4个方法:
boolean hasNext(): 如果被迭代的集合元素还没有被遍历完,则返回true
Object next(): 返回集合里的下一个元素
void remove(): 删除集合里上一次next方法返回的元素
void forEachRemaining(Consumer action),这是java8为Iterator新增的默认方法,可使用Lambda表达式来遍历集合元素.
Iterator<String> it = books.iterator();
it.forEachRemaining(obj -> System.out.println("迭代集合元素:"+obj));
8.2.5 使用Java8 新增的predicate操作集合
打印长度小于10的元素:
books.removeIf(ele -> ((String)ele).length() <10);
System.out.println(books);
返回符合条件的元素的个数:
public static void main(String[] args){
System.out.println(callAll(books,ele -> ((String)ele).contains("疯狂")));
}
public static int callAll(Collection<String> books, Predicate<Object> p){
int total = 0;
for(Object obj :books){
if(p.test(obj)){
total ++;
}
}
return total;
}
8.2.6 Java8新增的Stream操作集合
java8新增了Stream,IntStream,LongStream等,其中Stream是一个通用的流接口.还为每个流式Api提供了对应的Builder,例如Stream.Builder,开发者可以通过这些Builder来创建对应的流.
独立使用Stream的步骤如下:
1.使用Stream或XxxStream的builder()类方法创建改Stream对应的Builder.
2.重复调用Builder的add()方法向该流中添加多个元素.
3.调用Builder的build()方法获取对应的Stream.
4.调用Stream的聚集方法.
第4步可以根据需求来调用不同的方法,Stream提供了大量的聚集方法供用户调用,对应大部分聚集方法而言,每个Stream只能执行一次.
public static void main(String[] args) {
IntStream is = IntStream.builder()
.add(20)
.add(13)
.add(-2)
.add(18)
.build();
// System.out.println("最大值:"+ is.max().getAsInt());
// System.out.println("最小值:"+ is.min().getAsInt());
// System.out.println("总和:"+ is.sum());
// System.out.println("总数:"+ is.count());
// System.out.println("平均值:"+ is.average());
// System.out.println("平方均大于20:"+ is.allMatch(ele -> ele*ele > 20));
// System.out.println("某个元素平方大于20:"+ is.anyMatch(ele -> ele*ele > 20));
//将is映射成一个新的Stream,新Stream的每个元素是原Stream元素的2倍+1
IntStream newIs = is.map(ele -> ele * 2 +1);
// //使用方法引用的方式来遍历集合元素
newIs.forEach(System.out::println);
}
因为collection有Stream接口,所以,用Stream方法来重写上面的"返回符合条件的元素的个数"
public static void main(String[] args) {
Collection<String> books = new HashSet<>();
books.add("123241232");
books.add("wdw12ddw");
books.add("es23d");
System.out.println(books.stream()
.filter(ele -> ((String) ele).contains("123")).count());
}
8.3 Set集合
HashSet的特点:
1.不能保证元素的排列顺序
2.不是同步的,如果多线程访问,必须通过代码来保证其同步
3.集合元素之可以是null
比较的规则是,equals()方法和HashCode()方法返回的值都相等,那么set认为是同一个对象.
所以,当把一个对象放到HashSet中时,如果需要重写该对象对应类的equals()方法,那么也要重写其hashCode()方法.
因此,当程序把可变对象添加到HashSet中之后,尽量不要去修改该集合元素中参与计算hashCode(),equals()的实例变量,否则会导致HashSet无法正确操作这些集合元素.
8.3.2 LinkedHashSet类
LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHash集合里的元素时,LinkedHashSet将会元素的添加顺序来访问集合里的元素.
LinkedHashSet需要维护元素的插入顺序,因此新呢过略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为天以链表来维护内部顺序.
LinkedHashSet<String> books = new LinkedHashSet<>();
8.3.3 TreeSet 类
TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态.与HashSet集合相比,TreeSet还提供了如下几个额外的方法.
访问前一个,后一个,第一个,最后一个元素的方法,并提供了三个从TreeSet中截取子TreeSet的方法,以及一个Comparator()来返回该TreeSet的定制的排序方法.默认使用自然排序,即从小的到大的顺序.
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet nums = new TreeSet<>();
nums.add(5);
nums.add(2);
nums.add(6);
nums.add(-4);
System.out.println(nums);
}
如果试图把一个对象添加到TreeSet时,则改对象的类必须实现Comparable接口,否则程序将会抛出ClassCastException异常.不过java一些常用类已经实现了Comparable接口,并提供了比较大小的标准.
另外一点:大部分类在实现compareTo(Object obj)方法时,都需要将被比较对象obj强制类型转换成相同的类型,因为只有相同类的两个实例才会比较大小.所以向TreeSet中添加的应该是同一个类(或者有继承关系)的对象.
为了让程序更加健壮,推荐不要修改放入HashSet和TreeSet集合中元素的关键实例变量.
2.定制排序
两种方法,一个是要比较的类,需要实现Comparator接口,一个是创建TreeSet时使用Lambda表达式.
8.3.4EnumSet类
EnumSet是一个专为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显示或隐式地指定.EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序.
EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑,高效,因此EnumSet对象占用内存很小,而且运行效率也很好,尤其是进行批量操作(如调用containsAll()和retainAll()方法时),如果其参数也是Enumset机会,则该批量操作的执行速度非常快.
EnumSet机会不允许加入null元素.

8.3.5 各Set实现类的性能分析
EnumSet性能最好,但只能保存同一个枚举类
HashSet很快,通常用它.
LinkedSet保持了存入顺序,一般操作比HashSet慢,但遍历时比HashSet快.
TreeSet,只有当需要一个保持排序的Set时,才应该使用TreeSet.
另外,这四个类都是现场不安全的,如果多线程调用,需要用synchronizedSortedSet方法包装起来.
SortedSet<String> s = Collections.synchronizedSortedSet(new TreeSet<>());
8.4 List集合

List判断两个对象相等只要通过equals()方法比较返回true即可.
public static void main(String[] args)
{
List<Object> books = new ArrayList<>();
// 向books集合中添加4个元素
books.add(new String("轻量级Java EE企业应用实战"));
books.add(new String("疯狂Java讲义"));
books.add(new String("疯狂Android讲义"));
books.add(new String("疯狂iOS讲义"));
// 使用目标类型为Comparator的Lambda表达式对List集合排序
books.sort((o1, o2)->((String)o1).length() - ((String)o2).length());
System.out.println(books);
// 使用目标类型为UnaryOperator的Lambda表达式来替换集合中所有元素
// 该Lambda表达式控制使用每个字符串的长度作为新的集合元素
books.replaceAll(ele->((String)ele).length());
System.out.println(books); // 输出[7, 8, 11, 16] }

public static void main(String[] args)
{
String[] books = {
"疯狂Java讲义", "疯狂iOS讲义",
"轻量级Java EE企业应用实战"
};
List<String> bookList = new ArrayList<String>();
for (int i = 0; i < books.length ; i++ )
{
bookList.add(books[i]);
}
ListIterator<String> lit = bookList.listIterator();
while (lit.hasNext())
{
System.out.println(lit.next());
lit.add("-------分隔符-------");
}
System.out.println("=======下面开始反向迭代=======");
while(lit.hasPrevious())
{
System.out.println(lit.previous());
}
}

public static void main(String[] args)
{
List<String> fixedList = Arrays.asList("疯狂Java讲义", "轻量级Java EE企业应用实战");
// 获取fixedList的实现类,将输出Arrays$ArrayList
System.out.println(fixedList.getClass());
// 使用方法引用遍历集合元素
fixedList.forEach(System.out::println);
// 试图增加、删除元素都会引发UnsupportedOperationException异常
fixedList.add("疯狂Android讲义");
fixedList.remove("疯狂Java讲义");
}
8.5 Queue集合
用来模拟队列,先进先出

8.5.1 PriorityQueue实现类
PriorityQueue保存队列元素的顺序并不是安计入队列的顺序,而是安队列元素的大小进行重新排序,因此当调用peek()方法或者poll()方法取出队列中的
元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素.
java8--集合(疯狂java讲义3复习笔记)的更多相关文章
- 《疯狂Java讲义》学习笔记——第2章 理解面向对象
面向对象的三种基本特征:继承,封装,多态 UML(统一建模语言) 2.1 面向对象 2.1.1 结构化程序设计简介 图2.1 结构化软件的逻辑结构示意图 从图2.1可以看出,结构化设计需要采用自顶向 ...
- java8--类加载机制与反射(java疯狂讲义3复习笔记)
本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...
- 【Java】-NO.16.EBook.4.Java.1.008-【疯狂Java讲义第3版 李刚】- 集合/容器
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.008-[疯狂Java讲义第3版 李刚]- 集合 Style:EBook Series:Java Si ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- 《疯狂java讲义》笔记 1-5章
1.编译语言和解释语言理解,摘自李刚老师的<疯狂Java讲义>第三版: 就是说,Java和.net都是编译型有事解释型语言.编译型就是根据不同平台编译成不同的可执行机器码,编译过程中会进行 ...
- 疯狂java讲义 第三版 笔记
java7新加特性: 0B010101 二进制数 int c=0B0111_1111; 数值中使用下划线分隔 switch 支持String类型 字符串常量放在常量池 String s0 ...
- 读《疯狂Java讲义》笔记总结一
最近在读<疯狂Java讲义>,现把其中遇到的一些自己以前没掌握的点儿记录下来. 1.字符串相关 字符串不是基本类型,字符串是一个类,也就是一个引用类型. 字符串转int类型String a ...
- udp协议基础(转自疯狂java讲义)
第17章 网络编程 17.4 基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...
- 《疯狂java讲义》读后感
<疯狂java讲义·第三版>,全书共851页,18章. 目录如下: 第1章 Java语言概述与开发环境 第2章 理解面向对象 第3章 数据类型和运算符 第4章 流程控制与数组 第5章 面向 ...
随机推荐
- c++_等差素数列
标题:等差素数列 2,3,5,7,11,13,....是素数序列.类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列.上边的数列公差为30,长度为6. 2004年 ...
- soc desgin 目前需要做的事情
1.熟练的画时序图 达到一旦有想法可以立即通过时序图表达出来. 2.下面是项目中经常用到的典型设计 2.1串并互相转换 2.2cdc 2.3握手协议 2.4cgc(门控时钟) 2.5AHB2reg文件 ...
- cxLookupCombobox的多字段模糊匹配
查了网上很多资料,懒人输入:通过程序使用过滤对话达到自己的目的: 用到cxFilter单元: cbb_DoctorOrder.Properties.View.DataController.Filter ...
- javaweb 开发所需工具和入门教程文档等
下载网址 1.JDK1.8下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
- 比较spring cloud和dubbo,各自的优缺点是什么
dubbo由于是二进制的传输,占用带宽会更少springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大 dubbo的开发难度较大,原因是dubbo的 ...
- 77. Spring Boot Use Thymeleaf 3【从零开始学Spring Boot】
[原创文章,转载请注明出处] Spring Boot默认选择的Thymeleaf是2.0版本的,那么如果我们就想要使用3.0版本或者说指定版本呢,那么怎么操作呢?在这里要说明下 3.0的配置在spri ...
- 洛谷P3094 [USACO13DEC]假期计划Vacation Planning
题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...
- msp430项目编程20
msp430中项目---超声波测距系统 1.定时器工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- com.sun.xxx.utils不存在问题的解决
com.sun.org.apache.xml.internal.security.utils does not exist问题的解决 在网上找个很多的答案,但我的问题没有解决,睡一晚上后,被我误打误撞 ...
- Java基础教程:tutorialspoint-java
来自turorialspoint的Java基础教程(英文),官网:https://www.tutorialspoint.com/java/index.htm 这个教程在国内已经被翻译成中文(不过是属于 ...