每日面试题1(String,&和&&,==,equals和hashcode)

String类的常用方法有哪些?

String 类的常用方法:

  • equals:字符串是否相同
  • equalsIgnoreCase:忽略大小写后字符串是否相同
  • compareTo:根据字符串中每个字符的Unicode编码进行比较
  • compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较
  • indexOf:目标字符或字符串在源字符串中位置下标
  • lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标
  • valueOf:其他类型转字符串
  • charAt:获取指定下标位置的字符
  • codePointAt:指定下标的字符的Unicode编码
  • concat:追加字符串到当前字符串
  • isEmpty:字符串长度是否为0
  • contains:是否包含目标字符串
  • startsWith:是否以目标字符串开头
  • endsWith:是否以目标字符串结束
  • format:格式化字符串
  • getBytes:获取字符串的字节数组
  • getChars:获取字符串的指定长度字符数组
  • toCharArray:获取字符串的字符数组
  • join:以某字符串,连接某字符串数组
  • length:字符串字符数
  • matches:字符串是否匹配正则表达式
  • replace:字符串替换
  • replaceAll:带正则字符串替换
  • replaceFirst:替换第一个出现的目标字符串
  • split:以某正则表达式分割字符串
  • substring:截取字符串
  • toLowerCase:字符串转小写
  • toUpperCase:字符串转大写
  • trim:去字符串首尾空格

&和&&的区别

这两者都是表示逻辑与,只有当两边都是true时,返回true,只要有一个false则结果返回false。

&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于 if(str != null
&& !str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现 NullPointerException
如果将&&改为&,则会抛出 NullPointerException 异常。 If(x33 & ++y>0) y 会增长, If(x33 && ++y>0)
不会增长
&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时, &表示按位与操作,我们通常
使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如, 0x31 & 0x0f 的结果为 0x01


==和equals的关系

一、理解”==“的含义

在java中,主要有两个作用。

1、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。

2、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。

OK。到这就注意了,你会发现,我在举引用的例子的时候,使用的是User对象,而不是String。别着急接着往下看。

二、理解equals的含义

先看看他的源码,equals方法是在Object中就有。注意了这里的源码是Object里面的equals。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2OkgMuC-1597722708173)(231.assets/aec379310a55b319e85eeae1ff2f5d23cefc170e.jpeg)]

从这个源码中你会发现,比较的是当前对象的引用和obj的引用是否相同,也就是说比较的默认就是地址。还记的在上面我们使用的是User而不是String嘛?在这里==比较的是引用的地址,equals也是比较的是引用的地址,所以他们的效果在这里是一样的。

现在你会发现好像equals的作用和==没什么区别呀,那String类型那些乱七八糟的东西是什么呢?继续往下看马上揭晓。

三、重写equals

1、String中equals方法

看到这个标题相信你已经能找到答案里,Object对象里面的==和equals没有什么区别,这样一看equals方法存在的意义真的不大,不过后来String在Object的基础之上重写了equals,于是功能被大大的改变了。如何重写的呢?我们去String的源码中找寻答案:

在这里插入图片描述

从上面的源码,我们能够获取到的信息是:String中的equals方法其实比较的是字符串的内容是否一样。也就是说如果像String、Date这些重写equals的类,你可要小心了。使用的时候会和Object的不一样。

2、测试String

看看下面的代码:

String str1 = "Hello";
String str2 = new String("Hello");
String str3 = str2;
System.out.println(str1 ==str2 );
System.out.println(str1 ==str3 );
System.out.println(str2 ==str3 );
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str2.equals(str3));

测试结果

false
true
true

在上面的代码中,定义了三个字符串,分别使用==和equals去比较。

  1. String str1 = "Hello"会在堆区存放一个字符串对象
  2. String str2 = new String(“Hello”)会在堆区再次存放一个字符串对象
  3. String str3 = str2这时候Str3和Str2是两个不同的引用,但是指向同一个对象。

我们由此的比较:

  1. str1 == str2嘛?意思是地址指向的是同一块地方吗?很明显不一样。
  2. str1 == str3嘛?意思是地址指向的是同一块地方吗?很明显不一样。
  3. str2 == str3嘛?意思是地址指向的是同一块地方吗?很明显内容一样,所以为true。
  4. str1.equals(str2)嘛?意思是地址指向的内容一样嘛?一样。
  5. str1.equals(str3)嘛?意思是地址指向的内容一样嘛?一样。
  6. str2.equals(str3)嘛?意思是地址指向的内容一样嘛?一样。

OK。现在不知道你能理解嘛?

4、总结

(1)、基础类型比较

使用==比较值是否相等。

(2)、引用类型比较

①重写了equals方法,比如String。

第一种情况:使用==比较的是String的引用是否指向了同一块内存

第二种情况:使用equals比较的是String的引用的对象内用是否相等。

②没有重写equals方法,比如User等自定义类

==和equals比较的都是引用是否指向了同一块内存。


hashCode() 和 equals()

1.hashCode介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。

举个例子

public class DemoTest { 
    public static void main(String[] args) { 
        Object obj = new Object();
        System.out.println(obj.hashCode());
    }
}

通过调用hashCode()方法获取对象的hash值。

02、equals介绍

equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。

举个例子

public class DemoTest { 
    public static void main(String[] args) { 
        Object obj = new Object(); 
        System.out.println(obj.equals(obj)); 
    }
}

hashCode() 和 equals() 有什么关系?

接下面,我们讨论另外一个话题。网上很多文章将 hashCode() 和 equals 关联起来,有的讲的不透彻,有误导读者的嫌疑。在这里,我们梳理了一下 “hashCode() 和 equals()的关系”。我们以“类的用途”来将“hashCode() 和 equals()的关系”分2种情况来说明。

两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

  • 两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
  • 两个对象==相等,则其hashcode一定相等,反之不一定成立。**

hashCode 的常规协定:

  1. 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

  2. 两个对象的equals()相等,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

  3. 两个对象的equals()不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,为不相等的对象生成不同整数结果可以提高哈希表的性能。

  4. 我们可以比较两个对象的hashcode是否一致,如果不一致我们认为不是一个对象,如果一致我们再用equals去比

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值