📓
Be a Javaer
  • Introduction
  • 第 1 章 Java编程开发入门
    • 第 1 节 Java开发准备
    • 第 2 节 Java基本概念
    • 第 3 节 Java数据类型划分
    • 第 4 节 Java运算符
    • 第 5 节 Java程序逻辑控制
    • 第 6 节 Java方法的定义及使用
  • 第 2 章 Java面向对象编程
    • 第 1 节 类与对象
    • 第 2 节 深入分析类与对象
    • 第 3 节 数组的定义与使用
    • 第 4 节 String类的基本概念
    • 第 5 节 String类的常用方法
    • 第 6 节 this关键字
    • 第 7 节 引用传递
    • 第 8 节 数据表与简单Java类映射
    • 第 9 节 对象比较
    • 第 10 节 static关键字
    • 第 11 节 代码块
    • 第 12 节 内部类
    • 第 13 节 链表的定义与使用
    • 第 14 节 继承性
    • 第 15 节 覆写
    • 第 16 节 数组操作
    • 第 17 节 辅助概念
      • final关键字
      • 多态性
    • 第 18 节 抽象类的定义及使用
    • 第 19 节 接口的定义及使用
    • 第 20 节 Object类
    • 第 21 节 拓展概念
      • 匿名内部类
      • 包装类
    • 第 22 节 包的定义及使用
    • 第 23 节 访问控制权限
      • 单例设计模式
      • 多例设计模式
    • 第 24 节 异常的捕获及处理
    • 第 25 节 Java5新特性
      • 可变参数
      • foreach循环
      • 静态导入
    • 第 26 节 泛型
    • 第 27 节 枚举
    • 第 28 节 Annotation
    • 第 29 节 Java7新特性
      • AutoCloseable
      • Try-with-resources
    • 第 30 节 Java8新特性
      • 接口定义增强
      • Lambda表达式
      • 方法引用
      • 函数式接口
  • 第 3 章 Java高级编程
    • 第 1 节 Java多线程基础实现
    • 第 2 节 线程常用操作方法
    • 第 3 节 线程的同步与死锁
    • 第 4 节 生产者与消费者
    • 第 5 节 Java基础类库
      • StringBuffer
      • Runtime
      • System
      • finalize
      • Cleaner
      • 对象克隆
    • 第 6 节 数字操作类
      • Math类
      • Random类
      • 大数字操作类
    • 第 7 节 日期处理类
      • Date类
      • 日期格式化
      • Calendar类
    • 第 8 节 比较器
    • 第 9 节 正则表达式
      • 常用的正则标记
      • String类对正则的支持
      • java.util.regex包支持
    • 第 10 节 反射机制
    • 第 11 节 动态代理
    • 第 12 节 反射与Annotation
    • 第 13 节 国际化程序实现
    • 第 14 节 开发支持类库
      • Arrays类
      • UUID类
      • Optional类
      • ThreadLocal类
      • 定时器
      • Base64加密工具
    • 第 15 节 文件操作
    • 第 16 节 字节流与字符流
    • 第 17 节 IO辅助概念
      • 字符编码
      • 内存流
      • 管道流
      • RandomAccessFile
    • 第 18 节 打印流
    • 第 19 节 System类对IO的支持
    • 第 20 节 对象序列化
    • 第 21 节 IO高级应用
      • 缓冲输入流
      • Scanner
    • 第 22 节 网络编程
    • 第 23 节 类集框架
    • 第 24 节 List集合
    • 第 25 节 集合输出
    • 第 26 节 Map集合
    • 第 27 节 Set集合
    • 第 28 节 集合工具类
      • Stack
      • Queue
      • Properties
      • Collections工具类
    • 第 29 节 数据流Stream
    • 第 30 节 JDBC简介
    • 第 31 节 Statement接口
    • 第 32 节 PreparedStatment接口
    • 第 33 节 批处理与事务处理
  • 第 4 章 Oracle数据库基础
    • 第 1 节 Oracle简介
    • 第 2 节 Oracle安装与配置
    • 第 3 节 SQLPlus命令
    • 第 4 节 SQL简介与数据表分析
    • 第 5 节 SQL简单查询
    • 第 6 节 SQL限定查询
    • 第 7 节 查询排序
    • 第 8 节 综合练习:基础查询
    • 第 9 节 单行函数
    • 第 10 节 多表查询
    • 第 11 节 分组统计查询
    • 第 12 节 子查询
    • 第 13 节 综合案例:复杂查询
    • 第 14 节 数据更新操作
    • 第 15 节 事务处理
    • 第 16 节 数据伪列
    • 第 17 节 数据表的创建与管理
    • 第 18 节 约束的创建与管理
    • 第 19 节 综合案例:数据表操作
    • 第 20 节 序列的定义与使用
  • 第 5 章 JavaWeb基础
  • 第 6 章 走向单体地狱
  • 第 7 章 GitFlow工作流指南
    • 版本控制
    • Git
    • 集中式工作流
    • 功能分支工作流
    • GitFlow 工作流
    • Forking 工作流
    • Pull Requests
  • 第 8 章 微服务入门
    • 第 1 节 微服务简介
    • 第 2 节 Linux
    • 第 3 节 Docker
    • Docker 仓库
    • Ubuntu 安装 Docker
    • Docker 镜像加速器
    • 第 4 节 Docker Compose
    • 第 5 节 GitLab
    • 第 6 节 Nexus
    • 第 7 节 Harbor
  • 第 9 章 再谈微服务
  • 第 10 章 Spring Boot
  • 第 11 章 Spring Cloud Netflix
  • 第 12 章 Apache Dubbo Zookeeper
  • 第 13 章 Spring Cloud Alibaba
  • 第 14 章 Vue
  • 第 15 章 Kubernetes
  • 第 16 章 Spring Security oAuth2
  • 第 17 章 Flutter
  • Redis
    • Redis 入门
    • Redis 的数据类型
    • Redis 事务
    • Jedis
    • Spring Boot 整合 Redis
    • Redis 配置文件
    • Redis 持久化
    • Redis 发布/订阅
    • Redis 主从复制
    • Redis Sentinel
    • Redis 缓存故障
  • Glossary
