常用类库
如果直接使用equals对两个对象s1和s2进行比较就会出现bug,比如s1是空值就会报错,控制台显示空指针异常
为什么会出现这种问题呢?是这样的你对象是空的,而你拿空的东西调用方法,它是没有方法的,它是空的。
Java代码:
package demo1;
/**
* Objects的使用
*/
public class Demo1_1{
public static void main(String[] args) {
String s1 = null; //对象的引用
String s2 = "121";
String s3 = "1111";
//s1与s2进行比较,由于s1是空值就会报错出现空指针问题
System.out.println(s1.equals(s2));
// System.out.println(s2.equals(s3));
}
}
如图:
如何解决呢?对其做判断就可以解决了
就是使用系统提供的Objects就不会出现在比较时出现空指针异常问题了。
package demo1;
import java.io.ObjectStreamClass;
import java.util.Objects;
public class Demo1_2 {
public static void main(String[] args) {
Person p1 = null;
Person p2 = new Person();
//如果使用这种方法进行判断,在p1为空值时就会报错
//System.out.println(p1.equals(p2));
//如果使用系统提供的Objects就不会出现异常
System.out.println(Objects.equals(p1,p2));
}
}
如图就不会出现异常,提示的是false
那Objects当中是如何做到的呢?
就对其进行判断,如下代码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
它是对其判断
第一个对象a不能是空,如果是空的就会return返回。
checkFromIndexSize(int fromIndex, int size, int length)
这方法是用来判断下标用的,不过这种方法使用没必要使用的,自己写一个判断的方法就可以使用没必要这么麻烦的。
(
Object obj)
专门用来判断一个对象是不是空的。
部分java代码:
public static void main(String[] args) {
Person p1 = null;
//用来判断对象p1是不是空的
System.out.println(Objects.isNull(p1));
}
如图,判断为true,是真的,即p1为空的
再来看看更高级的
部分代码:
public static void main(String[] args) {
Person p1 = null;
//用来判断对象p1是不是空的
//System.out.println(Objects.isNull(p1));
//这个比上面的判断更高级
System.out.println(Objects.requireNonNull(p1));
}
如图,是直接返回异常
如何它是如何做到的呢?
是系统Objects中的方法对其判断的
如下代码:
public static boolean isNull(Object obj) {
return obj == null;
}
就是这么小小一行代码,就是判断对象是不是为空的。
还有对不是空的进行判断
public static boolean nonNull(Object obj) {
return obj != null;
}
还有一个判断更高级
如下代码:
public static T requireNonNull(T obj)
{
if (obj == null) //如果是空的,则直接走异常
throw new NullPointerException();
return obj;//否则直接返回
}
这些是常用的操作,只不过是整理到Objects工具中,来提供我们方便使用。
下面还有我对系统中Objects工具使用的一些整理
public final class Objects
extends Object
此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括null或null方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。
静态方法如checkIndex(int, int) , checkFromToIndex(int, int, int) ,和checkFromIndexSize(int, int, int)提供用于如果对应于索引和子范围的值超出边界的检查的便利性。 这些静态方法的变体支持定义运行时异常以及相应的异常详细消息,这些消息在值超出范围时抛出。 此类方法接受功能接口参数,即BiFunction实例,它将超出范围的值映射到运行时异常。 将这些方法与作为lambda表达式,方法引用或捕获值的类的参数结合使用时应小心。 在这种情况下,与功能接口分配相关的捕获成本可能超过检查边界的成本。
1.7
变量和类型 |
方法 |
描述 |
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 |
compare(T a, T b, Comparator super T> c) |
如果参数相同则返回0,否则返回 c.compare(a, b) 。 |
static boolean |
deepEquals(Object a, Object b) |
返回 true如果参数是深层相等,彼此 false其他。 |
static boolean |
equals(Object a, Object b) |
返回 true如果参数相等,彼此 false其他。 |
static int |
hash(Object... values) |
为一系列输入值生成哈希码。 |
static int |
hashCode(Object o) |
返回非的哈希码 null参数,0为 null的论点。 |
static boolean |
isNull(Object obj) |
返回 true如果提供的参考是 null ,否则返回 false 。 |
static boolean |
nonNull(Object obj) |
返回 true如果提供的参考是非 null否则返回 false 。 |
static |
requireNonNull(T obj) |
检查指定的对象引用是否不是 null 。 |
static |
requireNonNull(T obj, String message) |
检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。 |
static |
requireNonNull(T obj, Supplier |
检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。 |
static |
requireNonNullElse(T obj, T defaultObj) |
如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。 |
static |
requireNonNullElseGet(T obj, Supplier extends T> supplier) |
如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。 |
static String |
toString(Object o) |
返回调用的结果 toString对于非 null参数, "null"为 null的说法。 |
static String |
toString(Object o, String nullDefault) |
如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。 |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait