Java通识基础22:核心类(那些常用的工具)

Java的入口方法

public static void main(String[] args)

public是访问权限、修饰符——该方法由JVM负责调用,需要将该方法暴露出来

static——该方法由类直接调用

String[] args——用于接收用户输入的参数

Java 类名 参数1 参数2 参数3...如果某个参数含有空格,该参数需要双引号

Scanner

获取很多地方的输入,键盘输入仅仅是其中一个

用于获取的语句:

对象.nextLine()获取下一行

对象.nextInt()获取下一个整数

对象.nextFloat()获取下一个浮点数

  1. import java.util.Scanner;
  2. public class ArgsTest {
  3. public static void main(String[] args) throws Exception{
  4. System.out.println(args.length);
  5. for (String s:args){
  6. System.out.println(s);
  7. }
  8. Scanner a=new Scanner(System.in);
  9. //读取文件输入
  10. while (a.hasNextLine()){
  11. String line=a.nextLine();
  12. System.out.println(line);
  13. }//在此可以一直无限行的输入下去
  14. }
  15. }

System类的详细介绍

Java的程序会在JVM的环境中运行

  • System类代表操作系统——获取操作系统相关信息
  • Radom类代表JVM的虚拟机——获取JVM相关信息

System类变量

  • in代表键盘

  • out代表屏幕
    System的方法都是类方法,可以直接调用
    学会查找、阅读文档!!!!
    举例:
    获取时间方法System.currentTimeMillis()

    1. public class Demo1 {
    2. public static void main(String[] args) {
    3. //从1970年0时0分0秒到现在过了多少毫秒
    4. System.out.println(System.currentTimeMillis());
    5. }
    6. }


退出系统方法System.exit(返回值);

  1. public class Demo2 {
  2. public static void main(String[] args) {
  3. //从1970年0时0分0秒到现在过了多少毫秒
  4. System.exit(1);
  5. System.out.println("321312");
  6. }
  7. }
  8. /*
  9. 进程已结束,退出代码1
  10. */

Runtime

Runtime只需要一个实例,应该采用单例模式

举例:

  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. Runtime rt=Runtime.getRuntime();//返回与当前Java应用程序关联的运行时的对象
  4. //单例模式不能创建对象,直接通过类调用方法
  5. System.out.println("JVM的最大堆内存"+rt.maxMemory());
  6. System.out.println("JVM的空闲堆内存"+rt.freeMemory());
  7. System.out.println("JVM总共使用的堆内存"+rt.totalMemory());
  8. }
  9. }
  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. rt.exec("C:\\Program Files\\Mozilla Firefox\\firefox.exe");
  4. //运行指定路径的程序
  5. }
  6. }

Object类——一切的父类

通常有3个需要被重写的方法——

  • toString()返回该对象描述的字符串
  • equals(Object.obj)根据业务条例,提供判断两个对象相等的标准
  • hashCode()

Objects工具

Arrays:操作数组的工具类

Objects:操作对象的工具类,该类的工具方法可以避免NullPointerException

  1. import java.util.Objects;
  2. public class Demo1 {
  3. public static void main(String[] args){
  4. Dad a=null;
  5. //System.out.println(a.hashCode());
  6. //会出现空指针异常
  7. System.out.println(Objects.hashCode(a));
  8. //解决方式
  9. //System.out.println(a.equals(new Dad()));
  10. //会出现空指针异常
  11. System.out.println(Objects.equals(a,new Dad()));
  12. }
  13. }
  14. class Dad{
  15. }

字符串类

Java的字符串类型

  • String
  • StringBuffer
  • StringBuilder
  • StringJoiner

String代表了字符内容不能更改的字符串

说明例子:

  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. String a="wydsb";//首先创建对象a,"wydsb"进入缓存池
  4. a=a+"dsb";//首先有一个字符串的直接量"wydsb","dsb"进入缓存池
  5. //还有一个String代表了拼接运算的结果,a指向新的变量
  6. //此处有两个对象,一个是固有字符串,另一个是拼接结果
  7. System.out.println(a);
  8. }
  9. }

