常用类

Object类

Object类是所有类、数组、枚举类的父类,也就是说,Java允许把任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类。

hashCode方法
public native int hashCode();

返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算(即与System.identityHashCode(Object x)方法的计算结果相同)。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值。

toString方法
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

返回该对象的字符串表示,当我们使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。Object类的toString()方法返回运行时类名@十六进制hashCode值格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。

clone方法
protected native Object clone() throws CloneNotSupportedException;

自定类实现克隆的步骤如下

  1. 自定义类实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现"自我克隆",接口里没有定义任何方法。
  2. 自定义类实现自己的clone方法。
  3. 实现clone()方法时通过super.clone()调用Object实现的clone()方法来得到该对象的副本,并返回该副本。

如果只是简单的克隆,实际上只需要实现步骤1即可,因为步骤2、3也只不过是调用了父类Object的clone方法而已

Object类提供的clone机制只对对象里各实例变量进行简单复制,如果实例变量的类型是引用类型,Object的clone机制也只是简单地复制这个引用变量,这样原有对象的引用类型的实例变量与克隆对象的引用类型的实例变量依然指向内存中的同一个实例。

需要指出的是,Object类的clone方法虽然简单、易用,但它只是一种“浅克隆”,它只克隆该对象的所有Field值,不会对引用类型的Field值所引用的对象进行克隆。如果需要对对象进行“深克隆”,则需要大家自己进行递归克隆,保证所有引用类型的Field值所引用的对象都被复制了。

Java7新增的Objects类

Java为工具类的命名习惯是添加一个字母s,比如操作数组的工具类是Arrays,操作集合的工具类是Collections

public class ObjectsTest {

    static ObjectsTest obj;

    public static void main(String[] args) {
        //输出一个null对象的hashCode值,输出0
        System.out.println(Objects.hashCode(obj));
        System.out.println(Objects.toString(obj));
        System.out.println(Objects.requireNonNull(obj, "obj参数不能是null"));

    }

}

Objects工具类就是把平时代码中常用的一些方法封装起来了

下面只做相关类的介绍,并不详细介绍其中方法,只需有个印象,使用时查阅相关API即可

Math类

Java提供了基本的+、-、*、/、%等基本算术运算的运算符,但对于更复杂的数学运算,例如,三角函数、对数运算、指数运算等则无能为力。Java提供了Math工具类来完成这些复杂的运算,Math类的所有方法名都明确标识了该方法的作用,大家可自行查阅API来了解Math类各方法的说明,此处不作详解。

Java7的ThreadLocalRandom与Random

Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序显式传入一个long型整数的种子。
在这里插入图片描述

ThreadLocalRandom类是Java7新增的一个类,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有较好的性能。

以下是Random用法示例

public class RandomTest {

    public static void main(String[] args) {
        Random rand = new Random();
        System.out.println("rand.nextBoolean():" + rand.nextBoolean());
        byte[] buffer = new byte[16];
        rand.nextBytes(buffer);
        System.out.println(Arrays.toString(buffer));
        //生成0.0~1.0之间的伪随机double数
        System.out.println("rand.nextDouble():" + rand.nextDouble());
        //生成0.0~1.0之间的伪随机float数
        System.out.println("rand.nextFloat():" + rand.nextFloat());
        //生成平均值是0.0,标准差是1.0的伪高斯数
        System.out.println("rand.nextGaussian():" + rand.nextGaussian());
        //生成一个处于int整数取值范围的伪随机整数
        System.out.println("rand.nextInt():" + rand.nextInt());
        //生成0~26之间的伪随机整数
        System.out.println("rand.nextInt(26):" + rand.nextInt(26));
        //生成一个处于long整数取值范围的伪随机整数
        System.out.println("rand.nextLong():" + rand.nextLong());
    }


}

如果两个Random对象的种子相同,而且方法的调用顺序也相同,则它们会产生相同的数字序列。也就是说,Random产生的数字并不是真正随机的,而是一种伪随机。
为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间作为Random对象的种子

Random random = new Random(System.currentTimeMillis());

BigDecimal类

Java的double类型会发生精度丢失,尤其在进行算术运算时更容易发生这种情况,为了能精确表示、计算浮点数,Java提供了BigDecimal类

创建BigDecimal对象时,不要直接使用double浮点数作为参数来调用BigDecimal构造器,否则同样会发生精度丢失的问题,建议优先使用基于String的构造器

处理日期的类

Java还提供了一系列用于处理日期、时间的类,包括创建日期、时间对象,获取系统当前日期、时间等操作。

Date类

Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不是java.sql包下的Date类),Date对象既包含日期,也包含时间。Date类从JDK1.0起就开始存在了。但正因为它历史悠久,所以它的大部分构造器、方法都已经过时了,不再推荐使用了。

Calendar类

因为Date类在设计上存在一些缺陷,所以Java提供了Calendar类来更好地处理日期和时间。Canlendar是一个抽象类,它用于表示日历。

Calendar类本身是一个抽象类,它是所有日历类的模板,并提供了一些所有日历通用的方法;但它本身不能直接实例化,程序只能创建Calendar子类的实例,Java本身提供了一个GregorianCalendar类,它代表了我们通常所说的公历。

Calendar类是一个抽象类,所以不能使用构造器来创建Calendar对象。但它提供了几个静态getInstance()方法来获取Calendar对象,这些方法根据TimeZone,Locale类获取特定的Calendar,如果不指定TimeZone、Locale,则使用默认的TimeZone、Locale来创建Calendar。

TimeZone类

在地理上,地球被划分成24个时区,中国北京时间属于东八区,而程序中对时间的默认实现是以格林威治时间为标准的,这样就产生了8小时的时间差。为了让程序更加通用,可以使用TimeZone设置程序中时间所属的时区,其中TimeZone就代表了时区。

TimeZone是一个抽象类,不能调用其构造器来创建实例,但可以调用它的静态方法:getDefault()或getTimeZone()得到TimeZone实例。其中getDefault()方法用于获得运行机器上的默认时区,默认时区可以通过修改操作系统的相关配置来进行调整;getTimeZone()则根据时区ID来获取对应的时区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值