Java学习路线-22:开发支持类库UUID、Optional、ThreadLocal、TimerTask、Base64
发布日期:2021-07-01 06:08:19 浏览次数:2 分类:技术文章

本文共 6661 字,大约阅读时间需要 22 分钟。

12 章 : 开发支持类库

47 UUID类

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

// 获取UUIDpublic static UUID randomUUID()// 根据字符串获取UUIDpublic 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
{
public static
Optional
empty() {
@SuppressWarnings("unchecked") Optional
t = (Optional
) EMPTY; return t; } public static
Optional
of(T value) { return new Optional<>(value); } public static
Optional
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
optOf = Optional.of("message");// Optional
optOfNull = Optional.of(null);// java.lang.NullPointerExceptionOptional
optOfNullable = Optional.ofNullable("message");Optional
optOfNullableNull = Optional.ofNullable(null);/** * 取出*/System.out.println(optOf.get());// messageSystem.out.println(optOfNullable.get());// message// System.out.println(optOfNullableNull.get());// java.util.NoSuchElementException: No value presentSystem.out.println(optOf.orElse("default"));// messageSystem.out.println(optOfNullable.orElse("default"));// messageSystem.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
THREAD_LOCAL = new ThreadLocal
(); 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 }}

转载地址:https://pengshiyu.blog.csdn.net/article/details/103284874 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java学习路线-23:比较器Comparable、Comparator、二叉树
下一篇:一个项目关联多个远程Git仓库

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年05月06日 14时05分32秒