StringBuffer StringBuilder代表了字符内容可变的字符串,可以进行对字符的添加、修改和删除

StringBuffer是线程安全的、性能较差

StringBuilder是线程不安全的、性能较好

(对于初学者其实差别不大)

StringBuilder举例:

例1

  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. StringBuilder sb = new StringBuilder("wyd");
  4. //此处创建了两个对象——一个是直接量"wyd",另一个是创建的对象sb
  5. sb.append(" is a sb");//存在直接量" is a sb",但没有新增多余的对象
  6. System.out.println(sb);//此处输出的sb对象本身的内容发生了改变
  7. }
  8. }
  9. /*
  10. wyd is a sb
  11. */

此时该字符串本质上被修改了,而不是通过创建新对象表面上的“修改”

例2:

  1. public class Main {
  2. public static void main(String[] args) {
  3. String s="";
  4. for (int i=0;i<10;i++){
  5. s+=i+",";
  6. }//传统的for循环实现字符添加
  7. System.out.println(s);
  8. StringBuilder a=new StringBuilder();
  9. for (int i=0;i<10;i++){
  10. a.append(i);
  11. a.append(",");
  12. }//StringBuilder方法可以预分配缓冲区减小负担,无需创建那么多新的对象
  13. System.out.println(a);
  14. }
  15. }
  16. /*
  17. 0,1,2,3,4,5,6,7,8,9,
  18. 0,1,2,3,4,5,6,7,8,9,
  19. */

例3(StringBuilder实现链式法则)

  1. public class Main1 {
  2. public static void main(String[] args) {
  3. var sb = new StringBuilder(1024);
  4. sb.append("Mr ")
  5. .append("Bob")
  6. .append("!")
  7. .insert(0,"Hello,");
  8. System.out.println(sb.toString());
  9. }
  10. }
  11. /*
  12. Hello,Mr Bob!
  13. */

额外补充StringJoiner

  1. import java.util.StringJoiner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. String[] names={"A","B","C","D"};
  5. var sj=new StringJoiner(",,");
  6. for(String name:names){
  7. sj.add(name);
  8. }
  9. String[] cities={"NJ","BJ","CZ","DLSD"};
  10. var s=String.join("和",cities);
  11. System.out.println(s);
  12. System.out.println(sj);
  13. }
  14. }
  15. /*
  16. NJ和BJ和CZ和DLSD
  17. A,,B,,C,,D
  18. */

joininfo

  1. public class StringJoin {
  2. public static void main(String[] args) {
  3. String[] names = {"Bob", "Alice", "Grace"};
  4. var s = String.join(", ", names);
  5. System.out.println(s);
  6. }
  7. }
  8. /*
  9. Bob, Alice, Grace
  10. */

