JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解
作者:彭世瑜 发布时间:2022-07-14 09:39:13
1、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
}
}
2、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
}
}
3、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, 只允许保存一个数据
4、TimerTask类库定时调度
定时器进行定时任务处理,实现了一种间隔触发操作
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);
}
}
5、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开发过程中常用类库UUID、Optional、ThreadLocal、TimerTask、Base64的基础使用方法,更多关于UUID、Optional、ThreadLocal、TimerTask、Base64类库的详细使用方法请查看下面的相关链接
来源:https://blog.csdn.net/mouday/article/details/103284874


猜你喜欢
- 目录一、服务的概念二、Android的多线程编程2.1 线程的基本用法2.2 在子线程中更新UI更新方式一更新方式二2.3 解析异步消息处理
- springboot项目还是ssm等java常用框架都会有这样的问题,解决办法通用问题场景前端发送Post请求,前端返回400 Bad Re
- Android绘图操作,通过继承View实现,在onDraw函数中实现绘图。下面是一个简单的例子:public class AndroidT
- 前言本文是精讲RestTemplate第7篇,前篇的blog访问地址如下:RestTemplate在Spring或非Spring环境下使用精
- 个人认为,提供params关键字以实现方法形参个数可变是C#语法的一大优点。在方法形参列表中,数组类型的参数前加params关键字,通常可以
- 先吐槽一下,现在的Bean Searcher操作手册的指引弱的可怜…对我这样的小白及其不友好话不多说直入主题1、首先肯
- 简介在有些场景中,我们会需要绘制一些高度定制化的组件,比如 UI 设计师给我们出了个难题 —— 弄一
- 本文实例讲述了Android编程之SMS读取短信并保存到SQLite的方法。分享给大家供大家参考,具体如下:Android 之 SMS 短信
- Android四种数据存储的应用方式作为一个完整的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分
- 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉
- 本文研究的主要是Java中后台线程的相关问题,具体介绍如下。以前从来没有听说过,java中有后台线程这种东西。一般来说,JVM(JAVA虚拟
- 说明这里只以 servlet 为例,没有涉及到框架,但其实路径的基本原理和框架的关系不大,所以学了框架的同学如果对路径有疑惑的也可以阅读此文
- 线程概念进程:启动一个应用程序就叫一个进程。 接着又启动一个应用程序,这叫两个进程。每个进程都有一个独立的内存空间;进程也是程序的一次执行过
- 简介功能需求如图所示,点击下一个按钮,所有卡片向右滚动,其中最后一张需要变更为最前面的一张,点击上一个按钮,所有卡片向左滚动,最前面的一张需
- 快速排序过程没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”!光听这个名字是不是就觉得很高端呢。假设我们现在对“52 39 67
- 在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁。S
- 上次给一个网站写网站 前后端分离 最后跪在ajax跨域上面了 自己在网上找了个方法 亲试可用
- 我们经常会使用springboot创建web应用,在springboot中金静态资源是如何存放的呢?静态资源映射规则我们先创建一个sprin
- 这篇文章需要对git具有一定的了解,并且知道如何安装git工具(其实就是上git官网下载个文件,安装)git这种版本控制工具有什么好处第一个
- ArrayBlockingQueue有界的阻塞队列,内部是一个数组,有边界的意思是:容量是有限的,必须进行初始化,指定它的容量大小,以先进先