昨天心情真的太糟糕了,写完《学习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. Android推送服务——百度云推送

    一.推送服务简介 消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息.在Android开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做 ...

  2. eCognition学习记录

    作者:朱金灿 来源:http://blog.csdn.net/clever101 昨天公司从外面请了人讲解eCognition的最新进展及项目二次开发应用情况.我做了大致下面记录: 1.  eCogn ...

  3. Spring 4 MVC+Apache Tiles 3 Example

    In this post we will integrate Apache Tiles 3 with Spring MVC 4, using annotation-based configuratio ...

  4. jQuery.noop

    一个空函数 当你仅仅想要传递一个空函数的时候,就用他吧.这对一些插件作者很有用,当插件提供了一个可选的回调函数接口,那么如果调用的时候没有传递这个回调函数,就用jQuery.noop来代替执行.

  5. wxWidgets初学者导引(3)——wxWidgets应用程序初体验

    wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith ...

  6. java socket 的参数选项解读

    java socket中有很多参数可以选择,这篇博客的目的是沉淀出这些参数的语义和用法,供自己以后查阅. 1.java socket参数选项总览 在JDK1.6中有如下参数选项: public fin ...

  7. 由Maximum Gap,对话桶排序,基数排序和统计排序

    一些非比较排序 在LeetCode中有个题目叫Maximum Gap.是求一个非排序的正数数列中按顺序排列后的最大间隔.这个题用桶排序和基数排序都能够实现.以下说一下桶排序.基数排序和计数排序这三种非 ...

  8. java中的switch结构

     switchkeyword的中文意思是开关.转换的意思,switch语句在条件语句中特别适合做一组变量相等的推断,在结构上比if语句要清晰非常多.switch语句的语法格式为:switch(表达式) ...

  9. 在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)

    在Linux下使用MinGW静态交叉编译带有zlib的libcurl libcurl是一个跨平台的.易用的.强大的网络库.在大部分Linux发行版中都有编译好的二进制包可供使用,Mac系统更是将其作为 ...

  10. Matlab随笔之画图函数总结

    原文:Matlab随笔之画图函数总结 MATLAB函数画图 MATLAB不但擅长於矩阵相关的数值运算,也适合用在各种科学目视表示(Scientific visualization).本节将介绍MATL ...