求一个简单的问题,30分拿走!!!

在JAVA中我们都知道,==比较的是地址,而equals比较的是地址的值。

那么问题来了<>这些符号,比较的又是什么呢?
...全文
10568 89 打赏 收藏 转发到动态 举报
写回复
用AI写文章
89 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Sakura 2019-07-19
  • 打赏
  • 举报
回复
只能比较大小,比较地址的大小没有意义呀
whyuf_go 2018-08-20
  • 打赏
  • 举报
回复
引用 91 楼 whyuf_go 的回复:
<> 貌似比较的是ascii码,

基本类型是这样的,字符串比较的时候也是转化成ascii码去比较,这就是为什么大小写会有一个前后顺序了.
whyuf_go 2018-08-20
  • 打赏
  • 举报
回复
<> 貌似比较的是ascii码,
幸运diy 2018-07-23
  • 打赏
  • 举报
回复
==比较的是地址,equals是一个方法,在不同类比较的不一样,要看类重写equals方法没
Howe~zZ 2018-06-27
  • 打赏
  • 举报
回复
首先equals是比较两个字符串是否内容相同,双等是查看的地址是不是被同一个对象引用,大于小于是在基本类型中比较数字大小,应该是这样的
Vilen7 2018-06-27
  • 打赏
  • 举报
回复
引用 10 楼 l359122505 的回复:
[quote=引用 8 楼 sunle818 的回复:]
7楼说的这些我都懂,关键就是你最后一句话,
int a=10;
int b=20;
a里面保存的是10,a和b肯定也是有地址的,
那么他们要比较,肯定也是需要通过地址找到这个值,才能进行比较,

那么问题来了,既然他们比较的是值,

那么我们是不是可以认为,它就是通过地址找到值,然后再比较里面的值吧,实际操作原理和equals一样吗?


int a=3;
int b=3;

编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。在编译器内部,遇到时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。[/quote]基本数据类型是直接存储在栈里面的,不是放在堆里面,不用通过地址查值
八位比特 2018-06-23
  • 打赏
  • 举报
回复
引用 86楼weixin_42118643 的回复:
我可以很明确的告诉你,>,<,这符号在汇编层面就是三句话cmp a,b。意思是比较a,b的大小。后面再加两句句如果a>b那么程序输出1,如果A<b输出0。 这两个符号表示的都是同样的意思,只不过是返回值相反而已。 而0和1保存在另一个寄存器中保存,你if括号中的东西就是从这个寄存器中取得的。>,<,只是符号,只是一个方法,相当于把上面的三句话封装成一个方法而已。而在汇编上的cmp指令拿的是地址里面的值,或者栈上的值。所以都是值,你写地址他拿的就是地址里的值,拿不了地址。这个命令就是这样规定的。 也就是说>,<相当于你封装的方法的名字 你完全可以不用这个符号表示这个方法,完全可以起个abc来表示这个方法的名字。
另外要不充一下a,b代表寄存器或者某个地址,或者栈上的值
八位比特 2018-06-23
  • 打赏
  • 举报
回复
我可以很明确的告诉你,>,<,这符号在汇编层面就是三句话cmp a,b。意思是比较a,b的大小。后面再加两句句如果a>b那么程序输出1,如果A<b输出0。 这两个符号表示的都是同样的意思,只不过是返回值相反而已。 而0和1保存在另一个寄存器中保存,你if括号中的东西就是从这个寄存器中取得的。>,<,只是符号,只是一个方法,相当于把上面的三句话封装成一个方法而已。而在汇编上的cmp指令拿的是地址里面的值,或者栈上的值。所以都是值,你写地址他拿的就是地址里的值,拿不了地址。这个命令就是这样规定的。 也就是说>,<相当于你封装的方法的名字 你完全可以不用这个符号表示这个方法,完全可以起个abc来表示这个方法的名字。
渣渣方龙 2018-06-22
  • 打赏
  • 举报
回复
引用 7楼galiniur0u 的回复:
>,<号比较的是值。
我们可以写两个程序,来比较一下,就可以看出一些端倪,篇幅可能会有些长:
例子1:

