Java常见类

这篇博客详细介绍了Java中的核心类,包括包装类的装箱拆箱、整数缓冲区,String类的不变性和常用方法,正则表达式的概念,大数值运算类BigInteger和BigDecemal,日期处理的Data、SimpleDateFormat和Calendar类,Math类的数学运算,Random的随机数生成,Runtime和System类的功能,以及枚举的语法、特点和优势。

一、包装类

1.1 概述

概述:

  • 基本数据类型所对应的引用数据类型。
  • Object可统一所有数据,包装类的默认值是null。
/**
	包装类:
	byte	short	int	      long	float	double	char	  boolean
	Byte	Short	Integer   Long	Float	Double	Character Boolean
 */
public static void main(String[] args) {	
	Integer num1 = Integer.valueOf(100); // 反编译的 -- Integer.valueOf
	Integer num2 = 100;	
	System.out.println(num1 == num2);	// 结果为false
}

2.2 装箱、拆箱

  • 八种包装类提供不同类型间的转换方式。

  • Number父类中提供的6个共性方法。

    • parseXXX()静态方法(除了Character)。
    • valueOf()静态方法。
  • 注意:需保证类型兼容,否则抛出NumberFormatException异常。

  • JDK 5.0之后,自动装箱、拆箱。基本数据类型和包装类自动转换。

3.3 整数缓冲区

  • Java预先创建了256个常用的整数包装类型对象。
  • 在实际应用当中,对已创建的对象进行复用。

面试题:分析以下输出结果的原因。

public class TestInteger2 {
	public static void main(String[] args) {
		//面试题
		Integer integer1=new Integer(100);
		Integer integer2=new Integer(100);
		System.out.println(integer1==integer2);		
		Integer integer3=Integer.valueOf(100);//自动装箱Integer.valueOf
		Integer integer4=Integer.valueOf(100);
		System.out.println(integer3==integer4);//true	
		Integer integer5=Integer.valueOf(200);//自动装箱
		Integer integer6=Integer.valueOf(200);
		System.out.println(integer5==integer6);//false		
	}
}

二、String类

2.1 概述:

  • Java程序中的所有字符串文本(例如“abc”)都是此类的实例。

  • 字符串字面值是常量,创建之后不可改变。

  • 常用创建方式:

    • String str1 = “Hello”;
    • String str2 = new String(“World”);

2.2 常用方法:

方法名描述
public char charAt(int index)根据下标获取字符
public boolean contains(String str)判断当前字符串中是否包含str
public char[] toCharArray()将字符串转换成数组。
public int indexOf(String str)查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1
public int length()返回字符串的长度
public String trim()去掉字符串前后的空格
public String toUpperCase()将小写转成大写
public boolean endsWith(String str)判断字符串是否以str结尾
public String replace(char oldChar,char newChar)将旧字符串替换成新字符串
public String[] split(String str)根据str做拆分
public String subString(int beginIndex,int endIndex)在字符串中截取出一个子字符串

2.3 split():

打断字符串 — 返回一个字符串数组

案例:将字符串打断,转换为对象,存入对象数组中(前端返回字符串数据,后端的加工)

1.创建对象类(便于访问就不加访问修饰符)

public class Student {
	String name;
	int age;	
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}	
}

2.操作

public class TestSplit {
	public static void main(String[] args) {
		// 字符串转对象的思想(重点)
		String students = "name=张三丰,age=20;name=郭襄,age=10;name=华筝,age=6";
		
		String[] stustr = students.split(";"); // 分割每一条数据,返回字符串数组
		
		Student[] stus  = new Student[stustr.length]; // 创建学生数组		
		// 打印分割的字符串数组
//		for (String string : stustr) {
//			System.out.println(string);
//		}		
		for (int i = 0; i < stustr.length; i++) {
			String s = stustr[i];  // 保存为字符串
			Student stu = new Student(); // 创建学生对象
			stu.name = s.split(",")[0].split("=")[1];  // 打断后,个姓名赋值
			stu.age = Integer.parseInt(s.split(",")[1].split("=")[1]);  // 打断后,给年龄赋值
			stus[i] = stu;  // 存到学生数组中
		}
		System.out.println(Arrays.toString(stus));  // 打印
	}
}

2.4 可变字符串

  • 概念:可在内存中创建可变的缓冲空间,存储频繁改变的字符串。
  • Java中提供了两个可变字符串类:
    • StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全。
    • StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。
    • 这两个类中方法和属性完全一致。

常用方法:

方法名属性
public StringBuilder append(String str)追加内容。
public StringBuilder insert(int dstOffset, CharSequence s)将指定 字符串插入此序列中。
public StringBuilder delete(int start, int end)移除此序列的子字符串中的字符。
public StringBuilder replace(int start, int end, String str)使用给定字符串替换此序列的子字符串中的字符。start开始位置、end结束位置。
public int length()返回长度(字符数)。

StringBuilder效率高于String。

三、正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

四、大数值运算类

4.1 BigInteger

为什么使用:

​ double是近似值存储,和金钱相关的就不符合要求了,这是就需要使用BigInteger

特点:大,构造的时候要使用字符串构造

​ 不能自动装箱拆箱,意味着不能直接赋基本数据类型,必须要new

要调用方法来运算

add,substract multiply,divide

// 大数值运算
public class TestBig {
	public static void main(String[] args) {
		String str = "";
		for (int i = 1; i <= 100; i++) {
			str +=i;
		}		
		BigInteger bi1 = new BigInteger(str);
		BigInteger bi2 = new BigInteger(str.substring(10));		
		// 大数值的运算 - 加减乘除
		System.out.println(bi1.add(bi2));
		System.out.println(bi1.subtract(bi2));
		System.out.println(bi1.multiply(bi2));
		System.out.println(bi1.divide(bi2));
	}
}

4.2 BigDecemal

和BigInteger差不多

  • 位置:java.math包中。
  • 作用:精确计算浮点数。
  • 创建方式:BigDecimal bd=new BigDecimal(“1.0”)。
import java.math.BigDecimal;
public class TestBigDecimal {
	public static void main(String[] args) {
		BigDecimal bd1 = new BigDecimal("0.09");
		BigDecimal bd2 = new BigDecimal("0.01");
		System.out.println(0.09 + 0.01);//0.09999999999999999
		System.out.println(bd1.add(bd2));//0.10
	}
}

五、日期

5.1 Data类

  • Date表示特定的瞬间,精确到毫秒。
  • Date类中的大部分方法都已经被Calendar类中的方法所取代。
  • 时间单位
    • 1秒=1000毫秒
    • 1毫秒=1000微秒
    • 1微秒=1000纳秒
Date date = new Date();
System.out.println(date.getTime());
// 运行结果: (1970-01-01 到现在的毫秒数)

5.2 SimpleDateFormat类

  • SimpleDateFormat是以与语言环境有关的方式来格式化和解析日期的类。
  • 进行格式化(日期 -> 文本)、解析(文本 -> 日期)。
字母日期或时间
y
M
d
H
m
s
S毫秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");	System.out.println(sdf.format(System.currentTimeMillis())); 
// 2022-07-09 10:27:49		

5.3 Calendar类

  • Calendar提供了获取或设置各种日历字段的方法。
  • protected Calendar() 构造方法为protected修饰,无法直接创建该对象。

常用方法:

方法说明
static Calendar getInstance()使用默认时区和区域获取日历
void set(int year,int month,int date,int hourofday,int minute,int second)设置日历的年、月、日、时、分、秒。
int get(int field)返回给定日历字段的值。字段比如年、月、日等
void setTime(Date date)用给定的Date设置此日历的时间。Date-Calendar
Date getTime()返回一个Date表示此日历的时间。Calendar-Date
void add(int field,int amount)按照日历的规则,给指定字段添加或减少时间量
long getTimeInMillis()毫秒为单位返回该日历的时间值
// Calendar
		Calendar c = Calendar.getInstance();
		System.out.println(c.getTime());// date.getTime()、System.currentTimeMillis()和c.getTime()				
		System.out.println("今天是今年的第几天:" + c.get(Calendar.DAY_OF_YEAR));
		System.out.println("今天是今年的第几周:" + c.get(Calendar.WEEK_OF_YEAR));

