昨天心情真的太糟糕了,写完《学习Java,值得注意你注意的问题(1)》之后,迎来些许的支持以后就是一片片的谴责。我的主页上涌现出许许多多Java方面的牛人,谴责我水平太低,写的问题太初级。搞得我非常抑郁,直接导致我和我的女神聊天到后半夜2点多,就是想一吐心中不快。不过这里我还真应该谢谢他们,没有他们我真找不到借口和我的女神聊天呢。谢谢你们啊。

  我知道自己水平不够,但是我真的有用心在写博客。每次博客上写出的问题都是事前询问过同学的,都是同学们比较迷茫的区域,都是一些只知其然不知其所以然的部分。因为《学习Java,值得你注意的问题》吸引了太多Java牛人的关注,我不得不被迫将文章的名字更改为《学习Java,容易被你忽略的小细节》。这里请大家注意了我说的是容易被你忽略的小细节,这些细节可能对于Java牛人来说真的就像南极冰川上一座不起眼的冰山,微不足道。所以我有必要在这里表明态度,请各位Java牛人绕路,不要抨击小弟了。我只想向和我一样初学Java的同学提供一些我个人觉得有价值的建议。

  吐槽完毕,我们闲话少说。下面就来介绍一下,学习Java,容易被你忽略的小细节(2)

  在学习String类的时候,在书上看到这样一段代码:

		if(string1 == string2)
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different object");

  下面附带文字,运算符“==”只能检查string1和string2是否指向同一个对象,它不能辨别两个不同的对象是否包含相同内容。因此,不能用“==”检测两个字符串变量是否具有相同内容,而equals()方法可以用于对象内容相等的比较。

  遇到这种问题显然我会自己动手调试一下才会甘心。但是调试结果领我很郁闷。

  代码:

public class TestDemo2{
public static void main(String[] args){
String string1 = "testDemo";
String string2 = "testDemo";
if(string1 == string2)
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different object");
}
}

  调试结果:

"string1 and string2 are the same object"???这是要闹哪样啊,难道书上写错了?难道运算符“==”也可以用于对象内容相等的比较?

看到调试结果以后我又在图书馆的书架上找了几本《Java程序设计》相关的书籍仔细地阅读,最后找打了问题的原因。

在一本书籍的一个角落里有这样一段话:

注:程序设计中频繁使用字符串。为了提高效率,节省内存,Java虚拟机尽力确认相同的串并把它们存放在同一内存空间,但这不能保证所有相同的串都具有相同的内存地址。因此还需要使用equal()方法判断两个串内容是否相同,使用“==”判断两个串的引用是否相同(即,指向相同的内存地址)。

虽然Java虚拟机是为了提高效率,节省内存。但是显然差点误导我嘛,坏人!!!

在Java程序设计中遇到判断字符串内容是否相等的问题时,建议代码:

if(string1.equals(string2))
System.out.println("string1 and string2 have the same contents");
else
System.out.println("string1 and string2 are not equal");

  虽然上面问题很基础,但是我相信一定有很多同学在学习到相同知识点的时候也会和我一样有迷惑。请大家不要单单记住判断字符串相等的时候应该用equals()方法,不能用“==”。最好做到知其然,也知其所以然。都是Java虚拟机惹的祸。

(ps:经过博友kongkongyzt的指点,我重新测试了一下)

  代码:

public class TestDemo2{
public static void main(String[] args){
//string1 和string2 内容相同,地址不同。
String string1 = new String("testDemo");
String string2 = new String("testDemo");
if(string1 == string2)
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different object");
if(string1.equals(string2))
System.out.println("string1 and string2 have the same contents");
else
System.out.println("string1 and string2 are not equal");
}
}

  测试结果:

  从上面测试结果可以很清楚的看出对于String类,equals()方法和运算符“==”在使用上的区别。在这里非常感谢博友kongkongyzt的指点。

  

  上面就是学习Java,容易被你忽略的小细节(2)。

  欢迎继续关注本博更多新鲜动向,博主QQ:2584451009,有什么建议和忠告欢迎评论或留言。

  

