今日重点:
目录
1、Hashtable和ConcurrentHashMap性能测试
1.函数式接口 2.箭头函数(lambda表达式),不是java特有的。 3.Optional类 4.断言 5.Stream编程
一、JUnit单元测试
1、概念
JUnit是一个Java语言单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
2、JUnit单元测试的好处
(1)可以书写一些列的测试方法,对项目的所有的(数据)接口或者方法进行单元测试。
(2)启动后,自动化的测试,并且判断执行结果,不需要人为的干预。
(3)只需要查看最后的结果,就可以知道整个项目的方法接口是否通畅。
(4)每个单元测试用例相对独立,由JUnit启动,自动调用,不需要添加额外的调用语句。
(5)添加,删除,屏蔽测试方法,不影响其他的测试方法,开源框架都对JUnit有相应的支持。3、jar包
如果要引入第三方的插件,其实引入的都是xxx.jar的文件。首先要把这个文件导入到我们的工程目录下,其次要添加到工程的依赖目录中。
比如要使用@Test注解
如果工程中没有导入jar包,程序是不认识@Test注解的。
4、JUnit单元测试的使用(测试)方法
要求:
(1)不能有返回值
(2)不能有参数列表
(3)必须有Test注解
package com.jsoft.morning; import org.junit.Test; public class Ch01 { @Test public void test01(){ System.out.println("hello junit01"); } @Test public void test02() { System.out.println("hello junit02"); } }
以前一个类中我们只有一个主方法可以运行,现在通过JUnit测试方法,两个方法都可以运行了,再写多个方法也是可以的 。
5、JUnit断言
断言不成功会抛异常(会报错),即使程序正常运行但是结果不正确,也会以失败结束。
JDK1.8新出的功能,用来测试程序功能好不好使的的功能, JUnit断言提供了一些辅助函数,用于帮助开发人员确定某些被测试函数是否工作正常,断言是单元测试最基本的组成部分。JUnit的所有断言都包含在Assert类中,这个类提供了很多有用的断言来编写测试用例,只有失败的断言才会被记录。Assert 类中的一些有用的方法列式如下:
常用方法
① assertEquals:
检查两个变量或等式是否平衡
② assertTrue:检查条件是否为真
③ assertFalse:检查条件是否为假
④ assertNotNull:检查对象是否不为空
⑤ assertNull:检查对象是否为空
6、JUnit注解
(1) Test注解
这个注释说明依附在 JUnit 的 public void 方法可以作为一个测试案例。
(2) Before
有些测试在运行前需要创造几个相似的对象。在 public void 方法加该注释是因为该方法需要在 test 方法前运行。
(3)After
如果你将外部资源在 Before 方法中分配,那么你需要在测试运行后释放他们。在 public void 方法加该注释是因为该方法需要在 test 方法后运行。
package com.jr.morning; import org.junit.After; import org.junit.Before; import org.junit.Test; /* JUnit注解 1.Test 2.Before 3.After */ public class Ch03 { @Test public void test01(){ System.out.println("test01方法执行。。。"); } @Test public void test02(){ System.out.println("test02方法执行。。。"); } @Before public void testBefore(){ System.out.println("testBefore方法执行。。。"); } @After public void testAfter(){ System.out.println("testBefore方法执行。。。"); } }
7、JUnit命名规范
(1)单元测试类的命名
被测试类的类名 + Test
(2)测试方法的命名
test + 被测试方法的方法名
JUnit测试方法参考文章:https://www.jianshu.com/p/a3fa5d208c93
二、集合的面试题
我们尝试开辟50个线程,每个线程向集合中put 100000个元素,测试两个类所需的时间
1、Hashtable和ConcurrentHashMap性能测试
package com.jr.morning; import org.junit.Test; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; /* 集合的好多面试 1. Hashtable和ConcurrentHashMap性能测试 */ public class Ch04 { /* 我们尝试开辟50个线程,每个线程向集合中put100000个元素, 测试两个类所需的时间 */ @Test public void hashtableTest() throws InterruptedException { final Map<Integer, Integer> map = new Hashtable<>(500000); System.out.println("开始测试hashtable-----------------------"); long start = System.currentTimeMillis(); for (int i = 0; i < 50; i++) { final int j = i; new Thread(() -> { for (int k = 0; k < 100000; k++) { map.put(j * k, 1); } }).start(); } long end = System.currentTimeMillis(); System.out.println("hashtable执行了:" + (end - start)); } @Test public void testConcurrentHashMap() throws InterruptedException { final Map<Integer,Integer> map = new ConcurrentHashMap<>(500000); System.out.println("开始测试ConcurrentHashMap-----------------------"); long start = System.currentTimeMillis(); for (int i = 0; i < 50; i++) { final int j = i; new Thread(()->{ for (int k = 0;k < 100000;k++){ map.put(j*k,1); } }).start(); } long end = System.currentTimeMillis(); System.out.println("ConcurrentHashMap执行了:" + (end - start)); // 71ms } }
2、ArrayList和LinkedList性能测试
(1)按顺序添加元素效率
package com.jr.morning; import org.junit.Test; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; /* 集合的好多面试 1. Hashtable和ConcurrentHashMap性能测试 */ public class Ch04 { @Test public void testArrayList() { List<Integer> list = new ArrayList<>(); long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { list.add((int)Math.random()*100); } long end = System.currentTimeMillis(); System.out.println("arraylist用时:" + (end - start)); } @Test public void testLinkedList() { List<Integer> list = new LinkedList<>(); long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { list.add((int)Math.random()*100); } long end = System.currentTimeMillis(); System.out.println("linkedlist用时:" + (end - start)); } }
(2)查询效率
①for循环实现查询
package com.jr.morning; import org.junit.Test; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; /* 集合的好多面试 1. Hashtable和ConcurrentHashMap性能测试 */ public class Ch04 { @Test public void testArrayList() { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { list.add((int)Math.random()*100); } long start = System.currentTimeMillis(); for (int i = 0; i < list.size(); i++) { list.get(i);//千万别打印,电脑可能会崩 } long end = System.currentTimeMillis(); System.out.println("arraylist用时:" + (end - start)); } @Test public void testLinkedList() { List<Integer> list = new LinkedList<>(); for (int i = 0; i < 10000000; i++) { list.add((int)Math.random()*100); } long start = System.currentTimeMillis(); for (int i = 0; i < list.size(); i++) { list.get(i);//千万别打印,电脑可能会崩 } long end = System.currentTimeMillis(); System.out.println("linkedlist用时:" + (end - start)); } }
②用迭代器实现查询
package com.jr.morning; import org.junit.Test; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; /* 集合的好多面试 1. Hashtable和ConcurrentHashMap性能测试 */ public class Ch04 { @Test public void testArrayList() { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { list.add((int)Math.random()*100); } long start = System.currentTimeMillis(); // 用迭代器实现查询 Iterator<Integer>iterator=list.iterator(); while (iterator.hasNext()){ iterator.next(); } long end = System.currentTimeMillis(); System.out.println("arraylist用时:" + (end - start)); } @Test public void testLinkedList() { List<Integer> list = new LinkedList<>(); for (int i = 0; i < 10000000; i++) { list.add((int)Math.random()*100); } long start = System.currentTimeMillis(); // 用迭代器实现查询 Iterator<Integer>iterator=list.iterator(); while (iterator.hasNext()){ iterator.next(); } long end = System.currentTime