六、Math类

6.1 Math

Math 类提供了一序列基本数学运算和几何函数的方法。

Math类是final类,并且它的所有成员变量和成员方法都是静态的。

math的常量:

public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;

math的方法:

Math内的所有方法均为静态的。

方法描述
double sin(double a)角a(弧度)的正弦值
double cos(double a)角a(弧度)的余弦值
double pow(double a,double b)a的b的方法
double sqrt(double a)求平方根
int abs(int a)求绝对值
double ceil(double a)返回大于等于a的最小整数的double值
double floor(double a)返回小于等于a的最大整数的double值
int max(int a, int b)返回int型值a和b中的较大值
int min(int a, int b)返回int型值a和b中的较小值
int round(float a)四舍五入返回整数
double random()返回带+的double值,该值大于等于0.0且小于1.0
// 部分列子
public class TestMath {
	public static void main(String[] args) {
		// Math类 -- 数学类
		System.out.println(Math.abs(Integer.MIN_VALUE)); // 绝对值 (最小值有问题 和int的范围有关)
		System.out.println(Math.pow(2, 3));
		// 90是弧度 -- 度 = 弧度*π/180 
		System.out.println(Math.sin(90*Math.PI/180));
		System.out.println(Math.signum(0)); // 符号函数(了解)
        
        System.out.println(Math.round(1.2345));
		System.out.println(Math.random()); // (随机的) 0-1之间的小数
	}	
}

6.2 静态导入

想直接写方法名或者变量名,则可以考虑使用静态导入

语法:import static 包名.类名.*; //导入该类下的所有静态方法和常量

// 静态导入
import static java.lang.Math.random;
public class TestStaticImport {
	public static void main(String[] args) {
		// 生成0-1之间的随机数
		//使用静态导入,可以直接使用导入的方法
		System.out.println(random()); 		
	}	
}

七、Random类

生成随机数 (伪随机)

伪随机:

​ 实际上这个随机数的生成是由线性同余的算法确定,如果种子一样,生成是数据是一样的

// 无参构造 
public Random() {
    this(seedUniquifier() ^ System.nanoTime());
}
// 带参构造
public Random(long seed) {
     if (getClass() == Random.class)
         this.seed = new AtomicLong(initialScramble(seed));
     else {
         // subclass might have overriden setSeed
         this.seed = new AtomicLong();
         setSeed(seed);
     }
}
// 生成随机数:
public int nextInt(int bound) {
    if (bound <= 0)
        throw new IllegalArgumentException(BadBound);
    int r = next(31);//生成31位的随机数
    int m = bound - 1;//100-1=99
    //01111 10000  
    if ((bound & m) == 0)  // i.e., bound is a power of 2 
        r = (int)((bound * (long)r) >> 31);
    else {
        for (int u = r;
             u - (r = u % bound) + m < 0;
             u = next(31))
            ;
    }
    return r;
}

结论:随机数生成与随机数种子相关,种子可以自己设置,也可以默认使用系统时间生成

八、Runtime类

Runtime代表Java程序的运行时环境,可以通过 getRuntime 方法获取当前运行时。

​ 应用程序不能自己创建Runtime对象,可以通过Runtime的静态方法getRuntime()获得Runtime对象。

Runtime类可以访问jvm的相关信息,如处理器数量,内存信息等

public class TestRuntime {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime(); // 
		// 核数,可以在操作系统中设置
		System.out.println("处理器数量:"+rt.availableProcessors());
		// 空闲的空间-已将拿到的没有用完的空间 (剩余空间随着对象的生成要减少)
		System.out.println("空闲内存:"+rt.freeMemory());   
		// 最大空间 (最大空间跟虚拟机参数有关)
		System.out.println("分配的最大内存:"+rt.maxMemory()); 
		// 总空间 - 已经获取的 (随着对象的创建增加)
		System.out.println("已获得的内存:"+rt.totalMemory()); 
	}
}

九、System类

System系统类,主要用于获取系统的属性数据和其他操作。

常用方法:

方法名描述
static void arraycopy(…)复制数组
static long currentTimeMillis()获取当前系统时间,返回的是毫秒值
static void gc();建议JVM赶快启动垃圾回收器回收垃圾
static void exit(int status)退出jvm,如果参数是0表示正常退出jvm,非0表示异常退出jvm。
// System.setOut(System.err);// 可以设置输出类型
System.out.println("测试!"); // 输出结果为黑色字体
System.err.println("测试!"); // 输出结果为红色字体
// 获取当前系统时间 -- long
System.out.println(System.currentTimeMillis());
// 获取系统参数
Properties properties = System.getProperties();
for (Object key : properties.keySet()) {
    System.out.println(key+"-"+properties.getProperty(key.toString()));
}
运行结果:
java.specification.version-15
sun.cpu.isalist-amd64
sun.jnu.encoding-GBK
java.class.path-E:\qf2201workspace\cdjava2206\cdjava2206-\bin
java.vm.vendor-Oracle Corporation
sun.arch.data.model-64
user.variant-
java.vendor.url-https://java.oracle.com/
java.vm.specification.version-15
os.name-Windows 10
sun.java.launcher-SUN_STANDARD
user.country-CN
sun.boot.library.path-E:\java-c-sql\java\eclipse软件\eclipse\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre\bin
sun.java.command-com.qf.cd2206.myday15_class2.classt.TestSystem
jdk.debug-release
sun.cpu.endian-little
user.home-C:\Users\86138
user.language-zh
java.specification.vendor-Oracle Corporation
java.version.date-2020-10-20
java.home-E:\java-c-sql\java\eclipse软件\eclipse\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre
file.separator-\
java.vm.compressedOopsMode-Zero based
line.separator-

java.vm.specification.vendor-Oracle Corporation
java.specification.name-Java Platform API Specification
user.script-
sun.management.compiler-HotSpot 64-Bit Tiered Compilers
java.runtime.version-15.0.1+9-18
user.name-86138
path.separator-;
os.version-10.0
java.runtime.name-OpenJDK Runtime Environment
file.encoding-GBK
java.vm.name-OpenJDK 64-Bit Server VM
java.vendor.url.bug-https://bugreport.java.com/bugreport/
java.io.tmpdir-C:\Users\86138\AppData\Local\Temp\
java.version-15.0.1
user.dir-E:\qf2201workspace\cdjava2206\cdjava2206-
os.arch-amd64
java.vm.specification.name-Java Virtual Machine Specification
sun.os.patch.level-
java.library.path-E:\java-c-sql\java\eclipse软件\eclipse\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;E:/java-c-sql/java/eclipse软件/eclipse//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507/jre/bin/server;E:/java-c-sql/java/eclipse软件/eclipse//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507/jre/bin;E:\HW\VMware\bin\;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin;E:\JDKMAV\Java\jdk1.8.0_221\jre\bin;E:\JDKMAV\apache-maven-3.8.4-bin\apache-maven-3.8.4\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;E:\互传\EasyShare\x86\;E:\互传\EasyShare\x64\;E:\node\;E:\Pycharm\Graphviz\bin\;E:\Redis\;C:\Users\86138\AppData\Local\Programs\Python\Python35\Scripts\;C:\Users\86138\AppData\Local\Programs\Python\Python35\;E:\JDKMAV\Java\jdk1.8.0_221\bin;E:\Python\Scripts\;E:\Python\;C:\Users\86138\AppData\Local\Microsoft\WindowsApps;E:\Pycharm\PyCharm Community Edition 2021.2.1\bin;;E:\JDKMAV\apache-maven-3.8.4-bin\apache-maven-3.8.4\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin;C:\Users\86138\AppData\Roaming\npm;GRAPHVIZ_DOT;E:\Pycharm\Graphviz\bin;;E:\java-c-sql\java\eclipse软件\eclipse;;.
java.vm.info-mixed mode
java.vendor-Oracle Corporation
java.vm.version-15.0.1+9-18
sun.io.unicode.encoding-UnicodeLittle
java.class.version-59.0

十、 枚举

枚举(enum)全称为 enumeration, 是 JDK 1.5 中引入的新特性。

10.1 语法:

public enum Color{
    //默认添加 public static final Color
    RED,GREEN,BLUE;
}

