Java学习路线-22:开发支持类库UUID、Optional、ThreadLocal、TimerTask、Base64

简介: Java学习路线-22:开发支持类库UUID、Optional、ThreadLocal、TimerTask、Base64

12 章 : 开发支持类库

47 UUID类

UUID 根据时间戳实现自动无重复字符串定义

// 获取UUID
public static UUID randomUUID()
// 根据字符串获取UUID
public static UUID fromString(String name)

应用:对文件进行自动命名处理

import java.util.UUID;
class Demo {
    public static void main(String[] args) {
        System.out.println(UUID.randomUUID());
        // 85a8ccb1-88f8-4b3c-833d-d45b58e0204e
        System.out.println(UUID.fromString("85a8ccb1-88f8-4b3c-833d-d45b58e0204e"));
        // 85a8ccb1-88f8-4b3c-833d-d45b58e0204e
    }
}

48 Optional类

Optional 主要功能是进行null空指针处理

JDK >= 1.8

示例:单独处理null参数

class Message{
    private String message;
    public Message(String message) {
        this.message = message;
    }
    public String getMessage(){
        return this.message;
    }
}
class Demo {
    public static void showMessage(Message message) {
        if(message != null){
            System.out.println(message.getMessage());
        }
    }
    public static void main(String[] args) {
        Message message = new Message("这是消息");
        showMessage(message);
        showMessage(null);
    }
}

几个方法

public final class Optional<T> {
     public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
     public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
    public T orElse(T other) {
        return value != null ? value : other;
    }
}

使用示例

import java.util.Optional;
/**
 * 存入
*/
Optional<String> optOf = Optional.of("message");
// Optional<String> optOfNull = Optional.of(null);
// java.lang.NullPointerException
Optional<String> optOfNullable = Optional.ofNullable("message");
Optional<String> optOfNullableNull = Optional.ofNullable(null);
/**
 * 取出
*/
System.out.println(optOf.get());
// message
System.out.println(optOfNullable.get());
// message
// System.out.println(optOfNullableNull.get());
// java.util.NoSuchElementException: No value present
System.out.println(optOf.orElse("default"));
// message
System.out.println(optOfNullable.orElse("default"));
// message
System.out.println(optOfNullableNull.orElse("default"));
// default

自定义函数实现

class Demo {
    public static String getDefault(String object, String defaultValue){
        return object != null ? object : defaultValue;
    }
    public static void main(String[] args) {
        System.out.println(getDefault("message", "default"));
        // message
        System.out.println(getDefault(null, "default"));
        // default
    }
}

49 ThreadLocal类

ThreadLocal解决线程同步问题

public T get() 
public void set(T value)
public void remove()

定义发送消息类

class Message{
    private  String message ;
    public Message(String message) {
        this.message = message;
    }
    public String getMessage(){
        return this.message;
    }
}
class Channel{
    private static Message message;
    public static void setMessage(Message msg){
        message = msg;
    }
    public static void send(){
        System.out.println(message.getMessage());
    }
}

单线程下运行

class Demo {
    public static void main(String[] args) {
        Message message = new Message("你好");
        Chanel.setMessage(message);
        Chanel.send();
        // 你好
    }
}

多线程下运行,出现数据覆盖现象

class Demo {
    public static void main(String[] args) {
        new Thread(()->{
            Channel.setMessage(new Message("你好-1"));
            Channel.send();
        }, "线程-1").start();
        new Thread(()->{
            Channel.setMessage(new Message("你好-2"));
            Channel.send();
        }, "线程-2").start();
        new Thread(()->{
            Channel.setMessage(new Message("你好-3"));
            Channel.send();
        }, "线程-3").start();
        /**
         * 线程-2 你好-3
         * 线程-1 你好-1
         * 线程-3 你好-3
         */
    }
}

改造 Channel

