深入了解Java核心类库--Objects类

目录
  • 1 Objects
    • 1.1 Objects方法
    • 1.2 Objects常用方法
      • 1.2.1 equals(Object a, Object b)
      • 1.2.2 isNull(Object obj)
      • 1.2.3 nonNull(Object obj)
      • 1.2.4 requireNonNull(T obj)
    • 1.3 Objects源码
  • 2 区别于Object
    • 2.1 Object构造方法
    • 2.2 Object其他方法
      • 2.2.1 equals(Object obj)
      • 2.2.2 toString()
    • 2.3 Object源码
  • 总结

1 Objects

1.1 Objects方法

工具类,常用于检查操作

返回值 方法名 作用
static int checkFromIndexSize​(int fromIndex, int size, int length) 检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。
static int checkFromToIndex​(int fromIndex, int toIndex, int length) 检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内
static int checkIndex​(int index, int length) 检查子范围index是否在 [0,length)范围界限内
static int compare(T a, T b, Comparator<? super T> c) 如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果
static boolean deepEquals(Object a, Object b) 对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数)
static boolean equals(Object a, Object b) 对比a,b参数是否相等
static int hash(Object… values) 为输入值序列生成哈希码
static int hashCode(Object o) 非空返回哈希码,null则抛出NullPointerException
static boolean isNull(Object obj) obj参数为null返回true
static boolean nonNull(Object obj) obj参数不为null返回true
static T requireNonNull(T obj) 检查指定的对象引用不是 null,为null则抛出NullPointerException
static T requireNonNull(T obj, String message) 检查指定的对象引用不是null,否则抛出自定义的NullPointerException
static T requireNonNull​(T obj, Supplier messageSupplier) 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static T requireNonNullElse​(T obj, T defaultObj) 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static T requireNonNullElseGet​(T obj, Supplier<? extends T> supplier) 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static String toString(Object o) 返回对象的字符串表示形式
static String toString(Object o, String nullDefault) 如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数

1.2 Objects常用方法

1.2.1 equals(Object a, Object b)

equals(Object a, Object b)源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}

1.2.2 isNull(Object obj)

isNull(Object obj)源码:
public static boolean isNull(Object obj) {
return obj == null;
}

1.2.3 nonNull(Object obj)

nonNull(Object obj)源码:
public static boolean nonNull(Object obj) {
return obj != null;
}

1.2.4 requireNonNull(T obj)

requireNonNull(T obj)源码:
public static T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}

1.3 Objects源码

package java.util;
import jdk.internal.util.Preconditions;
import jdk.internal.vm.annotation.ForceInline;
import java.util.function.Supplier;
public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
    public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }
    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }
    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }
    public static String toString(Object o) {
        return String.valueOf(o);
    }
    public static String toString(Object o, String nullDefault) {
        return (o != null) ? o.toString() : nullDefault;
    }
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return (a == b) ? 0 :  c.compare(a, b);
    }
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }
    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }
    public static boolean isNull(Object obj) {
        return obj == null;
    }
    public static boolean nonNull(Object obj) {
        return obj != null;
    }
    public static <T> T requireNonNullElse(T obj, T defaultObj) {
        return (obj != null) ? obj : requireNonNull(defaultObj, "defaultObj");
    }
    public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) {
        return (obj != null) ? obj
                : requireNonNull(requireNonNull(supplier, "supplier").get(), "supplier.get()");
    }
    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        if (obj == null)
            throw new NullPointerException(messageSupplier == null ?
                                           null : messageSupplier.get());
        return obj;
    }
    @ForceInline
    public static
    int checkIndex(int index, int length) {
        return Preconditions.checkIndex(index, length, null);
    }
    public static int checkFromToIndex(int fromIndex, int toIndex, int length) {
        return Preconditions.checkFromToIndex(fromIndex, toIndex, length, null);
    }
    public static int checkFromIndexSize(int fromIndex, int size, int length) {
        return Preconditions.checkFromIndexSize(fromIndex, size, length, null);
    }
}

2 区别于Object

2.1 Object构造方法

public Object()

  • Object类是基类,是所有类的父类(基类)
  • 如果一个类没有明确的继承某一个具体的类,则将默认继承Object类

例如我们定义一个类:

public class Person{
}
其实它被使用时 是这样的:
public class Person extends Object{
}

  • object的多态:使用Object可以接收任意的引用数据类型

例:

public static void main(String[] args){
	String text = "123";
	say(text);
	int a = 10;
	say(a);
	say("123");
}
public static void say(Object o){//多态的体现
	System.out.println(o);
}

2.2 Object其他方法