字符串类中一些其他方法的举例:

  1. public class Main {
  2. public static void main(String[] args) {
  3. String a = "Hello";
  4. String b = "Hello";
  5. b = b.toLowerCase();//全部字符转化为小写
  6. System.out.println(b);
  7. b=b.toUpperCase();
  8. System.out.println(b);
  9. a=a.toUpperCase();//全部字符转化为大写
  10. System.out.println(a==b);
  11. System.out.println(a.equals(b));
  12. //由上两行可以看出不能用==来比较字符串
  13. System.out.println(a.indexOf("H"));//搜索字符在固定字符串的位置
  14. System.out.println(a.lastIndexOf("L"));//搜索字符在字符串最后出现的位置
  15. System.out.println(a.startsWith("H"));
  16. System.out.println(a.endsWith("O"));//判断开头结尾的字符是否为此字符
  17. System.out.println("a\n".isBlank());
  18. System.out.println("\n".isBlank());//判断空白字符
  19. System.out.println(" ".isEmpty());
  20. System.out.println("".isEmpty());//判断字符串长度是否为0
  21. b=b.replace("L","m");
  22. System.out.println(b);//将该字符串的所有L字符替换为m
  23. String s = "Hi %s, your score is %d!";
  24. System.out.println(s.formatted("Alice", 80));
  25. System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));
  26. //替换占位符
  27. String.valueOf(123); // "123"
  28. String.valueOf(45.67); // "45.67"
  29. String.valueOf(true); // "true"
  30. //将别的值转化为字符串
  31. int m1=Integer.parseInt("fd",16);//将该字符串转化为一个十六进制数
  32. char[] cs="dwadaw".toCharArray();
  33. System.out.println(cs[3]);//字符串转化为字符数组
  34. }
  35. }
  36. /*
  37. hello
  38. HELLO
  39. false
  40. true
  41. 0
  42. 3
  43. true
  44. true
  45. false
  46. true
  47. false
  48. true
  49. HEmmO
  50. Hi Alice, your score is 80!
  51. Hi Bob, your score is 59.50!
  52. d
  53. */

(在此就不全部列举了,你已经是一个半成熟的开发者了,应该学会查文档!)

Math

本质上是用于数学计算的类

该类下的方法全部都是有static,可有类本身直接调用

RandomThreadLocalRandom

Random是随机数生成器

ThreadLocalRandom是当前线程的随机数生成器

SecureRadom类的随机性最强,牵扯到量子领域(总之就是很牛逼,如果牵扯到加密建议用它)

例1(调用Random类)

  1. import java.util.Random;
  2. import java.util.stream.DoubleStream;
  3. import java.util.concurrent.ThreadLocalRandom;
  4. public class RandomDemo1 {
  5. public static void main(String[] args) {
  6. Random a=new Random();
  7. System.out.println( a.nextDouble());
  8. ThreadLocalRandom b=ThreadLocalRandom.current();
  9. //没有构造器,获取实例
  10. int c=b.nextInt(2,100);
  11. System.out.println(c);
  12. }
  13. }
  14. /*
  15. 0.8464796112618053(生成一个随机小数)
  16. 82(生成一个2-100的随机整数)
  17. */

例2(直接使用random方法)

  1. public class RadomInfo {
  2. public static void main(String[] args) {
  3. System.out.println(Math.random());
  4. double x=Math.random();
  5. double min=10;
  6. double max=20;
  7. Double y = x * (max - min) + min; // y的范围是[10,20)
  8. long n=y.longValue();
  9. System.out.println(y);
  10. System.out.println(n);
  11. }
  12. }
  13. /*
  14. 0.9571031550660398(0-1的随机小数)
  15. 17.844978432064373(10到20的随机小数)
  16. 17(10到20的随机整数)
  17. */

例3(SecurityRadom的调用)

  1. import java.security.SecureRandom;
  2. import java.util.Random;
  3. public class Demo2 {
  4. public static void main(String[] args) {
  5. Random m=new Random();
  6. System.out.println(m.nextDouble(10));//生成10以内的随机double值
  7. System.out.println(m.nextInt(5000));//生成5000以内的随机int值
  8. SecureRandom n=new SecureRandom();
  9. System.out.println(n.nextDouble(10));
  10. System.out.println(n.nextInt(5000));
  11. //功能同上,后者的随机性更强
  12. }
  13. }
  14. /*
  15. 5.359272833227183
  16. 3420
  17. 0.8603400442734033
  18. 617
  19. (生成的随机数)
  20. */

BigDecimal

对于float、double两个类型而言,它们保存的小时可能不精确——所有语言都这样

——因此如果要比较浮点数是否相等,通常计算他们的差值,如果他们的差足够小,判定相等!

如果需要精确保存小时的值,那么需要使用BigDecimal

