文章目录
1. 字符串相关的类
1.1 String(效率最低)
代表字符串。java程序中的所有的字符串都是此类的实现实例。是一个final类(不可变的特性),字符串是常量,双引号,创建之后不可以修改。对象字符存储在value[]数组中
String在内部定义了final char[] value用于存储字符串数据。
不可变性:用string 定义一个字符串,如果把它重新定义那么他只能去新建一个值去声明,不可以覆盖掉原来的值,这就导致效率很低下。
String类型
直接定义的数据在常量池中,new的数据在堆空间中。
常量和常量的连接在常量池中,且常量池不会存在相同的内容。
只要其中有一个变量就在堆中。如果拼接的值调用intern()方法就在常量池中。
字符串–>基本数据类型–>包装类
String str1="123";
错误的:int num=(int) str1;只有子父类才可以强制类型转换
正确的:int num=Integer.parseInt(str1);
将基本数据类型和包装类转换为string
调用string重载的valueOf(xxx)
String str2=String.valueOf(num);
String str3=num+"";(str3在堆中)
转化为char数组[] :调用string 的tocharArray()方法.
str.tocharArray();
转化为String类型:调用string的构造器 String str2=new
String和byte[]数组之间的转换:调用String的getByte()方法。
1.2 StringBuffer(线程安全)
线程安全,但是效率低。
增:StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串的拼接。
删:StringBuffer delete(int start,int end)删除指定位置的内容。
改:StringBuffer replace(int start,int end,String Str)把[start,end]位置替换为str。
查:StringBuffer CharAt(int n ),查看指定位置的参数。
插:StringBuffer insert(int offset,xxx)在指定的位置插入数据。
长度: StringBuffer lenght()
遍历:1.for()+charAt() 2.toString()
在内存中声明了会创建一个长度为16的char[]数组。
当appeng和insert时,如果原来的数组长度不够可以进行扩容。
上面的方法支持方法链操作。
1.3 StringBuild(线程不安全)
线程不安全,效率高
(JDK5.0新增)形式上和StringBuffer是一样的,但是线程是安全的。
2. 日期时间相关
2.1 java.util.Data类
两个构造器的使用方法
Date date1 = new Date()://创建了对应当前时间的构造器。
Date date = new Date(1608031303732l)://创建时间毫秒的构造器
两个方法的使用
dateTime() 获取当前date对象的时间戳
toString() 获取1970-1-1到现在的毫秒数。
2.2 java.sql.date类
数据库中的date类
Date date = new Date(1608031303732l)://创建时间毫秒的构造器
只能打印出年月日。
sql.date--->util.data(多态)
Date date2 = new java.sql.Date(1608031303732l);
java.sql.Date date5=(java.sql.Date)date2;
util-->sql.date 相当于是父类的往子类的转
2.3 simpleDateFormat:格式化日期
格式化过程:format()
解析:格式化的逆过程:parse()
将现在的时间按照默认的时间格式输出出来。
必须是特定的格式,不要
//实例化(空参的方式)//使用默认的构造器
SimpleDateFormat sdf=new SimpleDateFormat();
Date date = new Date();
String format = sdf.format(date);
System.out.println(format);
通过调用构造器来输出相对应的格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
Date date1=sdf.parse(str);
线程安全的方式:
DateTimeFormat方法实现和
通过调用构造器来输出相对应的格式
2.4 Cclendar 日历类
在 Java 中,Calendar 类是用于操作日期和时间的抽象基类,提供了对日期字段(如年、月、日等)的操作和计算。Calendar
类是一个抽象类,不能直接实例化,但可以通过其子类 GregorianCalendar 等来创建实例。
日期和时间操作:
Calendar 类允许你获取和设置日期和时间的各个部分,如年、月、日、时、分、秒等。
可以进行日期的加减操作,例如增加一天、减少一个月等。
本地化支持:
Calendar 提供了本地化支持,可以根据不同的语言环境和时区获取和设置日期和时间。
字段访问:
可以通过 get(int field) 方法获取特定日期字段的值,例如 Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_MONTH 等。
日期比较:
可以使用 compareTo(Calendar anotherCalendar) 方法比较两个 Calendar 对象表示的日期。
格式化和解析:
Calendar 可以通过 DateFormat 对象进行日期和时间的格式化和解析,将日期和时间对象转换为字符串,或者从字符串解析成日期和时间对象。
import java.util.Calendar;
public class CalendarExample {
public static void main(String[] args) {
// 获取当前日期和时间的 Calendar 对象
Calendar calendar = Calendar.getInstance();
// 获取并输出当前的年、月、日、时、分、秒
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始计数,需要加1
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println("当前时间:");
System.out.println(year + "年" + month + "月" + day + "日 " + hour + "时" + minute + "分" + second + "秒");
// 增加一天并输出
calendar.add(Calendar.DAY_OF_MONTH, 1);
int nextDay = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("明天是:" + nextDay + "日");
}
}
3. 比较器
用来比较大小 实现自然排序的方式有两种: 只要在类中涉及到了比较的时候,我们就应该使用排序。
自然排序:对于自定义的类我们需要在,自定义的内部实现comparable接口,重写comparTo方法在方法体我们写比较的过程。
两种方法的返回值类型都是int类型,如果返回值类型为正数则表示大于(>),为负数则是(<)返回值是0则是(=)返回值为0时我们还可以在方法体的内部再定义一个比较其他的属性,如果类型为String和包装类的话,就可以直接用compar()方法排序,不是的话我们又要重写。
两种方式的对比,第一种是让类去实现(comparable接口,一旦一定就可以保证comparable接口实现类的对象在任何的位置都可以来比较大小),第二种是调用sort方法的时候临时去写(comparator接口只可以临时用一次)。
3.1 Comparable
自然排序:Java.lang.Comparable
String和包装类排序的话直接可以直接调用compare()方法。如果我们需要让自定义的类实现comparable接口,我们要重写compareTo(obj)方法,方法中指明如何排序。(如果价格校内共同我们可以再写一个if语句按照别的属性排序。)
Comparable 接口位于 java.lang 包中,它允许一个类的实例对象自己和另一个对象进行比较。实现了 Comparable
接口的类必须实现 compareTo(Object obj)
方法,该方法返回一个负整数、零或正整数,分别表示当前对象小于、等于或大于传入的对象
public class Person implements Comparable<Person> {
private String name;
private int age;
// Constructors, getters, and setters
@Override
public int compareTo(Person other) {
// 按照年龄进行比较
return Integer.compare(this.age, other.age);
}
}
3.2 Comparator
定制排序:Java.util.Comparator
定制排序:当元素的类型没有实现comparable接口的时候,如果是一个数组我们用Arrys.sotr(arr,new comparator)的方式直接书写方法体。里面定义的有两种类型的数据。
import java.util.Comparator;
public class PersonAgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
// 按照年龄进行比较
return Integer.compare(p1.getAge(), p2.getAge());
}
}
4. system系统类
system 类是一个包含了一些标准输入、输出和错误输出方法,以及系统属性和环境的 final 类。它位于 java.lang 包中,因此无需导入即可直接使用。
标准输入输出:
4.1 常用API
System.out:标准输出流,通常用于向控制台打印输出信息。
System.out.println("Hello, World!");
System.err:标准错误流,用于输出错误信息。
System.err.println("Error: something went wrong");
System.in:标准输入流,通常用于从控制台读取输入。
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = scanner.nextLine();
系统属性:
System.getProperties():获取当前系统的属性集合,返回一个 Properties 对象。
System.getProperty(String key):获取指定系统属性的值。
String javaVersion = System.getProperty("java.version");
环境变量:
System.getenv(String name):获取指定环境变量的值。
System.getenv():获取所有环境变量的集合。
String path = System.getenv("PATH");
内存管理:
System.gc():请求 JVM 进行垃圾回收。
System.exit(int status):终止当前运行的 Java 虚拟机,参数为退出状态码。
if (condition) {
System.exit(0); // 正常退出
} else {
System.exit(1); // 异常退出
}
当前时间:
System.currentTimeMillis():返回当前时间的毫秒数,通常用于性能测试和计时。
long currentTimeMillis = System.currentTimeMillis();
数组复制:
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将数组从指定源数组复制到目标数组。
int[] srcArray = {1, 2, 3, 4, 5};
int[] destArray = new int[5];
System.arraycopy(srcArray, 0, destArray, 0, srcArray.length);
4.2 注意事项
- System 类中的大多数方法是静态的,因此可以直接通过类名调用,如System.out.println()。
- System.exit(int status) 方法会终止当前程序的执行,注意在使用时确保合理的退出条件和状态码。
- System.gc() 方法只是请求 JVM 进行垃圾回收,并不能保证立即执行,因此不应该依赖它来进行程序逻辑的管理。
5. Math函数类
在 Java 中,Math 类是一个包含了数学运算方法的工具类,位于 java.lang
包中,因此无需额外导入即可使用。它提供了常见的数学函数和常量,可以直接在程序中进行数学计算。
常数
Math.PI:表示圆周率 π 的常数值。
Math.E:表示自然对数的底数 e 的常数值。
基本数学运算
Math.abs(x):返回 x 的绝对值。
Math.max(x, y):返回 x 和 y 中的较大值。
Math.min(x, y):返回 x 和 y 中的较小值。
Math.sqrt(x):返回 x 的平方根。
Math.cbrt(x):返回 x 的立方根。
Math.pow(x, y):返回 x 的 y 次幂。
Math.exp(x):返回 e 的 x 次幂。
Math.log(x):返回 x 的自然对数(以 e 为底)。
Math.log10(x):返回 x 的以 10 为底的对数。
Math.sin(x)、Math.cos(x)、Math.tan(x):返回 x 的正弦、余弦和正切值(x 的单位是弧度)。
Math.asin(x)、Math.acos(x)、Math.atan(x):返回 x 的反正弦、反余弦和反正切值(结果的单位是弧度)。
Math.toDegrees(x):将角度 x 从弧度转换为度数。
Math.toRadians(x):将角度 x 从度数转换为弧度。
随机数
Math.random():返回一个大于等于 0.0 且小于 1.0 的随机浮点数。
其他
Math.floor(x):返回不大于 x 的最大整数(向下取整)。
Math.ceil(x):返回不小于 x 的最小整数(向上取整)。
Math.round(x):返回最接近 x 的 long 类型整数,四舍五入。
Math.toIntExact(x):将 long 类型转换为 int 类型,如果溢出则抛出 ArithmeticException 异常。
6. biginteger 和 bigdecimal
BigInteger 和 BigDecimal 是 Java 中用于处理大整数和大浮点数的类,它们位于 java.math
包中,主要用于在需要精确计算和处理超过 long 或 double 范围的数值时使用。
6.1 BigInteger 类
BigInteger 类用于表示任意精度的整数,可以处理比 long 类型更大范围的整数值,同时提供了基本的算术运算和比较操作。
主要特点和用法:
- 可以表示任意大的整数值,不受 int 或 long 类型的范围限制。
- 提供了基本的算术运算方法,如加法、减法、乘法、除法和取模运算。
- 不可变类,所有的运算操作都会返回一个新的 BigInteger 实例。
import java.math.BigInteger;
public class BigIntegerExample {
public static void main(String[] args) {
BigInteger num1 = new BigInteger("123456789012345678901234567890");
BigInteger num2 = new BigInteger("987654321098765432109876543210");
BigInteger sum = num1.add(num2);
BigInteger difference = num1.subtract(num2);
BigInteger product = num1.multiply(num2);
BigInteger quotient = num1.divide(num2);
BigInteger remainder = num1.remainder(num2);
System.out.println("Sum: " + sum);
System.out.println("Difference: " + difference);
System.out.println("Product: " + product);
System.out.println("Quotient: " + quotient);
System.out.println("Remainder: " + remainder);
}
}
6.2 BigDecimal 类
BigDecimal 类用于表示任意精度的浮点数,提供了高精度的十进制运算,适用于金融和精确计算场景。
- 可以处理精确的十进制运算,避免了浮点数计算中的舍入误差。
- 提供了基本的算术运算方法,如加法、减法、乘法、除法和取模运算。
- 可以设置精度和舍入模式,以控制计算的精度和舍入规则。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("1234567890.12345678901234567890");
BigDecimal num2 = new BigDecimal("9876543210.98765432109876543210");
BigDecimal sum = num1.add(num2);
BigDecimal difference = num1.subtract(num2);
BigDecimal product = num1.multiply(num2);
BigDecimal quotient = num1.divide(num2, 20, RoundingMode.HALF_UP); // 保留20位小数,四舍五入
System.out.println("Sum: " + sum);
System.out.println("Difference: " + difference);
System.out.println("Product: " + product);
System.out.println("Quotient: " + quotient);
}
}