学习Java,容易被你忽略的小细节(2)的更多相关文章

  1. 学习Java,容易被你忽略的小细节(3)

    在<学习Java,容易被你忽略的小细节(2)>中我们已经深入讨论过String类中equals()方法的使用,在本文中我们将进一步讨论equals()方法在其他境况下的使用方法. 首先,我 ...

  2. 学习Java,值得你留意的问题(1)更名为《学习Java,容易被你忽略的小细节(1)》

    记得大二快要结束的时候,有个女孩子突然问我“你会Java吗,帮我做大作业好吗?” 实话说,那个女孩真的很漂亮,我当时也非常想帮她.但是我从来没有接触过Java,让我在短短的几天内完成Java程序设计课 ...

  3. java 性能优化:35 个小细节,让你提升 java 代码的运行效率

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  4. JAVA性能优化:35个小细节让你提升java代码的运行效率

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  5. java中的@Override标签,小细节大作用

    转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途                         ...

  6. Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)

    Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...

  7. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  8. 从零开始学习JAVA(入门基础)

    目录 博主从零开始学习JAVA(入门基础) 1.搭建JAVA开发环境 卸载JDK(未安装的请忽略) 安装JDK 2.编程语言中,何为编译型与解释型 编译型 解释型 3.第一个JAVA应用程序 4.JA ...

  9. 论新手该如何学习java?

    由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的时间,还有一个很重要的原因就是java这门语言更适合商业应用,所以高校里大部分博士老师们对此语言的了解甚至不比本科生多. 在这种环境下, ...

随机推荐

  1. struts2和velocity整合问题

    以下是我第一次使用velocity的时候写的 2012-03-12 话说struts真够懒的,都把velocity-1.6.4.jar放到他自己的lib里边了,就不给放全了,搞得新手太郁闷了.stru ...

  2. 获取当前div中的所有div的个数和每一个div的ID and 根据屏幕分辨率计算高度

    var tabs_Count=document.getElementById("tabs-panels").getElementsByTagName("div" ...

  3. go-wingui 2018 全新 v2.0 版本发布,包含重大更新!

    go-wingui 2018 全新 v2.0 版本发布,包含重大更新!使用新版CEF内核Chromium 63.0.3239.109,页面可以使用最新的css3,html5技术.使用delphi7重写 ...

  4. Java--ConcurrentHashMap原理分析

    一.背景: 线程不安全的HashMap     因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap.   效率低下的H ...

  5. GetEntryAssembly、GetExecutingAssembly和GetCallingAssembly的区别

    GetEntryAssembly获取的是当前应用程序第一个启动的程序,一般就是xxx.exe文件. GetExecutingAssembly获取的是当前执行的方法所在的程序文件,可能是.exe,也可能 ...

  6. AVL 树的插入、删除、旋转归纳

    参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339   1126号注:先前有一个概念搞混了: 节点的深度 Depth 是指从根 ...

  7. 【读书笔记】——《A Brief History of Humankind》

    I encourage all of us, whatever our beliefs, to question the basic narratives of our world, to conne ...

  8. LeetCode OJ平台Sort Colors讨论主题算法

    原题如下面,这意味着无序排列(由0,1,2组成).一号通.组织成若干阵列0-几个1-几个2这样的序列. Given an array with n objects colored red, white ...

  9. Matlab Tricks(二十二)—— 自定义函数

    printme = @(txt) print('-dpdf', sprintf('figures/Example_%s',txt)); % 这里的 print 显然不是控制台输出一句话,而是图像的命名 ...

  10. ThreadPoolExecutor原理和使用

    大家先从ThreadPoolExecutor的整体流程入手: 针对ThreadPoolExecutor代码.我们来看下execute方法: public void execute(Runnable c ...