虽然==与equals的问题很老了,我还是忍不住来发个帖提问

danliandejintou 2011-04-16 03:38:58
刚才在百度贴吧和某人争了半天。
======================================
我们在入门的时候,都学过
第一种 String a = new String("abc");
第二种 String a = "abc";
当用第一种方式时,==会给出false。
所以我们比较字符串的时候,要用equals.
=======================================
然而,我们又知道,java里有个String池的东西。
所以,当用第二种方式时,==也会给出true
所以在百度贴吧里,某人说【一般人的习惯是采用第一种方式赋值的,用==更加方便通用点】
========================================
我突然就觉得,和人在争比较字符串该用==还是equals,是不是我疯了
...全文
103 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
danliandejintou 2011-04-16
  • 打赏
  • 举报
回复
public class Tt {

public static void main(String[] args) {
String a = "a";
String b = "b";
String ab = "ab";
String s = a+b;
if(s==ab){
System.out.println("true");
}else{
System.out.println("false");
}
}

}
结果false
======================
确实没必要再讨论了。
刚才在贴吧有人说了
================================================
关于equalsw我在java核心技术上抄下来。是这样写的
对于s.equals(t)如果字符串s与字符串t相等,则返回true否则就返回 false 。需要注意的是,s与t可以是字符串变量,也可以是字符串常量。例如:
char greeting = "hello";
"hello".equals(greeting);
以上的表达式是合法的
要想检测两个字符串是否相等,而不区分大小写,可以用equalsIgnoreCase()方法
"Hello".equalsIgnoreCase("hello");
一定不能使用 == 运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上,当然,如果字符串放置在同一个位置上,它们必然相等,但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上,
如果虚拟机始终将共同的字符串共享,就可一个使用 == 运算符接侧是否想相等,但实际上只有字符串常量是共享的,而 + 或 substring等操作残生的结果不是共享的,因此,千万不要使用 == 运算符测试两个字符串是否相等。
在java核心技术中文第八版45页看到的。希望对你有所帮助
============================================
pinefantasy 2011-04-16
  • 打赏
  • 举报
回复
陈题了,没必要争论了。稍微看看底层源代码就清楚了。。。。
liu188098474 2011-04-16
  • 打赏
  • 举报
回复
个人理解为
==是比较两个字符串所指的对象也就是对象的引用是否是同一个。
equals是单纯的比较连个字符串的对象的值是否相等。
个人认为视情况而定,在需要做什么比较时候,就用什么符号。
Codership 2011-04-16
  • 打赏
  • 举报
回复
用equals比较
eXeSP 2011-04-16
  • 打赏
  • 举报
回复
==和equals貌似又出新花样了..

好吧,我不知道一般人是不是用第一种赋值方式,反正我从来不用。
Jeelon 2011-04-16
  • 打赏
  • 举报
回复
比较字符串 用equals
浪漫江湖 2011-04-16
  • 打赏
  • 举报
回复
不要与人做无谓的争论
danliandejintou 2011-04-16
  • 打赏
  • 举报
回复
如果用==就可以了
sun的程序员是**吗?
干嘛花心思重写equals?
danliandejintou 2011-04-16
  • 打赏
  • 举报
回复
某人说【一般人的习惯是采用第一种方式赋值的,用==更加方便通用点】
================================================================



好吧,我就是想你告诉我,你在比较字符串的值时,你是习惯用==还是习惯用equals
================================================================
huntor 2011-04-16
  • 打赏
  • 举报
回复
new 出来的 String 和 直接赋值的 区别大了。
[Quote]3. What is the difference between creating String as new () and literal?
When we create string with new () it’s created in heap and not added into string pool while String created using literal are created in String pool itself which exists in Perm area of heap.[/Quote]
  • 打赏
  • 举报
回复
老夫还是老老实实看深入JVM去了,
danliandejintou 2011-04-16
  • 打赏
  • 举报
回复
我始终觉得,比较字符串的值时,就该毫不犹豫用equals
软件测试里有句话,软件测试不是为了证明程序无错,而是为了证明软件有错。
同样,我觉得,不应该拿String池来说明==可用,而应该用new String()来说明不可用。
某人说【一般人的习惯是采用第一种方式赋值的,用==更加方便通用点】
万一就有那么个非一般人呢?我觉得某人就不是一般人
程序员菜鸟北 2011-04-16
  • 打赏
  • 举报
回复
不是。你理解字符串是怎么存储的,你就明白==比较结果为什么相等。理解下jvm把
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