10.2 本质:

尽管枚举看起来像是一种新的数据类型,实际上,枚举就是一种受限制的类,并且具有自己的方法。创建自己的enum类时,这个类继承自 java.lang.Enum。

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable{
    ...
}

枚举的值是不会变的 – 封装的思想

Grade.values()[0] = Grade.SENIOR;
System.out.println(Grade.values()[0]); // LOWER

创建一个枚举:

public enum Grade {  // 默认继承了Enum, 因为java是单继承的,所以枚举不能再继承了,只能实现接口
	LOWER,MIDDLE,SENIOR; // //默认添加 public static final Grade
}

反编译:

public final class Grade extends Enum
{
	public static final Grade LOWER;
	public static final Grade MIDDLE;
	public static final Grade SENIOR;
	private static final Grade ENUM$VALUES[];
    // 是一个私有的构造 - 所以枚举不能实例化对象
	private Grade(String s, int i)
	{
		super(s, i);
	}
	public static Grade[] values()
	{
		Grade agrade[];
		int i;
		Grade agrade1[];
		System.arraycopy(agrade = ENUM$VALUES, 0, agrade1 = new Grade[i = agrade.length], 0, i);
		return agrade1;
	}   
	//把一个字符串转为对应的枚举类型
	public static Grade valueOf(String s)
	{
		return (Grade)Enum.valueOf(com/qf/cd2206/myday15_class2/enu/Grade, s);
	}
	static //初始化枚举对象的
	{
		LOWER = new Grade("LOWER", 0);
		MIDDLE = new Grade("MIDDLE", 1);
		SENIOR = new Grade("SENIOR", 2);
		ENUM$VALUES = (new Grade[] {
			LOWER, MIDDLE, SENIOR
		});
	}
}

枚举的初始化过程
1、在静态代码块中new 自己的对象,构造函数使用自身的私有构造
2、枚举类会自动生成values方法,这个方法返回枚举类中所有元素的数组的拷贝。

10.3 特点:

  • 枚举就是一个受限制的类,默认继承Enum
  • 枚举的第一行必须定义该枚举类型的对象
  • 枚举类型对象默认添加: public static final 类型
  • 枚举没有继承明确类(自定义枚举类默认继承Enum,Enum默认继承Object)
  • 枚举类不能被继承
  • 枚举里可以有构造方法、成员方法、静态方法、抽象方法
  • 枚举可以实现接口
  • 枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加

10.4 优势:

  • 增强代码可读性

  • 枚举型可直接与数据库交互

  • switch语句优势

  • 编译优势

(枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类 )

  • 将常量组织起来,统一管理
  • 去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高

10.5 方法:

方法名解释
Enum.valueOf(Class enumType, String name)根据字符串找到该枚举类中的对象
public static void values()获取该枚举类对象数组
public static void valueOf(String args0)根据字符串获取该枚举类中的对象
public final String name()获取该枚举对象名字
public final Class getDeclaringClass()获取枚举对象的枚举类型相对应的Class对象
public final int hashCode()获取该枚举对象的hash值
public final int compareTo(E o)两个枚举对象进行比较
public final boolean equals(Object other)比较两个枚举对象是否相同

根据字符串获得枚举

Grade sen = Grade.valueOf("SENIOR");
System.out.println(sen); // SENIOR

10.6 案例分析 – 状态码

// 这个枚举的名字叫数据结果--编码--描述
public enum DataResult {	
	SUCCESS(0,"成功"),ERR1(1,"page not found"),ERR2(2,"server internal error");	
	Integer code; // 错误编码
	String msg;  // 错误信息	
	private DataResult(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
	}
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}	
}
// 这个枚举的名字叫数据结果--编码--描述
public enum DataResult {	
	SUCCESS(0,"成功"),ERR1(1,"page not found"),ERR2(2,"server internal error");	
	Integer code; // 错误编码
	String msg;  // 错误信息	
	private DataResult(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
	}
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
}
DataResult dr = DataResult.SUCCESS;
System.out.println(dr.name()); // SUCCESS
System.out.println(dr.msg); // 成功  应用,返回状态码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值