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

被折叠的 条评论
为什么被折叠?