基本运算举例

  1. import java.math.BigDecimal;
  2. public class Demo1 {
  3. public static void main(String[] args) {
  4. BigDecimal bd=new BigDecimal("0.4222");
  5. BigDecimal bd1=new BigDecimal("0.2111");
  6. BigDecimal add=bd.add(bd1);//加法
  7. System.out.println(add);
  8. BigDecimal mui=bd.multiply(bd1);//乘法
  9. System.out.println(mui);
  10. BigDecimal dev=bd.divide(bd1);//除法
  11. System.out.println(dev);
  12. }
  13. }
  14. /*
  15. 0.6333
  16. 0.08912642
  17. 2
  18. */

BigDecimal应对任意精度和大小的浮点数

  1. import java.math.BigDecimal;
  2. import java.math.RoundingMode;
  3. public class Main1 {
  4. public static void main(String[] args) {
  5. BigDecimal a=new BigDecimal("2.321313213");
  6. System.out.println(a.doubleValue());
  7. System.out.println(a.scale());//显示小数位数
  8. a=a.setScale(4, RoundingMode.HALF_UP);//保留4位并且四舍五入
  9. System.out.println(a.doubleValue());
  10. a=a.setScale(3,RoundingMode.DOWN);
  11. System.out.println(a.doubleValue());//保留3位后面直接截断
  12. BigDecimal b=new BigDecimal("2.321");
  13. System.out.println(a.compareTo(b));//返回正数代表小于,负数代表大于,、0代表等于
  14. }
  15. }
  16. /*
  17. 2.321313213
  18. 9
  19. 2.3213
  20. 2.321
  21. 0
  22. */

Date

代表当前日期时间

Dtae():获取当前时间

Date(long date):负责将System.currentTimeMillis()返回的long时间装换成Date对象

GetTime():返回long

举例:

  1. import java.util.Date;
  2. public class Demo1 {
  3. public static void main(String[] args) {
  4. long time =System.currentTimeMillis();
  5. Date a=new Date(time);
  6. System.out.println(a);
  7. long time1=a.getTime();
  8. System.out.println(time1);
  9. }
  10. }

Canlendar

目的是取代Date

采用了模板设计,所以Canlendar类是一个抽象类,实际使用的通常是子类

设计初衷希望世界上不同的日历都能通过它来派生子类

  1. import java.util.Calendar;
  2. public class demo1 {
  3. public static void main(String[] args) {
  4. Calendar a1=Calendar.getInstance();
  5. System.out.println(a1);
  6. }
  7. }
  8. //java.util.GregorianCalendar[time=1648525709222,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=2,WEEK_OF_YEAR=14,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=88,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=5,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=48,SECOND=29,MILLISECOND=222,ZONE_OFFSET=28800000,DST_OFFSET=0]

返回的本质上还是长整型的时间,目前用的不多,具体查文档

JavaBean

getter\setter定义属性的工具

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public void setName(String name){
  5. this.name=name;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. public void setAge(int age) {
  11. this.age = age;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. }

Record

  1. public class Main {
  2. public static void main(String[] args) {
  3. Point p=new Point(233,666);
  4. System.out.println(p.x());
  5. System.out.println(p.y());
  6. }
  7. }
  8. record Point(int x,int y){
  9. //定义更简化的final类
  10. }
  11. //该record类等同于
  12. public final class Point {
  13. private final int x;
  14. private final int y;
  15. public Point(int x, int y) {
  16. this.x = x;
  17. this.y = y;
  18. }
  19. public int x() {
  20. return this.x;
  21. }
  22. public int y() {
  23. return this.y;
  24. }
  25. }
  26. /*
  27. 233
  28. 666
  29. */

Biglnteger应对巨大的整数

  1. import java.math.BigInteger;
  2. public class Main {
  3. public static void main(String[] args) {
  4. BigInteger a=new BigInteger("236075690543243213112312312321312321321231212321213213123124234");
  5. System.out.println(a.longValueExact());//会直接报错ArithmeticException
  6. System.out.println(a.longValue());//会出现不准确的异常值
  7. }
  8. }