Java常用类 ¶
BigDecimal ¶
常用构造函数 ¶
BigDecimal(int)
创建一个具有参数所指定整数值的对象
BigDecimal(double)
创建一个具有参数所指定双精度值的对象
BigDecimal(long)
创建一个具有参数所指定长整数值的对象
BigDecimal(String)
创建一个具有参数所指定以字符串表示的数值的对象
推荐使用字符串方式构建,这样不会损失精度值
常用方法 ¶
java
1BigDecimal b1=new BigDecimal("1E11");
2BigDecimal b2=new BigDecimal("648");
3BigDecimal b3 = b1.divide(b2, 6, RoundingMode.HALF_UP);
4
5b1.subtract(b2); //减法 - b1-b2
6
7b1.add(b2); //加法 + b1+b2
8
9// RoundingMode.DOWN 向零取舍 1.5->1 -1.5->-1
10// RoundingMode.UP 向零反向取舍 1.5->2 -1.5->-2
11// RoundingMode.CEILING 向上取舍 1.5->2 -1.5->-1
12// RoundingMode.FLOOR 向下取舍 1.5->1 -1.5->-2
13// RoundingMode.HALF_UP 向最近的进行取舍,相同向零反向取舍 1.5->2 -1.5->-1 -1.4->-1
14// RoundingMode.HALF_DOWN 向最近的进行取舍,相同向零舍入 1.5->1 -1.5->-1 -1.4->-1
15// RoundingMode.ROUND_HALF_EVEN 向最近的进行取舍,相同向偶数位取舍 1.5->2 2.5->2 -1.5->-2 -1.6->-3
16b1.divide(b2,2, RoundingMode.HALF_DOWN); //除法 / b1/b2 保留小数,取舍方式
17
18b1.multiply(b2); //乘法 * b1*b2
19
20b3.setScale(3, RoundingMode.HALF_UP); //设置保留小数,取舍方式
21
22//转换为字符串
23b1.toPlainString(); //返回字符串,非科学技术法
24b1.toEngineeringString(); //返回字符串,100E+9
25b1.toString(); //返回字符串,1E+11DecimalFormat ¶
| 符号 | 位置 | 本地化? | 含义 |
|---|---|---|---|
| 0 | 数字 | 是 | 阿拉伯数字 |
| ## | 数字 | 是 | 阿拉伯数字如果不存在就显示为空 |
| . | 数字 | 是 | 小数分隔符或货币小数分隔符 |
| - | 数字 | 是 | 减号 |
| , | 数字 | 是 | 分组分隔符 |
| E | 数字 | 是 | 分割科学技术法中的尾数和指数。在前缀和后缀中无需添加引号 |
| ; | 子模式边界 | 是 | 分隔正数和负数子模式 |
| % | 前缀或后缀 | 是 | 乘以100并显示为百分数 |
| \u2030 | 前缀或后缀 | 是 | 乘以1000并显示为千分数 |
| ¤ (\u00A4) | 前缀或后缀 | 否 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符 |
| ' | 前缀或后缀 | 否 | 用于在前缀或或后缀中为特殊字符加引号,例如 “’#’#” 将 123 格式化为 “#123”。要创建单引号本身,请连续使用两个单引号:"## o’‘clock" |
java
1BigDecimal b3=new BigDecimal("154.319444");
2new DecimalFormat("0.0\u2030").format(b3); //154319.4‰
3new DecimalFormat("0.0\u00A4").format(b3); //154.3¥
4new DecimalFormat("0.0%").format(b3); //15431.9%
5new DecimalFormat("0.0").format(b3); //154.3
6new DecimalFormat("0.00").format(b3); //154.32Logger ¶
Logger 是jdk自带的日志工具
Logger简单使用 ¶
java
1public static final Logger logger= Logger.getLogger(ForkJoinDemo.class.getName());
2public void someMethod(){
3 logger.info("some msg.....")
4}Logger 简易工具类 ¶
java
1public class LogUtil {
2 private LogUtil() {
3 }
4
5 public static Logger getLogger(String name) {
6 Logger logger = Logger.getLogger(name == null ? Thread.currentThread().getStackTrace()[1].getClassName() : name);
7 ConsoleHandler handler = new ConsoleHandler();
8 try {
9 // 设置handler编码格式
10 handler.setEncoding(StandardCharsets.UTF_8.name());
11 // 设置handler打印格式
12 handler.setFormatter(new Formatter() {
13 @Override
14 public String format(LogRecord record) {
15 ZonedDateTime zdt = ZonedDateTime.ofInstant(record.getInstant(), ZoneId.systemDefault());
16 return String.format("\u001B[32m[%1$s]\u001B[0m\u001B[30m%2$tF %2$tr: %3$s\u001B[0m%n", record.getLevel(), zdt, record.getMessage());
17 }
18 });
19 } catch (UnsupportedEncodingException ignored) {
20 }
21 //禁用根 handler
22 logger.setUseParentHandlers(false);
23 //添加打印控制台的handler
24 logger.addHandler(handler);
25 logger.getHandlers();
26 //设置打印日期的等级
27 logger.setLevel(Level.ALL);
28 return logger;
29 }
30
31 public static void info(String msg) {
32 Logger logger = getLogger(new Throwable().getStackTrace()[1].getClassName());
33 logger.info(msg);
34 }
35
36 public static void warning(String msg) {
37 Logger logger = getLogger(new Throwable().getStackTrace()[1].getClassName());
38 logger.warning(msg);
39 }
40
41 private class Color {
42 public static final String ANSI_RESET = "\u001B[0m";
43 public static final String ANSI_BLACK = "\u001B[30m";
44 public static final String ANSI_RED = "\u001B[31m";
45 public static final String ANSI_GREEN = "\u001B[32m";
46 public static final String ANSI_YELLOW = "\u001B[33m";
47 public static final String ANSI_BLUE = "\u001B[34m";
48 public static final String ANSI_PURPLE = "\u001B[35m";
49 public static final String ANSI_CYAN = "\u001B[36m";
50 public static final String ANSI_WHITE = "\u001B[37m";
51 public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m";
52 public static final String ANSI_RED_BACKGROUND = "\u001B[41m";
53 public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m";
54 public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m";
55 public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m";
56 public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m";
57 public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m";
58 public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m";
59 }
60}ArrayBlockingQueue ¶
ArrayBlockingQueue 是一个具有线程安全性和阻塞性的有界队列
安全性演示 ¶
java
1/**
2 * ArrayBlockingQueue的线程安全是通过底层的ReentrantLock保证的,因此在元素出入队列操作时,无需额外加锁
3 * 下面代码会 1--7 都输出一次,并没有出现重复取出的情况,即保证了多个线程对资源竞争的互斥访问
4 */
5private static void c10Test01() {
6 // 容量,是否为阻塞队列、初始包含的元素集合
7 ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<>(7, true,
8 new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7)));
9 Runnable runnable = () -> {
10 while (true) {
11 try {
12 System.out.println(Thread.currentThread().getName() + "take:" + arrayBlockingQueue.take());
13 } catch (InterruptedException e) {
14 e.printStackTrace();
15 }
16 }
17 };
18 new Thread(runnable, "线程1").start();
19 new Thread(runnable, "线程2").start();
20}阻塞性演示 ¶
java
1/**
2 * 入队阻塞:当队列中的元素个数等于队列长度时,会阻塞向队列中放入元素的操作,当有出队操作取走队列中元素,队列出现空缺位置后,才会再进行入队
3 * 出队阻塞:当队列中的元素为空时,执行出队操作的线程将被阻塞,直到队列不为空时才会再次执行出队操作
4 * 出队的次数设为了队列中元素数量加一,因此这个线程最后会被一直阻塞,程序将一直执行不会结束
5 */
6private static void c10Test02() {
7 ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<>(3);
8 int size = 7;
9 new Thread(() -> {
10 for (int i = 1; i < 7; i++) {
11 try {
12 arrayBlockingQueue.put(i);
13 TimeUnit.SECONDS.sleep(1);
14 } catch (InterruptedException e) {
15 e.printStackTrace();
16 }
17 }
18 }).start();
19 new Thread(() -> {
20 for (int i = 1; i < size+1; i++) {
21 try {
22 System.out.println(arrayBlockingQueue.take());
23 TimeUnit.SECONDS.sleep(3);
24 } catch (InterruptedException e) {
25 e.printStackTrace();
26 }
27 }
28 }).start();
29}相关方法 ¶
插入
- add(e):当队列满时会抛出异常
IllegalStateException: Queue full - offer(e):会返回元素是否插入成功状态,成功返回true,失败返回false
- put(e):队列满时会阻塞插入元素的线程,知道有元素被取出时才会插入
- offer(e,time,unit):有超时机制的offer(e),队列满且超时会返回false
移除
- remove():移除队首元素,成功返回true,队列为空抛出异常 NoSuchElementException
- remove(e):移除指定元素,成功返回true,队列为空返回false
- poll():获取并移除队首元素,队列为空时返回null
- take():阻塞方式获取队列元素,队列为空时阻塞直到队列中有数据
- poll(time,unit):有超时机制的poll(),队列为空且超时返回null
java
1private static void c10Test04() throws InterruptedException {
2 ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<>(1,
3 true, new ArrayList<>(List.of(1)));
4 arrayBlockingQueue.remove();
5// arrayBlockingQueue.remove(); // 移除队首元素,成功返回true,队列为空抛出异常 NoSuchElementException
6// arrayBlockingQueue.remove(2); // 移除指定元素,成功返回true,队列为空返回false
7// arrayBlockingQueue.poll(); // 获取并移除队首元素,队列为空时返回null
8// arrayBlockingQueue.take(); // 阻塞方式获取队列元素,队列为空时阻塞直到队列中有数据
9// arrayBlockingQueue.poll(3,TimeUnit.SECONDS); // 有超时机制的poll(),队列为空且超时返回null
10}
11
12
13private static void c10Test03() throws InterruptedException {
14 ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<>(1);
15 arrayBlockingQueue.add(1);
16// arrayBlockingQueue.add(2); // 队列满时抛出异常 IllegalStateException: Queue full
17// arrayBlockingQueue.offer(2); // 会返回元素是否插入成功状态,成功返回true,失败返回false
18// arrayBlockingQueue.put(2); // 队列满时会阻塞插入元素的线程,知道有元素被取出时才会插入
19// arrayBlockingQueue.offer(2, 3, TimeUnit.SECONDS); // 有超时机制的offer(e),队列满且超时会返回false
20}Optional ¶
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null
Optional实例 ¶
java
1private static void lambda1Test_1(){
2 A a=null;
3
4 // NullPointerException
5 Optional.of(a).orElse(new A("ofOrElse"));
6
7 // 两者区别,orElseGet是调用其他返回对象,orElse是直接返回对象
8 Optional.ofNullable(a).orElse(new A("ofNullableOrElse"));
9 Optional.ofNullable(a).orElseGet(() -> new A("ofNullableorElseGet"));
10
11
12 //为null抛出异常
13 Optional.ofNullable(a).orElseThrow();
14 //为null抛出,自定义异常
15 //Optional.ofNullable(a).orElseThrow(() -> new RuntimeException("值为null"));
16
17 // return value != null
18 Optional.ofNullable(a).isPresent();
19 //return value == null
20 Optional.ofNullable(a).isEmpty();
21
22 //为null 返回传入的 Optional 实例
23 Optional.ofNullable(a).or(() -> Optional.of(new A("or")));
24
25}