由 GitBook 提供支持
在本页
  • Arrays类
  • UUID类
  • Optional类
  • ThreadLocal类
  • 定时器
  • Base64加密工具

这有帮助吗?

  1. 第 3 章 Java高级编程

第 14 节 开发支持类库

上一页第 13 节 国际化程序实现下一页第 15 节 文件操作

最后更新于5年前

这有帮助吗?

Arrays类

在之前一直使用的“java.util.Arrays.sort()”可以实现数组的排序,而Arrays类就是java.util包中提供的一个工具类,这个工具类主要是完成所有与数组有关的操作功能。

在这个类里面存在有二分查找法:public static int binarySearch(Object[] a, int fromIndex, int toIndex, Object key)。但是要进行二分查找前提条件就是先要排序。

范例: 实现二分查找

package com.alpha;
import java.util.Arrays;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		int[] date = new int[] {1, 5, 6, 2, 3, 4, 9, 8, 7, 10};
		Arrays.sort(date);
		System.out.println(Arrays.binarySearch(date, 9));
	}
}

Arrays提供了数组比较:public static boolean equals(Object[] a, Object[] a2),只不过借用了equals()方法名称与Object类的equals()没有任何关系。

package com.alpha;
import java.util.Arrays;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		int[] datea = new int[] {1, 2, 3};
		int[] dateb = new int[] {1, 2, 3};
		System.out.println(Arrays.equals(datea, dateb));
	}
}

要想判断数组是否相同,需要顺序完全一致。

  • 填充数组:public static void fill(Object[] a, int fromIndex, int toIndex, Object val);

  • 将数组变为字符串:public static String toString(Object[] a)。

package com.alpha;
import java.util.Arrays;
public class MainClass{ 
	public static void main(String[] args) throws Exception {
		int[] date = new int[10];
		Arrays.fill(date, 3);
		System.out.println(Arrays.toString(date));
	}
}

UUID类

通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。

UUID的目的是让分布式系统中的所有元素都能有唯一的辨识信息,而不需要透过中央控制端来做辨识信息的指定。

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

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

public class Application {
    public static void main(String[] args) {
        UUID uid = UUID.randomUUID();
        System.out.println(uid.toString());
    }
}

Optional类

Optional类的主要功能是进行NPE的相关处理,在以往进行开发的时候,为了防止程序出现NPE往往需要追加验证。

范例: 传统的引用传递问题

public class Application {
    public static void main(String[] args) {
        MessageUtil.useMessage(MessageUtil.getMessage());
    }
}
class MessageUtil {
    public static IMessage getMessage() {
        return null;
    }
    public static void useMessage(IMessage msg) {
        if (msg != null) {
            System.out.println(msg.getContent());
        }
    } 
}
interface IMessage {
    String getContent();
}
class MessageImpl implements IMessage {
    @Override
    public String getContent() {
        return "Hello World!";
    }
}

在接收引用的时候往往都需要进行NPE的判断,为了解决这个问题,从JD1.8开始提供有Optional类,这个类可以实现NPE的处理操作。

  • 返回空数据:public static <T> Optional<T> empty();

  • 获取数据:public T get();

  • 保存数据,但是不允许为null:public static <T> Optional<T> of(T value);

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

  • 为空返回默认值:public T orElse(T other);

范例: 修改程序

public class Application {
    public static void main(String[] args) {
        IMessage msg = MessageUtil.getMessage().get();
        MessageUtil.useMessage(msg);
    }
}
class 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());
        }
    } 
}
interface IMessage {
    String getContent();
}
class MessageImpl implements IMessage {
    @Override
    public String getContent() {
        return "Hello World!";
    }
}

