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());
        }
    }
}
全部评论

相关推荐

08-15 11:57
门头沟学院 Java
点赞 评论 收藏
分享
07-20 11:20
新疆大学 Java
Alan_01:看到都是黑马点评跟苍穹外卖我就放心了
无实习如何秋招上岸
点赞 评论 收藏
分享
08-15 13:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务