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

举报
彭世瑜 发表于 2021/08/14 00:24:55 2021/08/14
【摘要】 12 章 : 开发支持类库 47 UUID类 UUID 根据时间戳实现自动无重复字符串定义 // 获取UUID public static UUID randomUUID() // 根据字符串获取UUID public static UUID fromString(String name) 123456 应用:对文件进行自动命名处理 import java...

12 章 : 开发支持类库

47 UUID类

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


// 获取UUID
public static UUID randomUUID()

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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 }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

几个方法

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; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

使用示例

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

自定义函数实现


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 }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

49 ThreadLocal类

ThreadLocal解决线程同步问题

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

  
 
  • 1
  • 2
  • 3

定义发送消息类


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()); }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

单线程下运行

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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


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 */ }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

改造 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
*/

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

ThreadLocal, 只允许保存一个数据

50 定时调度

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

java.util.TimerTask 定时任务处理
java.util.Timer 任务启动

// 定时启动
public void schedule(TimerTask task, long delay)

// 间隔任务
public void scheduleAtFixedRate(TimerTask task, long delay, long period)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

定义任务

import java.util.TimerTask;

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

示例:定时启动,会卡主

import java.util.Timer;

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

示例:间隔任务

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

最好的方法是使用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 }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/103284874

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。