返回值 方法名 作用
static int checkFromIndexSize​(int fromIndex, int size, int length) 检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。
static int checkFromToIndex​(int fromIndex, int toIndex, int length) 检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内
static int checkIndex​(int index, int length) 检查子范围index是否在 [0,length)范围界限内
static int compare(T a, T b, Comparator<? super T> c) 如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果
static boolean deepEquals(Object a, Object b) 对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数)
static boolean equals(Object a, Object b) 对比a,b参数是否相等
static int hash(Object… values) 为输入值序列生成哈希码
static int hashCode(Object o) 非空返回哈希码,null则抛出NullPointerException
static boolean isNull(Object obj) obj参数为null返回true
static boolean nonNull(Object obj) obj参数不为null返回true
static T requireNonNull(T obj) 检查指定的对象引用不是 null,为null则抛出NullPointerException
static T requireNonNull(T obj, String message) 检查指定的对象引用不是null,否则抛出自定义的NullPointerException
static T requireNonNull​(T obj, Supplier messageSupplier) 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static T requireNonNullElse​(T obj, T defaultObj) 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static T requireNonNullElseGet​(T obj, Supplier<? extends T> supplier) 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static String toString(Object o) 返回对象的字符串表示形式
static String toString(Object o, String nullDefault) 如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数

2.2.1 equals(Object obj)

equals(Object obj)源码:
public boolean equals(Object obj) {
return (this == obj);
}

  • equals方法在非null对象引用上实现等价关系
  • 等于
    • 对于任何非空引用值x和y,当且仅当x和y引用同一对象( x == y具有值true )时,此方法返回true
  • ==比的是内存地址
  • 请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。
public static void main(String[] args) {
        Person p = new Person(1234,"张三");
        Person e = new Person(2345,"李四");
        System.out.println("p:"+p.hashCode());//p:1239731077
        System.out.println("e:"+e.hashCode());//e:357863579
        System.out.println(p.equals(e));//false
        e=p;//此时指向相同的内存地址
        System.out.println("e:"+e.hashCode());//e:1239731077
        System.out.println(p.equals(e));//true
}

输出结果:
p:1239731077
e:357863579
false
e:1239731077
true

equals方法重写时的五个特性:

自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)返回true 。
传递性 :对于任何非空引用值x ,y和z ,如果x.equals(y)回报true并且y.equals(z)返回true,x.equals(z)应该返回true 。
一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,前提是未修改对象上的equals比较中使用的信息。
非空性 :对于任何非空的参考值x , x.equals(null)应该返回false 。

2.2.2 toString()

toString()源码
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}

