2019独角兽企业重金招聘Python工程师标准>>>

一、UUID

一种生成无重复字符串的的程序类,这种程序类主要是根据时间戳实现一个自动的无重复的的字符串。一般在获取UUID的时候都是随机产生的一个内容,所以很少用到构造方法。通常用以下几种方式来获取.

获取UUID对象:public static UUID randomUUID​();

根据字符串获取UUID内容:public static UUID fromString​(String name);

二、Optional

主要功能是进行null的处理,以前的处理方式是增加是否为空的验证。这是一种被动验证操作。

范例:以前处理的方式

public class Test1 {public static void main(String[] args) {MessageUtil.useMessage(null);}
}interface  IMessage{public  String  getContent();
}class MessageImpl implements  IMessage{@Overridepublic String getContent() {return null;}
}class MessageUtil{public  MessageUtil(){}public  static IMessage getMessage(){return  new MessageImpl();}public  static void useMessage(IMessage msg){if(msg != null) {System.out.println(msg.getContent()); //msg可能为空}}
}

现在提供了一个Optional类来处理null的情况,这个类提供了如下几种方法:

1.返回空数据:public static<T>  Optional<T>  empty​()

2.获取数据:  public T get​()

3.保存数据,但是不允许出现null:public static <T> Optional<T> of​(T value)

如果在保存数据时为空,将抛出NullPointerException异常;

4.保存数据,允许为空:public static <T> Optional<T> ofNullable(T value);

5.空的时候返回其他数据:public T orElse(T other);

范例:修改程序,按正常的结构

public class Test1 {public static void main(String[] args) {IMessage temp = MessageUtil.getMessage().get();MessageUtil.useMessage(temp);}
}interface  IMessage{public  String  getContent();
}class MessageImpl implements  IMessage{@Overridepublic String getContent() {return "www.baidu.com";}
}class MessageUtil{public  MessageUtil(){}public  static Optional<IMessage> getMessage(){return Optional.of(new MessageImpl());}public  static void useMessage(IMessage msg){if(msg != null) {System.out.println(msg.getContent()); //msg可能为空}}
}

如果说现在数据保存的内容是null,则我们就会在保存处报异常。

public class Test1 {public static void main(String[] args) {IMessage temp = MessageUtil.getMessage().get();MessageUtil.useMessage(temp);}
}interface  IMessage{public  String  getContent();
}class MessageImpl implements  IMessage{@Overridepublic String getContent() {return "www.baidu.com";}
}class MessageUtil{public  MessageUtil(){}public  static Optional<IMessage> getMessage(){return Optional.of(null);}public  static void useMessage(IMessage msg){if(msg != null) {System.out.println(msg.getContent()); //msg可能为空}}
}

Exception in thread "main" java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at java.util.Optional.<init>(Optional.java:96)
    at java.util.Optional.of(Optional.java:108)
    at MessageUtil.getMessage(Test1.java:31)
    at Test1.main(Test1.java:9)

由于Optional类中允许保存有null的内容ofNullable,所以在数据获取的时候可以进行null的处理,但是如果为空,在get()数据时就会出现以下异常:

Exception in thread "main" java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Optional.java:135)
    at Test1.main(Test1.java:9)

范例:orElse

public class Test1 {public static void main(String[] args) {IMessage temp = MessageUtil.getMessage().orElse(new MessageImpl());MessageUtil.useMessage(temp);}
}interface  IMessage{public  String  getContent();
}class MessageImpl implements  IMessage{@Overridepublic String getContent() {return "www.baidu.com";}
}class MessageUtil{public  MessageUtil(){}public  static Optional<IMessage> getMessage(){return Optional.ofNullable(null);}public  static void useMessage(IMessage msg){if(msg != null) {System.out.println(msg.getContent()); //msg可能为空}}
}
public class Test1 {public static void main(String[] args) {IMessage temp = MessageUtil.getMessage().orElse(null);MessageUtil.useMessage(temp);}
}interface  IMessage{public  String  getContent();
}class MessageImpl implements  IMessage{@Overridepublic String getContent() {return "www.baidu.com";}
}class MessageUtil{public  MessageUtil(){}public  static Optional<IMessage> getMessage(){return Optional.ofNullable(new MessageImpl());}public  static void useMessage(IMessage msg){if(msg != null) {System.out.println(msg.getContent()); //msg可能为空}}
}

orElse 如果为空,则用orElse()括号里面的内容,不为空则会使用传过来的对象。

三、ThreadLocal

范例:消息发送结构

/*测试类*/
public class Test1 {public static void main(String[] args) {Message msg = new Message();msg.setMsg("666");Channel.setMessage(msg);Channel.send();}
}/*消息类*/
class Message{private String msg;public void  setMsg(String msg){this.msg = msg;}public String  getMsg(){return msg;}
}/*消息发送通道类*/
class Channel{private static Message message;public   Channel(){//私有化}public static void  setMessage(Message msg){message = msg;}public static void  send(){System.out.println(Thread.currentThread().getName()+"发送了"+message.getMsg());}}

这是传统的使用单线程实现了消息发送的实例,如果采用多个线程实现呢?结果如下:

范例:多线程实现消息发送

/*测试类*/
public class Test1 {public static void main(String[] args) throws  Exception{new Thread(()->{Message msg = new Message();msg.setMsg("线程消息A");Channel.setMessage(msg);Channel.send();},"消息线程A").start();new Thread(()->{Message msg = new Message();msg.setMsg("线程消息B");Channel.setMessage(msg);Channel.send();},"消息线程B").start();new Thread(()->{Message msg = new Message();msg.setMsg("线程消息C");Channel.setMessage(msg);Channel.send();},"消息线程C").start();}
}/*消息类*/
class Message{private String msg;public void  setMsg(String msg){this.msg = msg;}public String  getMsg(){return msg;}
}/*消息发送通道类*/
class Channel{private static Message message;public   Channel(){//私有化}public static void  setMessage(Message msg){message = msg;}public static void  send(){System.out.println(Thread.currentThread().getName()+"发送了"+message.getMsg());}}

出现了以下结果:

分析结果,并没有做到哪个线程发该线程自己的消息,原因是通道类用Message对象来设置消息,存在当线程A设置消息对象的时候,线程B也开始设置消息对象,消息便被覆盖了,所以造成了这个原因。具体结构图如下:

要解决这个问题的思想是:每个线程对象存到属于它自己的地方,取数据的时候也是一样。所以用到了ThreadLocal类

ThreadLocal类中包括了以下方法:

设置数据:public void set​(T value);

获取数据:public T get​()

删除数据:public void remove​()

范例:ThreadLocal类的使用,解决线程同步问题

/*测试类*/
public class Test1 {public static void main(String[] args) throws  Exception{new Thread(()->{Message msg = new Message();msg.setMsg("线程消息A");Channel.setMessage(msg);Channel.send();},"消息线程A").start();new Thread(()->{Message msg = new Message();msg.setMsg("线程消息B");Channel.setMessage(msg);Channel.send();},"消息线程B").start();new Thread(()->{Message msg = new Message();msg.setMsg("线程消息C");Channel.setMessage(msg);Channel.send();},"消息线程C").start();}
}/*消息类*/
class Message{private String msg;public void  setMsg(String msg){this.msg = msg;}public String  getMsg(){return msg;}
}/*消息发送通道类*/
class Channel{private final static ThreadLocal<Message> THREAD_LOCAL = new ThreadLocal<>();public   Channel(){//私有化}public static void  setMessage(Message msg){THREAD_LOCAL.set(msg);}public static void  send(){System.out.println(Thread.currentThread().getName()+"发送了"+THREAD_LOCAL.get().getMsg());}}

运行结果:

具体结构:

每一个线程通过ThreadLocal只允许保存一个数据。

四、定时调度

TimerTask实现了Runnable接口的类:public abstract class TimerTask extends Object  implements Runnable

范例:实现定时任务

class MyTask extends TimerTask{@Overridepublic  void  run(){System.out.println("启动"+System.currentTimeMillis());//获取当前时间返回类型为long}
}
public class TimerDemo {public static void main(String[] args) {Timer timer = new Timer();MyTask task = new MyTask();timer.scheduleAtFixedRate(task,1000,1000);//第一个1000代表延迟,第二个1000代表间隔}
}

五、Base64加密与解密

class StringUtil{private static  final String  SALT="666";private static final int  REPEAT = 5;public static  String encode(String str){String temp = str+"{"+SALT+"}";byte[] bytes = temp.getBytes();for (int i = 0; i< REPEAT ; i++){bytes = Base64.getEncoder().encode(bytes);}return new String(bytes);}public  static String decode(String str){byte[] bytes = str.getBytes();for (int i = 0; i < REPEAT ; i++){bytes = Base64.getDecoder().decode(bytes);}return new String(bytes).replaceAll("\\{\\w+\\}","");}
}
public class Base64Demo {public static void main(String[] args) {String str ="今天天气很好,非常好";System.out.println(StringUtil.decode(StringUtil.encode(str)));}
}

转载于:https://my.oschina.net/chenzhou/blog/2056169

java开发支持类库相关推荐

  1. Java开发常用类库之Hutool

    本文的所有代码均已上传GitHub,HuTool学习 学习交流q群:470464545,大家一起学习进步,CSDN博客:lolly1023 文章目录 简介与安装 简介 Hutool名称的由来 Huto ...

  2. java类库支持_第十二章:开发支持类库

    UUID类 UUID(since 1.5   java.util.UUID)是一种生成无重复字符串的程序类,这种程序类的主要功能是根据时间戳实现一个自动的无重复的字符串定义.所谓的无重复只出现概率很低 ...

  3. Java 开发常用类库和API

    收集JAVA编程开发中最常用最好用的一些开发类库和API,以便查用 一.日志相关类库 Logback.SLF4J.Log4J 二.JSON解析库 Gson.Jackson.Fastjson 三.单元测 ...

  4. Java 压缩解压缩 第三方组件,推荐一个强大的Java开发工具类库!

    feilong开发更简便的工具库 Reduce development, Release ideas (灵感从重复简单的代码中释放出来) 让你从大量重复的底层代码中脱身,提高工作效率; 让你的代码更简 ...

  5. Java 开发必备类库 Apache Commons Lang

    文章目录 StringUtils 判空函数 判断是否相等函数 是否包含函数 索引下标函数 截取函数 删除函数 删除空白函数 替换函数 反转函数 分隔函数 合并函数 大小写转换和判断 缩短省略函数 相似 ...

  6. amd cpu不能在cmd环境下运行java代码_「我们一起学Java02」JDK、JRE、JVM简介,Java开发平台的搭建...

    Hello,各位头条的读者大家好!接下来一段时间小编将和大家一起学习Java,"我们一起学Java"专题将会持续更新,欢迎大家关注.这里是"我们一起学Java" ...

  7. 还在重复造轮子?Java开发人员必知必会的20种常用类库和API

    介绍 一个有经验的Java开发人员特征之一就是善于使用已有的轮子来造车.<Effective Java>的作者Joshua Bloch曾经说过:"建议使用现有的API来开发,而不 ...

  8. Java 开发人员必知必会的 20 种常用类库和 API

    一.日志相关类库 日志库是很常见的,因为你在每一个项目中都需要他们.打印日志是服务器端应用中最重要的事情,因为日志是你了解你的程序发生了什么的唯一途径.尽管JDK附带自己的日志库,但是还是有很多更好的 ...

  9. Java开发人员必知必会的20种常用类库和API

    一个有经验的Java开发人员特征之一就是善于使用已有的轮子来造车.<Effective Java>的作者Joshua Bloch曾经说过:"建议使用现有的API来开发,而不是重复 ...

最新文章

  1. 【FFmpeg】FFmpeg 帮助文档使用
  2. 由手机上网带来病毒引发的三大疑问?
  3. 四叶草社交平台——十天冲刺(10)
  4. unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建
  5. django 1.8 官方文档翻译:6-3 Django异常
  6. raft算法_学习分布式一致性协议:自己实现一个Raft算法
  7. php链接没有下划线,html超链接怎么去掉下划线
  8. 【颜色识别】基于matlab GUI机器视觉RGB识别系统【含Matlab源码 951期】
  9. WebM视频格式怎么转换成MP4
  10. 认同和确定性矩阵(Ralph Stacey's Agreement and Certainty Matrix)-译
  11. 2022全新Java学习路线图动力节点(五)框架之路
  12. Linux环境Hadoop的下载安装
  13. Flex控件_datagrid_编辑功能
  14. 云e办学习笔记(三十三)FastDFS学习和安装
  15. DOSBOX使用技巧
  16. iPhone降级至1.0.2及baseband恢复教程
  17. 最快学计算机,学电脑打字用什么方法学的最快
  18. algorithm中的排序算法详解
  19. 位于两个内网的结点A和B都连接到一个公网的rdv,然后A与B之间发送消息,这时消息是否还经过rdv?...
  20. edis学习记录02-redis基础数据类型命令

热门文章

  1. python花钱培训值吗-Python培训费用高不高?Python培训真的值得吗?
  2. 如何自学python爬虫-python爬虫学习过程:
  3. python代码需要背吗-Python面试必须要看的15个问题
  4. python编程语法-Python基础及语法(十三)
  5. 函数式编程语言python-用Python进行基础的函数式编程的教程
  6. 安装Python库包的多种方式
  7. LeetCode 503 Next Greater Element II(stack)
  8. Nginx源码分析:核心模块剖析及常见问题
  9. Python Redis
  10. SpringBoot项目的几种创建方式,启动、和访问