Java通识基础22:核心类(那些常用的工具)
Java的入口方法
public static void main(String[] args)
public是访问权限、修饰符——该方法由JVM负责调用,需要将该方法暴露出来
static——该方法由类直接调用
String[] args——用于接收用户输入的参数
Java 类名 参数1 参数2 参数3...如果某个参数含有空格,该参数需要双引号
Scanner类
获取很多地方的输入,键盘输入仅仅是其中一个
用于获取的语句:
对象.nextLine()获取下一行
对象.nextInt()获取下一个整数
对象.nextFloat()获取下一个浮点数
import java.util.Scanner;public class ArgsTest {public static void main(String[] args) throws Exception{System.out.println(args.length);for (String s:args){System.out.println(s);}Scanner a=new Scanner(System.in);//读取文件输入while (a.hasNextLine()){String line=a.nextLine();System.out.println(line);}//在此可以一直无限行的输入下去}}
System类的详细介绍
Java的程序会在JVM的环境中运行
System类代表操作系统——获取操作系统相关信息Radom类代表JVM的虚拟机——获取JVM相关信息
System类变量
in代表键盘out代表屏幕System的方法都是类方法,可以直接调用
学会查找、阅读文档!!!!
举例:
获取时间方法System.currentTimeMillis()public class Demo1 {public static void main(String[] args) {//从1970年0时0分0秒到现在过了多少毫秒System.out.println(System.currentTimeMillis());}}
退出系统方法System.exit(返回值);
public class Demo2 {public static void main(String[] args) {//从1970年0时0分0秒到现在过了多少毫秒System.exit(1);System.out.println("321312");}}/*进程已结束,退出代码1*/
Runtime类
Runtime只需要一个实例,应该采用单例模式
举例:
public class Demo1 {public static void main(String[] args) {Runtime rt=Runtime.getRuntime();//返回与当前Java应用程序关联的运行时的对象//单例模式不能创建对象,直接通过类调用方法System.out.println("JVM的最大堆内存"+rt.maxMemory());System.out.println("JVM的空闲堆内存"+rt.freeMemory());System.out.println("JVM总共使用的堆内存"+rt.totalMemory());}}
public class Demo1 {public static void main(String[] args) {rt.exec("C:\\Program Files\\Mozilla Firefox\\firefox.exe");//运行指定路径的程序}}
Object类——一切的父类
通常有3个需要被重写的方法——
toString()返回该对象描述的字符串equals(Object.obj)根据业务条例,提供判断两个对象相等的标准hashCode()
Objects工具
Arrays:操作数组的工具类
Objects:操作对象的工具类,该类的工具方法可以避免NullPointerException
import java.util.Objects;public class Demo1 {public static void main(String[] args){Dad a=null;//System.out.println(a.hashCode());//会出现空指针异常System.out.println(Objects.hashCode(a));//解决方式//System.out.println(a.equals(new Dad()));//会出现空指针异常System.out.println(Objects.equals(a,new Dad()));}}class Dad{}
字符串类
Java的字符串类型
StringStringBufferStringBuilderStringJoiner
String代表了字符内容不能更改的字符串
说明例子:
public class Demo1 {public static void main(String[] args) {String a="wydsb";//首先创建对象a,"wydsb"进入缓存池a=a+"dsb";//首先有一个字符串的直接量"wydsb","dsb"进入缓存池//还有一个String代表了拼接运算的结果,a指向新的变量//此处有两个对象,一个是固有字符串,另一个是拼接结果System.out.println(a);}}
StringBuffer StringBuilder代表了字符内容可变的字符串,可以进行对字符的添加、修改和删除
StringBuffer是线程安全的、性能较差
StringBuilder是线程不安全的、性能较好
(对于初学者其实差别不大)
StringBuilder举例:
例1
public class Demo1 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("wyd");//此处创建了两个对象——一个是直接量"wyd",另一个是创建的对象sbsb.append(" is a sb");//存在直接量" is a sb",但没有新增多余的对象System.out.println(sb);//此处输出的sb对象本身的内容发生了改变}}/*wyd is a sb*/
此时该字符串本质上被修改了,而不是通过创建新对象表面上的“修改”
例2:
public class Main {public static void main(String[] args) {String s="";for (int i=0;i<10;i++){s+=i+",";}//传统的for循环实现字符添加System.out.println(s);StringBuilder a=new StringBuilder();for (int i=0;i<10;i++){a.append(i);a.append(",");}//StringBuilder方法可以预分配缓冲区减小负担,无需创建那么多新的对象System.out.println(a);}}/*0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,*/
例3(StringBuilder实现链式法则)
public class Main1 {public static void main(String[] args) {var sb = new StringBuilder(1024);sb.append("Mr ").append("Bob").append("!").insert(0,"Hello,");System.out.println(sb.toString());}}/*Hello,Mr Bob!*/
额外补充StringJoiner
import java.util.StringJoiner;public class Main {public static void main(String[] args) {String[] names={"A","B","C","D"};var sj=new StringJoiner(",,");for(String name:names){sj.add(name);}String[] cities={"NJ","BJ","CZ","DLSD"};var s=String.join("和",cities);System.out.println(s);System.out.println(sj);}}/*NJ和BJ和CZ和DLSDA,,B,,C,,D*/
joininfo
public class StringJoin {public static void main(String[] args) {String[] names = {"Bob", "Alice", "Grace"};var s = String.join(", ", names);System.out.println(s);}}/*Bob, Alice, Grace*/
字符串类中一些其他方法的举例:
public class Main {public static void main(String[] args) {String a = "Hello";String b = "Hello";b = b.toLowerCase();//全部字符转化为小写System.out.println(b);b=b.toUpperCase();System.out.println(b);a=a.toUpperCase();//全部字符转化为大写System.out.println(a==b);System.out.println(a.equals(b));//由上两行可以看出不能用==来比较字符串System.out.println(a.indexOf("H"));//搜索字符在固定字符串的位置System.out.println(a.lastIndexOf("L"));//搜索字符在字符串最后出现的位置System.out.println(a.startsWith("H"));System.out.println(a.endsWith("O"));//判断开头结尾的字符是否为此字符System.out.println("a\n".isBlank());System.out.println("\n".isBlank());//判断空白字符System.out.println(" ".isEmpty());System.out.println("".isEmpty());//判断字符串长度是否为0b=b.replace("L","m");System.out.println(b);//将该字符串的所有L字符替换为mString s = "Hi %s, your score is %d!";System.out.println(s.formatted("Alice", 80));System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));//替换占位符String.valueOf(123); // "123"String.valueOf(45.67); // "45.67"String.valueOf(true); // "true"//将别的值转化为字符串int m1=Integer.parseInt("fd",16);//将该字符串转化为一个十六进制数char[] cs="dwadaw".toCharArray();System.out.println(cs[3]);//字符串转化为字符数组}}/*helloHELLOfalsetrue03truetruefalsetruefalsetrueHEmmOHi Alice, your score is 80!Hi Bob, your score is 59.50!d*/
(在此就不全部列举了,你已经是一个半成熟的开发者了,应该学会查文档!)
Math类
本质上是用于数学计算的类
该类下的方法全部都是有static,可有类本身直接调用
Random和ThreadLocalRandom类
Random是随机数生成器
ThreadLocalRandom是当前线程的随机数生成器
SecureRadom类的随机性最强,牵扯到量子领域(总之就是很牛逼,如果牵扯到加密建议用它)
例1(调用Random类)
import java.util.Random;import java.util.stream.DoubleStream;import java.util.concurrent.ThreadLocalRandom;public class RandomDemo1 {public static void main(String[] args) {Random a=new Random();System.out.println( a.nextDouble());ThreadLocalRandom b=ThreadLocalRandom.current();//没有构造器,获取实例int c=b.nextInt(2,100);System.out.println(c);}}/*0.8464796112618053(生成一个随机小数)82(生成一个2-100的随机整数)*/
例2(直接使用random方法)
public class RadomInfo {public static void main(String[] args) {System.out.println(Math.random());double x=Math.random();double min=10;double max=20;Double y = x * (max - min) + min; // y的范围是[10,20)long n=y.longValue();System.out.println(y);System.out.println(n);}}/*0.9571031550660398(0-1的随机小数)17.844978432064373(10到20的随机小数)17(10到20的随机整数)*/
例3(SecurityRadom的调用)
import java.security.SecureRandom;import java.util.Random;public class Demo2 {public static void main(String[] args) {Random m=new Random();System.out.println(m.nextDouble(10));//生成10以内的随机double值System.out.println(m.nextInt(5000));//生成5000以内的随机int值SecureRandom n=new SecureRandom();System.out.println(n.nextDouble(10));System.out.println(n.nextInt(5000));//功能同上,后者的随机性更强}}/*5.35927283322718334200.8603400442734033617(生成的随机数)*/
BigDecimal类
对于float、double两个类型而言,它们保存的小时可能不精确——所有语言都这样
——因此如果要比较浮点数是否相等,通常计算他们的差值,如果他们的差足够小,判定相等!
如果需要精确保存小时的值,那么需要使用BigDecimal
基本运算举例
import java.math.BigDecimal;public class Demo1 {public static void main(String[] args) {BigDecimal bd=new BigDecimal("0.4222");BigDecimal bd1=new BigDecimal("0.2111");BigDecimal add=bd.add(bd1);//加法System.out.println(add);BigDecimal mui=bd.multiply(bd1);//乘法System.out.println(mui);BigDecimal dev=bd.divide(bd1);//除法System.out.println(dev);}}/*0.63330.089126422*/
BigDecimal应对任意精度和大小的浮点数
import java.math.BigDecimal;import java.math.RoundingMode;public class Main1 {public static void main(String[] args) {BigDecimal a=new BigDecimal("2.321313213");System.out.println(a.doubleValue());System.out.println(a.scale());//显示小数位数a=a.setScale(4, RoundingMode.HALF_UP);//保留4位并且四舍五入System.out.println(a.doubleValue());a=a.setScale(3,RoundingMode.DOWN);System.out.println(a.doubleValue());//保留3位后面直接截断BigDecimal b=new BigDecimal("2.321");System.out.println(a.compareTo(b));//返回正数代表小于,负数代表大于,、0代表等于}}/*2.32131321392.32132.3210*/
Date类
代表当前日期时间
Dtae():获取当前时间
Date(long date):负责将System.currentTimeMillis()返回的long时间装换成Date对象
GetTime():返回long
举例:
import java.util.Date;public class Demo1 {public static void main(String[] args) {long time =System.currentTimeMillis();Date a=new Date(time);System.out.println(a);long time1=a.getTime();System.out.println(time1);}}
Canlendar类
目的是取代Date类
采用了模板设计,所以Canlendar类是一个抽象类,实际使用的通常是子类
设计初衷希望世界上不同的日历都能通过它来派生子类
import java.util.Calendar;public class demo1 {public static void main(String[] args) {Calendar a1=Calendar.getInstance();System.out.println(a1);}}//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定义属性的工具
public class Person {private String name;private int age;public void setName(String name){this.name=name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}}
Record
public class Main {public static void main(String[] args) {Point p=new Point(233,666);System.out.println(p.x());System.out.println(p.y());}}record Point(int x,int y){//定义更简化的final类}//该record类等同于public final class Point {private final int x;private final int y;public Point(int x, int y) {this.x = x;this.y = y;}public int x() {return this.x;}public int y() {return this.y;}}/*233666*/
Biglnteger应对巨大的整数
import java.math.BigInteger;public class Main {public static void main(String[] args) {BigInteger a=new BigInteger("236075690543243213112312312321312321321231212321213213123124234");System.out.println(a.longValueExact());//会直接报错ArithmeticExceptionSystem.out.println(a.longValue());//会出现不准确的异常值}}