ThreadLocal类

ThreadLocal是一个关于创建线程局部变量的类。

通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。

范例: 定义一个发送消息的功能

public class Application {
    public static void main(String[] args) {
        Message message = new Message();
        message.setInfo("Hello World!");
        Channel.setMessage(message);
        Channel.send();
    }
}
class Channel {
    private static Message message;
    public static void setMessage(Message message) {
        Channel.message = message;
    }
    public static void send() {
        System.out.println("[SEND] " + message.getInfo());
    }
}
class Message {
    private String info;
    public void setInfo(String info) {
        this.info = info;
    }
    public String getInfo() {
        return info;
    }
}

以上的程序采用的是单线程的处理方法,如果在多线程的环境下还能否正常运行?

范例: 在多线程环境下运行

public class Application {
    public static void main(String[] args) {
        new Thread(() -> {
            Message message = new Message();
            message.setInfo("Hello Thread A!");
            Channel.setMessage(message);
            Channel.send();
        }, "Thread A").start();
        new Thread(() -> {
            Message message = new Message();
            message.setInfo("Hello Thread B!");
            Channel.setMessage(message);
            Channel.send();
        }, "Thread B").start();
        new Thread(() -> {
            Message message = new Message();
            message.setInfo("Hello Thread C!");
            Channel.setMessage(message);
            Channel.send();
        }, "Thread C").start();
    }
}
class Channel {
    private static Message message;
    public static void setMessage(Message message) {
        Channel.message = message;
    }
    public static void send() {
        System.out.println("[SEND] " + message.getInfo());
    }
}
class Message {
    private String info;
    public void setInfo(String info) {
        this.info = info;
    }
    public String getInfo() {
        return info;
    }
}

发现此时程序出现了较大的影响,线程与线程之间产生了干扰。在保持Channel核心结构不变的情况下,需要考虑到每个线程独立操作的问题。Channel所保存的消息相对于线程来讲应是线程私有的,此时就可以通过ThreadLocal类来存放数据。

  • 构造方法:public ThreadLocal();

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

  • 取出数据:public T get();

  • 删除数据:public void remove();

范例: 解决线程同步问题

public class Application {
    public static void main(String[] args) {
        new Thread(() -> {
            Message message = new Message();
            message.setInfo("Hello Thread A!");
            Channel.setMessage(message);
            Channel.send();
        }, "Thread A").start();
        new Thread(() -> {
            Message message = new Message();
            message.setInfo("Hello Thread B!");
            Channel.setMessage(message);
            Channel.send();
        }, "Thread B").start();
        new Thread(() -> {
            Message message = new Message();
            message.setInfo("Hello Thread C!");
            Channel.setMessage(message);
            Channel.send();
        }, "Thread C").start();
    }
}
class Channel {
    private static final ThreadLocal<Message> THREAD_LOCAL = new ThreadLocal<>();
    public static void setMessage(Message message) {
        THREAD_LOCAL.set(message);
    }
    public static void send() {
        System.out.println("[" + Thread.currentThread().getName() + " SEND] " + THREAD_LOCAL.get().getInfo());
    }
}
class Message {
    private String info;
    public void setInfo(String info) {
        this.info = info;
    }
    public String getInfo() {
        return info;
    }
}

定时器

定时器的主要功能是进行任务的定时操作,在特定的时间执行特定的任务。在Java中提供有定时器的支持,但是这种任务的处理知识实现了一种间隔触发的操作。

如果要想实现定时任务需要有一个定时操作的主体类,以及一个定时任务的控制。可以使用两个类实现:

  • java.util.TimerTask:实现定时任务;

  • java.util.Timer:进行任务的启动:

    • 任务启动:public void schedule(TimerTask task, long delay);

    • 间隔触发:public void scheduleAtFixedRate(TimerTask task, long delay, long period);

范例: 定时任务

public class Application {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(), 100, 1000);
    }
}
class MyTask extends TimerTask {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 定时任务执行,当前时间:" + System.currentTimeMillis());
    }
}

Base64加密工具

加密操作是如今应用必不可少的组成部分,JDK1.8开始提供了一组新的加密处理操作,Base64处理,在这个类里面有两个内部类:

  • Base64.Encoder:进行加密处理;

    • 加密:public byte[] encode(byte[] src);

  • Base64.Decoder:进行解密处理;

    • 解密:public byte[] decode(byte[] src);

范例: 实现加密解密操作

public class Application {
    public static void main(String[] args) {
        String msg = "Hello World!";
        String encMsg = new String(Base64.getEncoder().encode(msg.getBytes()));
        System.out.println(encMsg);
        String oldMsg = new String(Base64.getDecoder().decode(encMsg));
        System.out.println(oldMsg);
    }
}
Arrays类
UUID类
Optional类
ThreadLocal类
定时器
Base64加密工具