默认为字符串,通常返回一个“文本表示”此对象的字符串,返回对象的内存地址(对象实例的类名称@对象的哈希码的无符号十六进制,即:getClass().getName() + ‘@' + Integer.toHexString(hashCode()))

public static void main(String[] args) {
        Person p = new Person(1234,"张三");
        Person e = new Person(2345,"李四");
        System.out.println("e.getClass():"+e.getClass());
        System.out.println("e.hashCode():"+e.hashCode());
        System.out.println("e.toString():"+e.toString());
}

输出结果:
e.getClass():class com.company.demo.Person
e.hashCode():114132791
e.toString():com.company.demo.Person@6cd8737

  • 建议重写Object中的toString方法

2.3 Object源码

package java.lang;
import jdk.internal.HotSpotIntrinsicCandidate;
public class Object {
    private static native void registerNatives();
    static {
        registerNatives();
    }
    @HotSpotIntrinsicCandidate
    public Object() {}
    @HotSpotIntrinsicCandidate
    public final native Class<?> getClass();
    @HotSpotIntrinsicCandidate
    public native int hashCode();
    public boolean equals(Object obj) {
        return (this == obj);
    }
    @HotSpotIntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    @HotSpotIntrinsicCandidate
    public final native void notify();
    @HotSpotIntrinsicCandidate
    public final native void notifyAll();
    public final void wait() throws InterruptedException {
        wait(0L);
    }
    public final native void wait(long timeoutMillis) throws InterruptedException;
    public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
        if (timeoutMillis < 0) {
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
        if (nanos > 0) {
            timeoutMillis++;
        }
        wait(timeoutMillis);
    }
    protected void finalize() throws Throwable { }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java Objects工具类原理及用法详解

    Objects工具类 jdk 1.7引进的工具类,都是静态调用的方法,jdk 1.8新增了部分方法 重点方法 equals 用于字符串和包装对象的比较,先比较内存地址,再比较值 deepEquals 数组的比较,先比较内存地址,再比较值,如String.char.byte.int数组,或者包装类型Integer等数组 hashCode 返回对象的hashCode,若传入的为null,则返回0 hash 传入可变参数的所有值得hashCode的总和,底层用Arrays.hashCode 可变参数

  • java 中Object与Objects的区别在哪里

    现在在从基础看起,巩固一下基础,在网上看到了很多解释,但是没有一语到位,按照自己的理解写一篇,方便自己之后查阅. Object java.lang.Object java.lang:里面的类是利用java编程语言进行程序设计的基础类 在JavaAPI中是这样写的:是类层次结构的根类.类Object是每个类的超类.Objects类也不例外,是Object类的子类.Object类的一些方法. Objects Objects类继承自Object类,Objects类从jdk7以后开始有的 public

  • 浅谈Django QuerySet对象(模型.objects)的常用方法

    准备工作: 新建一个项目,在项目中新家一个app,名字自取.将app添加值settings.py中,然后配置settings连接数据库. 在app中的models中新建模型: from django.db import models # Create your models here. class Author(models.Model): """作者模型""" name = models.CharField(max_length=100) ag

  • 重写django的model下的objects模型管理器方式

    django自定义管理器和model的继承 在我写代码时建立的很多数据库需要一些共同的字段,比如is_active, create_time这些字段,所以可以建立一个基类model 模型的继承 我们可以充分利用oop特性,建立一个基类model,以后所有的model都继承这个类, 就不用在每个类都额外添加字段 class BaseModel(models.Model): is_active = models.BooleanField(default=True) create_time = mod

  • 解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects

    TypeError: cannot concatenate 'str' and 'int' objects print str + int 的时候就会这样了 python + 作为连接符的时候,不会自动给你把int转换成str 补充知识:TypeError: cannot concatenate 'str' and 'list' objects和Python读取和保存图片 运行程序时报错,然后我将list转化为str就好了. 利用''.join(list) 如果需要用逗号隔开,如1,2,3,4则

  • 深入了解Java核心类库--Objects类

    目录 1 Objects 1.1 Objects方法 1.2 Objects常用方法 1.2.1 equals(Object a, Object b) 1.2.2 isNull(Object obj) 1.2.3 nonNull(Object obj) 1.2.4 requireNonNull(T obj) 1.3 Objects源码 2 区别于Object 2.1 Object构造方法 2.2 Object其他方法 2.2.1 equals(Object obj) 2.2.2 toString

  • 深入了解Java核心类库--Arrays类

    目录 Java常用类库Arrays 一.常用方法 1.1 toString 1.2 Sort 1.2.1 sort​(T[] a, int fromIndex, int toIndex) 1.2.2 Sort(T[] a) 1.2.3 其它 1.3 copyOf 1.4 mismatch 1.5 binarySearch 1.5.1 binarySearch​(T[] a, int fromIndex, int toIndex, T key) 1.5.2 binarySearch​(T[] a,

  • 深入了解Java核心类库--Math类

    目录 Java常用类库Math 一.Field Summary 二.Method Summary 2.1 常用方法 2.1.1 部分方法源码 2.2 算数运算 2.3 三角函数 2.4 其他不常用方法 总结 Java常用类库Math 类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数 一.Field Summary Modifier and Type Field Description static double E 自然对数的基数 static double PI

  • 深入了解Java核心类库--String类

    目录 一. 简介 零碎知识点 字符串常量池 堆在逻辑上的划分 二. 创建对象 2.1.1 直接引用常量区 2.1.2 使用构造方法 2.1.3 两种实例化方法的区别 三.常用方法 总结 一. 简介 零碎知识点 extends Object implements serializable,Comparable< String >,charSequence String类表示字符串,所有字符串文字都是此类的对象 字符串是不变的,值在创建后无法更改 对象一旦声明则不可改变,改变的只是地址,原来的字符

  • 深入了解Java核心类库--BigDecimal和System类

    目录 BigDecimal 类 一. 概述 常用字段 常用构造方法 常用方法 System类 三个成员变量 arraycopy​(Object src, int srcPos, Object dest, int destPos, int length) 总结 BigDecimal 类 一. 概述 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算. 开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作. BigDec

  • 深入了解Java核心类库--Date,Calendar,DateFormat类

    目录 一.Date 1.1 构造方法 1.1.1 Date() 1.1.2 Date(long date) 1.2 常用方法 1.3 其他方法 二.Calendar(抽象) 2.1 获取时间 get() 2.2 设置时间 2.3 时间计算 2.4 其它方法 三.DateFormat(抽象) 3.1 构造方法 总结 一.Date Date类表示特定的时刻,精度为毫秒 Date的两个附加功能:Calendar.DateFormat Calendar类应该用于在日期和时间字段之间进行转换 DateFo

  • 深入了解Java核心类库--泛型类

    目录 1.1 泛型的使用 1.1.1 泛型类 1.1.2 泛型接口 1.1.3 泛型方法 1.1.4 tips 1.2 泛型限制类型 1.3 通配符? 1.3.1 上界限定 1.3.2 下届限定 1.3.3 无限制 1.4 泛型的作用 总结 1.1 泛型的使用 泛型:参数化模型(不确定,后续使用时指定类型) 1.1.1 泛型类 1.1.2 泛型接口 实现接口时,可以选择或不选择指定泛型类型 public interface IntercaceName<T>{ T getData(); } ①指

  • java类加载器和类反射使用示例

    一.一个命令对应一个进程. 当我们启动一个Java程序,即启动一个main方法时,都将启动一个Java虚拟机进程,不管这个进程有多么复杂.而不同的JVM进程之间是不会相互影响的.这也就是为什么说,Java程序只有一个入口--main方法,让虚拟机调用.而两个mian方法,对应的是2个JVM进程,启动的是两个不同的类加载器,操作的实际上是不同的类.故而不会互相影响. 二.类加载. 当我们使用一个类,如果这个类还未加载到内存中,系统会通过加载.连接.初始化对类进行初始化. 1.类加载:指的是将类的c

  • Java常用类库Apache Commons工具类说明及使用实例详解

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

  • 深入理解JAVA基础类库中对象Object类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类. 例如: public class Dog{ ...... } 等价于: public class Dog extends Object { ...... } Object常用方法 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在

随机推荐