JavaSE部分——Java基础类库
Java基础类库
一、Scanner获取键盘输入
- hasNextXxx():是否还有下一个输入项
- nextXxx():获取下一个输入项
代码示例
import java.util.Scanner;
public class ScannerKeyBoardTest {
public static void main(String[] args) {
// System.in代表标准输入,就是键盘输入
Scanner sc = new Scanner(System.in);
// 增加下面一行将只把回车作为分隔符
sc.useDelimiter("\n");
// 判断是否还有下一个输入
while (sc.hasNext()) {
// 输出输入项
System.out.println("键盘输入的内容是: " + sc.next());
}
}
}- boolean hasNextLine():返回输入源中是否还有下一行
- String nextLine():返回输入源中下一行的字符串
代码示例
import java.io.File;
import java.util.Scanner;
public class ScannerFileTest {
public static void main(String[] args) throws Exception {
// System.in代表标准输入,就是键盘输入
Scanner sc = new Scanner(new File("D:\\eclipse-workspace\\JavaSE\\day07面向对象-1\\src\\ScannerFileTest.java"));
System.out.println("ScannerFileTest.java文件内容如下: ");
// 判断是否还有下一行
while (sc.hasNextLine()) {
// 输出文件中的下一行
System.out.println(sc.nextLine());
}
}
}二、系统相关
1、System类
- 标准输入、标准输出、错误输出
代码示例
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Properties;
public class SystemTest {
public static void main(String[] args) throws Exception {
// 获取系统所有的环境变量
Map<String, String> env = System.getenv();
for (String name : env.keySet()) {
System.out.println(name + "--->" + env.get(name));
}
System.out.println("---------------------------");
// 获取指定环境变量的值
System.out.println(System.getenv("JAVA_HOME"));
// 获取所有的系统属性
Properties props = System.getProperties();
// 将所有的系统属性保存到props.txt中
props.store(new FileOutputStream("props.txt"), "System Properties");
// 输出特定的系统属性
System.out.println(System.getProperty("os.name"));
}
}- 获取系统当前时间
- currentTimeMillis()和nanoTime()返回long型整数
- identityHashCode(Object x)返回指定对象的精确的hashCode值,如果两个对象的identityHashCode值相同,则两个对象绝对是同一个对象
代码示例
public class IdentityHashCodeTest {
public static void main(String[] args) {
// 下面程序中s1和s2是两个不同的对象
String s1 = new String("Hello");
String s2 = new String("Hello");
// String重写了hashCode()方法——改为根据字符序列计算hashCode值
// 因为s1和s2的字符序列相同,所以它们的hashCode()方法返回值相同
System.out.println(s1.hashCode() + "----" + s2.hashCode());
// s1和s2是不同的字符串对象,所有它们的identityHashCode值不同
System.out.println(System.identityHashCode(s1) + "----" + System.identityHashCode(s2));
String s3 = "Java";
String s4 = "Java";
// s1和s2是相同的字符串对象,所有它们的identityHashCode值相同
System.out.println(System.identityHashCode(s3) + "----" + System.identityHashCode(s4));
}
}2、Runtime类与Java 9 的ProcessHandle
Runtime代码示例
public class RuntimeTest {
public static void main(String[] args) {
// 获取Java程序关联的运行时对象
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量: " + rt.availableProcessors());
System.out.println("空闲内存数: " + rt.freeMemory());
System.out.println("总内存数: " + rt.totalMemory());
System.out.println("可用最大内存数: " + rt.maxMemory());
}
}ProcessHandle代码示例
import java.util.concurrent.CompletableFuture;
public class ProcessHandleTest {
public static void main(String[] args) throws Exception {
Runtime rt = Runtime.getRuntime();
// 运行记事本程序
Process p = rt.exec("notepad.exe");
ProcessHandle ph = p.toHandle();
System.out.println("进程是否运行: " + ph.isAlive());
System.out.println("进程ID: " + ph.pid());
System.out.println("父进程: " + ph.parent());
// 获取ProcessHandle.Info信息
ProcessHandle.Info info = ph.info();
// 通过ProcessHandle.Info信息获取进程相关信息
System.out.println("进程命令: " + info.command());
System.out.println("进程参数: " + info.arguments());
System.out.println("进程启动时间: " + info.startInstant());
System.out.println("进程累计运行时间: " + info.totalCpuDuration());
// 通过CompletableFuture在进程结束时运行某个任务
CompletableFuture<ProcessHandle> cf = ph.onExit();
cf.thenRunAsync(() -> {
System.out.println("程序退出");
});
Thread.sleep(5000);
}
}三、常用类
1、Object类
- boolean equals(Object obj):判断指定对象与该对象是否相等。此处相等的标准是,两个对象是同一个对象,因此该equals()方法通常没有太大的实用价值
- protected void finalize():当系统中没有引用变量引用到该对象时,立即回收器调用此方法来清理该对象的资源
- Class<?> getClass():返回该对象的运行时类
- int hashCode():返回该对象的hashCode值
- String toString()
自定义类实现“克隆”的步骤如下:
- 自定义类实现Cloneable接口
- 自定义类实现自己的clone()方法
- 实现clone()方法时通过super.clone
代码示例
class Address {
String detail;
public Address(String detail) {
this.detail = detail;
}
}
//实现CLoneable接口
class User implements Cloneable {
int age;
Address address;
public User(int age) {
this.age = age;
address = new Address("广州天河");
}
// 通过调用super.clone()来实现clone()方法
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User(29);
// clone得到u1对象的副本
User u2 = u1.clone();
// 判断u1、u2是否相同
System.out.println(u1 == u2);//false
// 判断u1、u2的address是否相同
System.out.println(u1.address == u2.address);//true
}
}2、Java 7 新增的Objects类
工具类的用法
import java.util.Objects;
public class ObjectsTest {
// 定义一个obj变量,它的默认值是null
static ObjectsTest obj;
public static void main(String[] args) {
// 输出一个null对象的hashCode值,输出0
System.out.println(Objects.hashCode(obj));
// 输出一个null对象的toString,输出null
System.out.println(Objects.toString(obj));
// 要求obj不能为null,如果obj为null则引发异常
// System.out.println(Objects.requireNonNull(obj, "obj参数不能是null!"));
}
}3、Java 9 改进的String、StringBuffer和StringBuilder类
- String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁
- StringBuffer对象则代表一个字符序列可变的字符串,一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象,StringBuffer是线程安全的
- StringBuilder代表可变字符串对象,StringBuilder则没有实现线程安全功能,所以性能略高。通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用StringBuilder类
详细见252页
4、Math类
详细见256页
5、Java 7 的ThreadLocalRandom与Random
在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性
Random用法如下
import java.util.Arrays;
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
Random rand = new Random();
System.out.println("rand.nextBoolean(): " + rand.nextBoolean());
byte[] buffer = new byte[16];
rand.nextBytes(buffer);
System.out.println(Arrays.toString(buffer));
// 生成0.0~1.0之间的伪随机double数
System.out.println("rand.nextDouble(): " + rand.nextDouble());
// 生成0.0~1.0之间的伪随机float数
System.out.println("rand.nextFloat(): " + rand.nextFloat());
// 生成平均值是0.0,标准差是1.0的伪高斯数
System.out.println("rand.nextGaussian(): " + rand.nextGaussian());
// 生成一个处于int整数取值范围的伪随机整数
System.out.println("rand.nextInt(): " + rand.nextInt());
// 生成0~26之间的伪随机整数
System.out.println("rand.nextInt(26): " + rand.nextInt(26));
// 生成一个处于long整数取值范围的伪随机整数
System.out.println("rand.nextLong(): " + rand.nextLong());
}
}如果这个类的两个实例是用同一个种子创建的,对它们以同样的顺序调用方法,则它们会产生相同的数字序列
import java.util.Random;
public class SeedTest {
public static void main(String[] args) {
Random r1 = new Random(50);
System.out.println("第一个种子为50的Random对象");
System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());
System.out.println("r1.nextInt():\t" + r1.nextInt());
System.out.println("r1.nextDouble():\t" + r1.nextDouble());
System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());
System.out.println("----------------------------");
Random r2 = new Random(50);
System.out.println("第二个种子为50的Random对象");
System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());
System.out.println("r2.nextInt():\t" + r2.nextInt());
System.out.println("r2.nextDouble():\t" + r2.nextDouble());
System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());
System.out.println("----------------------------");
Random r3 = new Random(100);
System.out.println("第一个种子为50的Random对象");
System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());
System.out.println("r3.nextInt():\t" + r3.nextInt());
System.out.println("r3.nextDouble():\t" + r3.nextDouble());
System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());
System.out.println("----------------------------");
}
}ThreadLocalRandom代码示例
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomTest {
public static void main(String[] args) {
ThreadLocalRandom rand = ThreadLocalRandom.current();
// 生成一个4~20之间的伪随机整数
int val1 = rand.nextInt();
System.out.println(val1);
// 生成一个2.0~10.0之间的伪随机浮点数
double val2 = rand.nextDouble(2.0, 10.0);
System.out.println(val2);
}
}6、BigDecimal类
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println("使用String作为BigDecimal构造器参数: ");
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("使用double作为BigDecimal构造器参数: ");
System.out.println("0.05 + 0.01 = " + f3.add(f2));
System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
System.out.println("0.05 / 0.01 = " + f3.divide(f2));
}
}
使用String作为BigDecimal构造器参数:
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
使用double作为BigDecimal构造器参数:
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125
四、日期、时间类
1、Date类
- Date()
- Date(long date)
- boolean after(Date when)
- boolean before(Date when)
- long getTime()
- void setTime(long time)
代码示例
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
Date d1 = new Date();
// 获取当前时间之后100ms的时间
Date d2 = new Date(System.currentTimeMillis() + 100);
System.out.println(d2);
System.out.println(d1.compareTo(d2));
System.out.println(d1.before(d2));
}
}2、Calendar类
3、Java 8 新增的日期、时间包
五、正则表达式
String类里
- boolean matches(String regex)
- String replaceAll(String regex,String replacement)
- String replaceFirst(String regex,String replacement)
- String[] split(String regex)
1、创建正则表达式
2、使用正则表达式
- Pattern对象是正则表达式编译后再内存中的表示形式,因此,正则表达式字符串必须先辈编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。
- 如果某个正则表达式仅需一次使用,则可直接使用Pattern类的静态matches()方法,此方法自动把指定字符串编译成匿名的Pattern对象,并执行匹配
Matcher类里
- find():返回目标字符串中是否包含与Pattern匹配的子串
- group():返回上一次与Pattern匹配的子串
- start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置
- end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1
- lookingAt():返回目标字符串前面部分与Pattern是否匹配
- matches():返回整个目标字符串与Pattern是否匹配
- reset():将现有的Matcher对象应用于一个新的字符序列
代码示例
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FindGroup {
public static void main(String[] args) {
// 使用字符串模拟从网络上得到的网页源码
String str = "啊啊啊13500006666" + "人咯额13611125565" + "急急急15899903312";
// 创建一个Pattern对象,并用它建立一个Matcher对象
// 该正则表达式只抓取13X和15X段的手机号
// 实际要抓取哪些电话号码,只要修改正则表达式即可
Matcher m = Pattern.compile("((13\\d)|(15\\d))\\d{8}").matcher(str);
// 将所有符合正则表达式的子串(电话号码)全部输出
while (m.find()) {
System.out.println(m.group());
}
}
}