1、Math
(1)常用方法
类型 | 方法名 | 说明 |
---|---|---|
public static int | abs (int a) | 返回整数的绝对值 |
public static double | pow (double a,double b) | 计算a的b次幂的值 |
public static int | max (int a,int b) | 获取两个int值中的较大值 |
public static int | min (int a,int b) | 获取两个int值中的较小值 |
public static double | ceil (double a) | 返回大于或等于参数的最小整数 |
public static double | floor (double a) | 返回小于或等于参数的最大整数 |
public static int | round (float a) | 按照四舍五入返回最接近参数的int类型的值 |
public static double | random () | 返回一个[0.0,1.0)的随机值 |
2、System
(1)常用方法
①时间原点:1970年1月1日00:00:00;
②1秒=1000毫秒。
类型 | 方法名 | 说明 |
---|---|---|
public static void | exit (int status) | 终止当前运行的 Java 虚拟机,非零表示异常终止 |
public static long | currentTimeMillis () | 返回当前时间(以毫秒为单位) |
(2)应用
计算程序运行时间,比较效率。
3、Runtime
现在忽略。
4、Object
(1)public String toString()
①说明
a. 以哪种字符串的形式返回对象,至于是哪种形式,就看方法中如何定义的了。
b. Object类中返回字符串的形式为类名@对象的内存地址。
c. 一般会重写从父类中继承的toString方法,返回属性值,因为内存地址没什么用。
②Object类中的toString方法的源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
③System.out.println()方法的代码:
(2)public boolean equals(Object o)
Object类中的equals方法比较的是两个对象的地址值是否相同。
①equals方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
③String类中重写了Object类中的equals方法,比较所存的字符串是否相同。
大致原理如下:
1、首先比较引用地址
如果两个字符串对象引用地址相同(即指向同一个内存地址),则它们一定是相等的,直接返回true。
2、然后比较字符串内容
它会逐个比较每个字符是否相同,直到找到不相同的字符或者比较完所有字符。
3、对特殊情况的处理
①例如对null的处理,如果调用equals()方法的对象为null,则直接返回false;如果两个对象中有一个为null,也直接返回false。
②如果传入的对象不是String类型,返回false。
下面是简化代码:
public boolean equals(Object anObject) {
// 如果是同一个引用,直接返回true
if (this == anObject) {
return true;
}
// 如果传入的对象不是String类型,返回false
if (!(anObject instanceof String)) {
return false;
}
// 强制类型转换为String类型
String anotherString = (String)anObject;
int length = value.length;
// 比较字符串长度是否一致
if (length != anotherString.value.length) {
return false;
}
// 逐个字符比较
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (length-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
(3)protected Object clone()
①说明
把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制。
对象克隆的分类:
深克隆和浅克隆
浅克隆:
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来;
基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。
Object类默认的是浅克隆。
深克隆:
基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的。
也有第三方的克隆类去使用;一个简单的例子:
//首先有一个被克隆的对象
int[] data = {1, 2, 3, 4, 5, 6};
User u1 = new User(1, "zhangsan", "1234qwer", "1", data);
//调用第三方写的克隆方法
Gson gson = new Gson();
//将对象变成字符串的格式
String s = gson.toJson(u1);
System.out.println(s);
//克隆
User user = gson.fromJson(s, User.class);
System.out.println(user);
}
问题1:为什么需要重写子类中的clone方法才能访问?
首先Object类是java.lang包下的,子类User继承了其中的clone方法,但是与User同包下的测试类无法直接访问clone方法,重写User中的clone方法,与User同包下的测试类就可以访问到此方法了。
总结就是:重写是为了让这个方法存在于这个包,就可以同包下类能访问了。
5、Objects
①私有化构造方法,外界无法创建其对象;
②都是静态方法,可通过类名.方法名去访问。
综上,Objects是一个工具类。
6、BigInteger
可以用来表示很大很大的数,有多大都可以。
(1)如何获取一个BigInteger类型的对象?
一般有构造方法和静态方法。
①构造方法
//获取指定的大整数,参数传递的是字符串格式
//我觉得这种的应用就是int不能表示时,转为BigInteger
BigInteger num2 = new BigInteger("211111111111111111");
②静态方法
//还有一个静态方法可以用来获取大整数,但是要在long类型的取值范围内
//System.out.println(Long.MAX_VALUE);
BigInteger num = BigInteger.valueOf(9223372036854775807L);
下面是valueOf方法的源码:
还有一个特点:BigInteger对象一旦创建内部中的中的数便不可改变。没什么感觉。看到一个评论这样说的:如果是以前2个值中是一定会有一个值去存储3的,所以2个值没有一个改变成3,而是创建一个新的对象去存储3。
(2)常用方法
知道如何用就可以了。
7、BigDemical
浮点数由于存储方式的原因,有的小数部分在计算机中是无法准确存储,可能会存在精度丢失问题。
而BigDecimal能进行小数的精确运算。
(1)如何获取一个BigDecimal类型的对象?
一般有构造方法和静态方法。
①构造方法
//1、传入double类型的数据
//但这种也有可能是不精确的,所以要避免使用这种方式
BigDecimal bd1 = new BigDecimal(0.1);
//2、传入字符串类型,不会有这种问题
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal底层存储原理:数组中存的是每一个字符在ASCII码表中对应的数字。