public class Test {
public static void main(String[] args) {
Integer i = new Integer(6);
Integer b = new Integer(5);
int c = 6;
int d = 5;
String a = "";
String e = "";
if(i > b){
System.out.println("true");
}else{
System.out.println("false");
}
}

例子2:

public class Test {
public static void main(String[] args) {
Integer i = new Integer(6);
Integer b = new Integer(5);
int c = 6;
int d = 5;
String a = "";
String e = "";
if(c > d){
System.out.println("true");
}else{
System.out.println("false");
}
}

例子3:

public class Test {
public static void main(String[] args) {
Integer i = new Integer(6);
Integer b = new Integer(5);
int c = 6;
int d = 5;
String a = "";
String e = "";
if(a > e){
System.out.println("true");
}else{
System.out.println("false");
}
}

例子4:

public class Test {
public static void main(String[] args) {
Integer i = new Integer(6);
Integer b = new Integer(5);
int c = 6;
int d = 5;
String a = "";
String e = "";
if(i == b){
System.out.println("true");
}else{
System.out.println("false");
}
}

打印结果想必很容易得到:
例子1:true
例子2:true
例子3:程序报错,String不允许使用>符号
例子4:false
针对于例子2,比较值。例子3报错。没有什么疑问。接下来我们看例子1:例子4
针对于例子1,我们看看程序的class字节码:

我们来看30~37行字节码,我们看到,当我们调用>操作符的时候,java实际上是做了一次强制转换,将我们的Integer类型,转换为了int,然后再进行比较。
所以当我们使用例子3比较两个字符串的时候,由于无法转换为基础类型,所以直接报错。
那么我们再来看看例子4的class字节码:

我们再来看看35~37行字节码,由于==可以直接比较两者的地址,因此无需做任何转换,直接将两者的地址取过来进行比较即可。
如果楼主再问为啥>是取值,==就是取地址,表示能力范围之外就不知道了,或许java大神们觉得比较地址先后没有意义,但比较地址相等确实有意义的事。
我写第4个例子编译期报错为什么
韩小非 2018-01-17
  • 打赏
  • 举报
回复
==只能比较基本数据类型
di_yun_hah 2017-12-27
  • 打赏
  • 举报
回复
<和>可以常用于比较基本数据类型及其对应的包装类(布尔类型除外),比较值的大小;也可以去比较Date类型,比较其时间戳的大小
东纪元 2017-12-20
  • 打赏
  • 举报
回复
java不是c++,不支持运算符重载,所以只能比较值。。。而且>左右都不允许放对象吧?
东纪元 2017-12-20
  • 打赏
  • 举报
回复
java不是c++,不支持运算符重载,所以只能比较值。。。而且>左右都不允许放对象吧?
干杯xiaoyiyi 2017-11-27
  • 打赏
  • 举报
回复
对象equals是比较内存地址是不是一样的,但是内存地址是没有大小一说的吧,只有是不是相同,你比较内存在堆栈中前后没有意义,所以我觉得应该是比较值
刘艺liuyi 2017-11-20
  • 打赏
  • 举报
回复
比较数字大小
eikory 2017-11-20
  • 打赏
  • 举报
回复
看到大神们的回复,小弟也沾光了
weixin_37456231 2017-11-19
  • 打赏
  • 举报
回复
如果是数字,直接比较大小(无论是直接比较还是赋值比较),如果是字符直接比较,比较的是ascll码值
weixin_41106232 2017-11-19
  • 打赏
  • 举报
回复
java不允许程序员重载运算符,其中对+进行了重载,如String s = "a" + b; 大于号和小于号没有重载,只能比较值
qq_39223796 2017-11-16
  • 打赏
  • 举报
回复
程序员重载运算符,其中对+进行了重载,如String s = "a" + b; 大于号和小于号没有重载,只能比较值
6点A君 2017-11-15
  • 打赏
  • 举报
回复
先去了解下java里面基本数据类型,以及对象,然后再去看看comparable接口,你就会知道比较神马了
加载更多回复(69)

62,614

社区成员

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

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