常见系统类
Java常见系统类
Object类
Object概述
Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。
Object类到底在哪里,怎么才能查看到呢?这里给大家介绍下关于JavaSE的开发文档API,当我们在下载JDK的时候,会看到有开发文档下载,这个文档需要到oracle网站下载。
在API文档中描述着相关类的详细信息,这里也需要大家掌握API的使用规则。
Object类中描述所有对象共有的方法:
常用方法介绍
- equals方法
equals方法,用于比较两个对象是否相同,它其实就是使用对象的内存地址在比较。Object类中的equals方法内部使用的就是==比较运算符。
在开发经常需要复写equals方法根据对象的特有数据进行比较。
/*
描述人这个类,并定义功能根据年龄判断是否是同龄人
由于要根据指定类的特有数据进行比较,这时只要覆盖Object中的equals方法
在方法体中根据类的特有数据进行比较
*/
class Person extends Object{
int age ;
//复写父类的equals方法,实现自己的比较方式
public boolean equals(Object obj) {
//判断当前调用equals方法的对象和传递进来的对象是否是同一个
if(this == obj){
return true;
}
//判断传递进来的对象是否是Person类型
if(!(obj instanceof Person)){
return false;
}
//将obj向下转型为Perosn引用,调用其特有数据
Person p = (Person)obj;
return this.age == p.age;
}
}
注意:在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型,在调用对象特有数据时,一定要进行类型转换,在转换之前必须进行类型判断。
2.toString方法
toString方法返回该对象的字符串表示,其实就是对象的类型+@+哈希值
由于toString方法返回的结果是内存地址,在开发中经常需要按照对象的特定数据得到相应的表现形式,因此也需要复写它。
例如
class Person extends Object{
int age ;
//根据Person类的特有数据复写toString方法
public String toString() {
return "Person [age=" + age + "]";
}
}
基本数据类型包装类
基本类型包装类概述
基本类型包装类应用场景:通过文本框获取用户输入的数字数据,可是得到的都是字符串。 如果想要对字符串中的数字进行运算,必须要将字符串转成数字。
Java中提供了相应的解决的对象。 基本数据类型对象包装类:java将基本数据类型值封装成了对象。封装成对象有什么好处?因为可以提供更多的操作基本数值的功能。
8种基本类型:byte Byte short Short int Integer long
对应的包装类:Long float Float double Double boolean Boolean char Character
其中需要注意int对应的是Integer,char对应的Character,其他6个都是基本类型首字母大写即可。
基本数据类型对象包装类特点:用于在基本数据和字符串之间进行转换。
将字符串转成基本类型
parseXXX(String s);其中XXX表示基本类型,参数为可以转成基本类型的字符串,如果字符串无法转成基本类型,将会发生 NumberFormatException
System.*out*.println(Integer.*parseInt*("123") + 2);
System.*out*.println(Integer.*parseInt*("a1", 16));
// 可以将其他进制转成十进制。
将基本数值转成字符串有3种方式
1)基本类型直接与"“相连接即可;34+”"
2)调用String的valueOf方法;String.valueOf(34);
3)调用包装类中的toString方法;Integer.toString(34);
基本类型和对象转换
基本数值---->包装对象
Integer i = **new** Integer(4);//使用构造函数函数
Integer ii = **new** Integer("4");//构造函数中可以传递一个数字字符串
Integer iii = Integer.*valueOf*(4);//使用包装类中的valueOf方法
包装对象---->基本数值
int num = i.intValue();
自动装箱拆箱
JDK1.5以后,有了一个包装类的新特性。目的简化书写,自动装箱
Integer i = 4;//自动装箱。Integer i = Integer.valueOf(4);
i = i + 5;//原理;等号右边:将i对象转成基本数值 i.intValue() + 5;//自动拆箱。加法运算后,再次装箱。
String类
StringBuffer类
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修
改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
StringBuilder类
查阅API发现还有一个StringBuilder类,它也是字符串缓冲区。
public class Test {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 100; i++) {
sb.append(i);
}
String str = sb.toString();
System.out.println(str);
}
private static void test01() {
String s = "";
for (int i = 0; i <= 100; i++) {
s += i; // 0 01 012 0123 01234
}
System.out.println(s);
}
}
它和StringBuffer的区别是什么?
如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快。
StringBuilder是线程不安全的,即就是在对容器操作的时候,不用去判断同步锁的问题,那么效率就高。并且API告诉我们优先采用StringBuilder类。
BigInteger类与BigDecimal类
BigInteger类
如果我们使用的整数范围超过了 long 型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger 就是用来表示任意大小的整数。 BigInteger 内部用一个 int[] 数组来模拟一个非常大的整数:
BigInteger bi = new BigInteger("1234567890");
System.out.println(bi.pow(5));
// 2867971860299718107233761438093672048294900000
对 BigInteger 做运算的时候,只能使用实例方法,例如,加法运算:
BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger sum = i1.add(i2); // 12345678902469135780
和 long 型整数运算比, BigInteger 不会有范围限制,但缺点是速度比较慢。
也可以把 BigInteger 转换成 long 型:
BigInteger i = new BigInteger("123456789000");
System.out.println(i.longValue()); // 123456789000
System.out.println(i.multiply(i).longValueExact());
// java.lang.ArithmeticException:BigInteger out of long range
使用 longValueExact() 方法时,如果超出了 long 型的范围,会抛出
ArithmeticException 。
BigDecimal类
和 BigInteger 类似, BigDecimal 可以表示一个任意大小且精度完全准确的浮点数。
BigDecimal bd = new BigDecimal("123.4567");
System.out.println(bd.multiply(bd)); // 15241.55677489
BigDecimal 用 scale() 表示小数位数,例如:
BigDecimal d1 = new BigDecimal("123.45");
BigDecimal d2 = new BigDecimal("123.4500");
BigDecimal d3 = new BigDecimal("1234500");
System.out.println(d1.scale()); // 2,两位小数
System.out.println(d2.scale()); // 4
System.out.println(d3.scale()); // 0
对 BigDecimal 做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断:
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("23.456789");
BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP);
// 保留10位小数并四舍五入
BigDecimal d4 = d1.divide(d2);
// 报错:ArithmeticException,因为除不尽
比较BigDecimal
在比较两个 BigDecimal 的值是否相等时,要特别注意,使用 equals() 方法不但要求两个BigDecimal 的值相等,还要求它们的 scale() 相等。
必须使用 compareTo() 方法来比较,它根据两个值的大小分别返回负数、正数和 0 ,分别表示小于、大于和等于。