首先声明,有晕车经历的司机请自备药物,String也可能让你怀疑人生!

第一道 开胃菜

请听题!第一道题:

        String hello="hello world!";

        String hello1=new String("hello world!");
System.out.println(hello==hello1);
System.out.println(hello.equals(hello1));

提示: ==是比较两个对象引用是否正好引用到了相同的对象。

那么公布答案吧

false
true

旁白:

  1. new String是新建对象,和字符串常量对象不是同一个。
  2. equal是比较值

肯定不过瘾吧,那就再来。

第二道 汤

        String hello="hello world!";
String hello2="hello world!";
System.out.println(hello==hello2);
System.out.println(hello.equals(hello2));

扫地僧看不下去了

true
true

旁边:

两个String类型的常量表达式,如果标明的是相同的字符序列,那么它们就用相同的对象引用来表示。

第三道 副菜

        String hello="hello world!";
String append="hello"+" world!";
System.out.println(hello==append);
System.out.println(hello.equals(append));

那就公布答案

true
true

旁边:

两个String类型的常量表达式,如果标明的是相同的字符序列,那么它们就用相同的对象引用来表示。

第四道 主菜

        final String pig = "length: 10";
final String dog = "length: " + pig.length();
System.out.println(pig==dog);
System.out.println(pig.equals(dog));

不敢说了,还是公布答案吧

false
true

官方资料中有这么一段话:

Strings concatenated from constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
Strings computed by concatenation at run time are newly created and therefore distinct.

翻译一下:

>通过常量表达式运算得到的字符串是在编译时计算得出的,并且之后会将其当作字符串常量对待.

>在运行时通过连接运算得到的字符串是新创建的,因此要区别对待。

看黑色重点标注。

第五道 蔬菜类菜肴

        final String pig = "length: 10";
final String dog = ("length: " + pig.length()).intern();
System.out.println(pig==dog);
System.out.println(pig.equals(dog));

先看答案吧

true
true

旁边:

可以通过显示的限定运算得到的字符串为字符串常量,String.intern方法可以"限定"

第六道 甜品

        final String pig = "length: 10";
final String dog = "length: " + pig.length();
System.out. println("Animals are equal: "+ pig == dog);
System.out.println("Animals are equal: "+ pig .equals(dog));

大家已经迫不及待了,先看答案

false
Animals are equal: true

如果你想一下操作符的优先级就明白了,“+”优先级高于“==”

第七道 咖啡、茶

看大家晕车严重,那就不出题目了

通过上面的教训,在比较对象引用时,应该优先使用equals 方法而不是 == 操作符,除非需要比较的是对象的标识而不是对象的值。

参考资料

【1】https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.10.5

【2】https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

老司机也晕车--java字符串String晕车之旅的更多相关文章

  1. Java字符串String

    Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...

  2. Java字符串String 集合的迭代器

    Java字符串String 我们知道Java的字符窜是Immutable(不可变)的,一旦创建就不能更改其内容了:平常我们对字符串的操作是最多的,其实对字符串的操作,返回的字符串都是新建的字符串对象, ...

  3. java 字符串String

    在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象的方法: 只要是双引号标 ...

  4. Java 字符串 String

    什么是Java中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对 ...

  5. Java字符串String类操作方法详细整理

    关于String类的基本操作,可分为以下几类: 1.基本操作方法 2.字符串比较 3.字符串与其他数据类型之间的转换 4.字符与字符串的查找 5.字符串的截取与拆分 6.字符串的替换与修改 我觉得在整 ...

  6. java 字符串(String)常用技巧及自建方法模块汇总

    1.String类常用方法汇总 (1)删除字符串的头尾空白符 public String trim() (2)从指定位置截取字符串 public String substring(int beginI ...

  7. [Java学习] Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串: String stringName = ...

  8. Java字符串(String)

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串:    String stringName ...

  9. Java字符串——String深入

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10840495.html 一:字符串的不可变性 1.可变 与 不可变 辨析 Java中的对象按照创建后,对象的 ...

随机推荐

  1. [系列] Go gRPC Hello World

    目录 概述 四类服务方法 安装 写个 Hello World 服务 推荐阅读 概述 开始 gRPC 了,这篇文章学习使用 gRPC,输出一个 Hello World. 用 Go 实现 gRPC 的服务 ...

  2. jmeter Linux环境执行总报错 cannot allocate memory

    1.windows环境写好的测试用例,执行没有问题,在Linux环境跑总是报错,提示如下 cannot allocate memory 2.一开始以为是哪块设置有问题,因为脚本里边有设置邮件自动发送, ...

  3. 03-k8s认证

    目录 k8s认证 客户端 ---> API Server 外部访问 pod 客户端 RBCA k8s 用户类型 dashboard 的认证登录 k8s认证 主要使用 RBAC授权检查机制 认证: ...

  4. 解决Vuex持久化插件-在F5刷新页面后数据不见的问题

    页面刷新后,想保存页面未保存的数据.我们总是习惯于放在浏览器的sessionStorage和localStorage中.但是用了vue后,vuex便可以被应用了. vuex优势:相比sessionSt ...

  5. CentOS 配置阿里云 NTP 服务

    NTP 是网络时间协议(Network Time Protocol),NTP 服务能保证服务器的本地时间与标准时间同步. ▶ 配置时区信息 1.删除系统里的当地时间链接 sudo rm /etc/lo ...

  6. Eclipse "R cannot be resolved"问题

    前两天 Eclipse 又遇到了这个问题.网上找了不少,不过最终还是没能解决我的问题,无奈重装了 Eclipse…… 搜索中找到了下面这几篇文章,常见的解决方法都在这里,还是不错的,分享一下: htt ...

  7. light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)

    题目链接 大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的), ...

  8. 为什么for循环可以遍历list:Python中迭代器与生成器

    1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...

  9. python多线程详解

    目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 二.线程实现 threading模块 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 互斥锁 递归锁 信号量 ...

  10. 自定义SWT控件三之搜索功能下拉框

    3.搜索功能下拉弹出框 package com.view.control.select; import java.util.ArrayList; import java.util.LinkedList ...