JAVA開發(fā)常用類庫UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解
1、UUID類庫
UUID 根據(jù)時(shí)間戳實(shí)現(xiàn)自動(dòng)無重復(fù)字符串定義
// 獲取UUID public static UUID randomUUID() // 根據(jù)字符串獲取UUID public static UUID fromString(String name)
應(yīng)用:對(duì)文件進(jìn)行自動(dòng)命名處理
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 主要功能是進(jìn)行null空指針處理
JDK >= 1.8
示例:?jiǎn)为?dú)處理null參數(shù)
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); } }
幾個(gè)方法
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
自定義函數(shù)實(shí)現(xiàn)
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()
定義發(fā)送消息類
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()); } }
單線程下運(yùn)行
class Demo { public static void main(String[] args) { Message message = new Message("你好"); Chanel.setMessage(message); Chanel.send(); // 你好 } }
多線程下運(yùn)行,出現(xiàn)數(shù)據(jù)覆蓋現(xiàn)象
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()); } } // 執(zhí)行后數(shù)據(jù)對(duì)應(yīng) /** 線程-2 你好-2 線程-1 你好-1 線程-3 你好-3 */
ThreadLocal, 只允許保存一個(gè)數(shù)據(jù)
4、TimerTask類庫定時(shí)調(diào)度
定時(shí)器進(jìn)行定時(shí)任務(wù)處理,實(shí)現(xiàn)了一種間隔觸發(fā)操作
java.util.TimerTask 定時(shí)任務(wù)處理
java.util.Timer 任務(wù)啟動(dòng)
// 定時(shí)啟動(dòng) public void schedule(TimerTask task, long delay) // 間隔任務(wù) public void scheduleAtFixedRate(TimerTask task, long delay, long period)
定義任務(wù)
import java.util.TimerTask; class MyTask extends TimerTask{ @Override public void run() { System.out.println("任務(wù)啟動(dòng) " + System.currentTimeMillis()); } }
示例:定時(shí)啟動(dòng),會(huì)卡主
import java.util.Timer; class Demo { public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new MyTask(), 100); // 任務(wù)啟動(dòng) 1574260837613 } }
示例:間隔任務(wù)
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中加密程序,進(jìn)行多次加密
加密解密示例
import java.util.Base64; class Crypto{ // 加密重復(fù)次數(shù),越高越安全 private static final int REPEAT = 3; /** * 加密處理 * @param message * @return */ public static String encode(String message){ byte[] data = message.getBytes(); // 重復(fù)加密 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開發(fā)過程中常用類庫UUID、Optional、ThreadLocal、TimerTask、Base64的基礎(chǔ)使用方法,更多關(guān)于UUID、Optional、ThreadLocal、TimerTask、Base64類庫的詳細(xì)使用方法請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
Java中將String類型轉(zhuǎn)換為int類型的幾種常見方法
在java中經(jīng)常會(huì)遇到需要對(duì)數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換的場(chǎng)景,這篇文章主要給大家介紹了關(guān)于Java中將String類型轉(zhuǎn)換為int類型的幾種常見方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07Spring?@DateTimeFormat日期格式化時(shí)注解場(chǎng)景分析
這篇文章主要介紹了Spring?@DateTimeFormat日期格式化時(shí)注解場(chǎng)景分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Java8?lambda表達(dá)式的10個(gè)實(shí)例講解
這篇文章主要介紹了Java8?lambda表達(dá)式的10個(gè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java ReentrantLock條件鎖實(shí)現(xiàn)原理示例詳解
這篇文章主要為大家介紹了java ReentrantLock條件鎖實(shí)現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Java lambda list轉(zhuǎn)換map時(shí),把多個(gè)參數(shù)拼接作為key操作
這篇文章主要介紹了Java lambda list轉(zhuǎn)換map時(shí),把多個(gè)參數(shù)拼接作為key操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)
在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測(cè)試,那么我們通常會(huì)在繁雜地api中找到需要進(jìn)行測(cè)試或者管理的接口,接下來通過本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧2021-11-11InterlliJ IDEA2020新建java web項(xiàng)目找不到Static Web的解決
這篇文章主要介紹了InterlliJ IDEA2020新建java web項(xiàng)目找不到Static Web的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Springboot初始化項(xiàng)目并完成登入注冊(cè)的全過程
工作之余,想要學(xué)習(xí)一下SpringBoot,通過網(wǎng)絡(luò)大量教程最終成功運(yùn)行SpringBoot項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Springboot初始化項(xiàng)目并完成登入注冊(cè)的相關(guān)資料,需要的朋友可以參考下2022-10-10