class Channel{
    // private static Message message;
    private static final ThreadLocal<Message> THREAD_LOCAL  = new ThreadLocal<Message>();
    public static void setMessage(Message msg){
        THREAD_LOCAL.set(msg);
    }
    public static void send(){
        System.out.println(Thread.currentThread().getName()
                + " "
                + THREAD_LOCAL.get().getMessage());
    }    
}
// 执行后数据对应
/**
线程-2 你好-2
线程-1 你好-1
线程-3 你好-3
*/

ThreadLocal, 只允许保存一个数据

50 定时调度

定时器进行定时任务处理,实现了一种间隔触发操作

java.util.TimerTask 定时任务处理

java.util.Timer 任务启动

// 定时启动
public void schedule(TimerTask task, long delay)
// 间隔任务
public void scheduleAtFixedRate(TimerTask task, long delay, long period)

定义任务

import java.util.TimerTask;
class MyTask extends TimerTask{
    @Override
    public void run() {
        System.out.println("任务启动 " + System.currentTimeMillis());
    }
}

示例:定时启动,会卡主

import java.util.Timer;
class Demo {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new MyTask(), 100);
        // 任务启动 1574260837613
    }
}

示例:间隔任务

class Demo {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(), 100, 1000);
    }
}

51 Base64加密与解密

加密解密示例

String message = "Hello Java";
String encodeMessage = new String(Base64.getEncoder().encode(message.getBytes()));
System.out.println(encodeMessage);
// SGVsbG8gSmF2YQ==
String decodeMessage = new String(Base64.getDecoder().decode(encodeMessage));
System.out.println(decodeMessage);
// Hello Java

最好的方法是使用2-3中加密程序,进行多次加密

加密解密示例

import java.util.Base64;
class Crypto{
    // 加密重复次数,越高越安全
    private static final int REPEAT = 3;
    /**
     * 加密处理
     * @param message
     * @return
     */
    public static String encode(String message){
        byte[]  data = message.getBytes();
        // 重复加密
        for (int i = 0; i < REPEAT; i++) {
            data = Base64.getEncoder().encode(data);
        }
        return new String(data);
    }
    public static String decode(String message){
        byte[] data = message.getBytes();
        for (int i = 0; i < REPEAT; i++) {
            data = Base64.getDecoder().decode(data);
        }
        return new String(data);
    }
}
class Demo {
    public static void main(String[] args) {
        String message = "Hello Java";
        String encodeMessage = Crypto.encode(message);
        System.out.println(encodeMessage);
        // VTBkV2MySkhPR2RUYlVZeVdWRTlQUT09
        String decodeMessage = Crypto.decode(encodeMessage);
        System.out.println(decodeMessage);
        // Hello Java
    }
}


相关文章
|
Java Apache Windows
Google的Java常用类库 Guava资料
  java的人应该都知道Apache commons的java常用类库吧,这个Guava和commons一样,封装出一套比jdk本身提供的常用类库强大。既然有了这个这么强大的类库,我们就没必要重复造轮子了。
1831 0
|
Java API
Java经典类库-Guava中的函数式编程讲解
如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava。选择junit,因为我喜欢TDD,喜欢自动化测试。而是用Guava,是因为我喜欢简洁的API。Guava提供了很多的实用工具函数来弥补java标准库的不足,另外Guava还引入了函数式编程的概念,在一定程度上缓解了java在JDK1.8之前没有lambda的缺陷,使使用java书写简洁易读的函数式风格的代码成为可能。
947 0
|
缓存 Java API
Java-类库-Guava
 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁,让你工作更加轻松愉悦。
1542 0
|
Java
Java-类库-Guava-复写的Object常用方法
 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法。每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这几个方法的工具类, Guava也提供了类似的方式。
996 0
Java-类库-Guava-Throwables类
有时候, 当我们我们捕获异常, 并且像把这个异常传递到下一个try/catch块中。Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常。 import java.
1064 0
|
Java
Java-类库-Guava-Bimap
 BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。   通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就需要额外编写一些代码了。
1097 0
|
18天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
76 1
|
18天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
67 2
|
1月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
95 0