Java常用类 JavaSE

2021-05-14 约 2560 字 阅读时长6 分钟

Java常用类

BigDecimal

常用构造函数

  1. BigDecimal(int)

    创建一个具有参数所指定整数值的对象

  2. BigDecimal(double)

    创建一个具有参数所指定双精度值的对象

  3. BigDecimal(long)

    创建一个具有参数所指定长整数值的对象

  4. 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+11

DecimalFormat

符号位置本地化?含义
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.32

Logger

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}
使用滚轮缩放
按住拖动