以下Java代码执行结果是啥,请详细分析为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以下Java代码执行结果是啥,请详细分析为啥?相关的知识,希望对你有一定的参考价值。

第一行输出结果是abc:
原因是:
s.substring(1);
s.replace("bc", "xyz");
这两句话没有任何作用 ~因为String是属于值传递~

第二行 输出结果是false:
原因是:
用==比较字符串,是比较两个变量本身的值,即两个对象在内存中的首地址。用equals比较就会为true,equals比较的是内容是否相同。

附:
1、值传递、引用传递的区别:
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数

2、用==比较和用equals比较的区别:
对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同.
“==”比较两个变量本身的值,即两个对象在内存中的首地址.
“equals()”比较字符串中所包含的内容是否相同.
参考技术A abc
false

String类里的无论是substring方法还是replace方法都会返回一个新的字符串,因此s是不会变的;
new String("abc")也会产生一个新的字符串变量,只是内容是abc,和变量s相同,而s==value比较的是二者的内存地址,java中每产生一个新的变量就会分配一个新的内存地址,因此二者相等是false
参考技术B abc
false
String类是一个final类,对象被创建后就不能修改,==比较的是两个变量的引用对象是否是同一个,而不是对象的属性是否相同,判断两个对象是否相等应该用equals方法
参考技术C abc
false
你之前的
s.substring(1);
s.replace("bc", "xyz");都没有赋值给s,所以s的值是不变的。
如果你这样写的话
s=s.substring(1);
s=s.replace("bc", "xyz");
s输出的是xyz

还有为什么是false呢?
==这个指的是是否是同一个对象,你后来的value是new的,就是重新见了一个对象,s和value是两个对象,所以不相等
如果你用s.equals(value),这个返回的是true,因为他们比较的是值是否相等,值都是“abc”,所以返回true
参考技术D abc
false
输出abc是因为:s.substring(1)语句只是将s串进行了截取,将截取的结果进行返回,但是并没有改变s串;s.replace("bc","xyz")语句是将s串中的bc部分替换为xyz并将结果返回,也没有改变s串。两个语句虽然都有返回值,但是没有左值,也就是没有用变量接收这个返回值。
输出false是因为s==value,虽然s串和value串中的字符都相同,但是还是两个字符串。String s="abc"语句在字符串池中产生了一个"abc"串,String value=new String("abc");也同意在字符串池中产生了一个"abc"串,两个字符串是同时存在于字符串池中的,所谓的字符串池可以理解为内存中的一个部分专门用来存放字符串的地方。既然是有两个相同的字符串在内存中,那么它们的地址就是不一样的,而s==value中的比较运算符==比较的就是字符串的地址,准确来说应该是通过比较两个字符串的哈希码,所谓的哈希码就是通过hash算法使用字符串的内存中地址计算得到的结果。既然两者的地址不同,那么hash算法得到的哈希码也是不一样的,所以就是false

当我运行此代码时,无论字符串是啥,结果始终为 24。为啥? [复制]

【中文标题】当我运行此代码时,无论字符串是啥,结果始终为 24。为啥? [复制]【英文标题】:When I run this code, result is always 24 regardless of what string is. Why? [duplicate]当我运行此代码时,无论字符串是什么,结果始终为 24。为什么? [复制] 【发布时间】:2021-09-07 14:39:52 【问题描述】:

当我运行这段代码时,无论字符串是什么,结果总是 24。为什么?

#include <bits/stdc++.h>
using namespace std;
    
int main()

    string s = "asdccccc";
    cout << sizeof(s);
    return 0;

【问题讨论】:

要获取字符串的大小,请使用cout &lt;&lt; s.size();(或cout &lt;&lt; s.length(); ...它们是同义词)。当您执行sizeof(s) 时,您获取的不是字符串有效负载的大小,而是拥有有效负载的字符串对象的大小。 @Caleth 我应该知道这是重复的,谢谢。 如果你使用#include &lt;string&gt;,你的编译效率会更高,这是一个单一的包含文件版本,不标准的庞然大物bits/stdc++.h。通常,只在代码或标头中包含实际解析符号的标头。 【参考方案1】:

string 是一个对象。通过使用sizeof,您将获得该对象的成员 的大小。其中一个成员可能是指向实际字符串内容的指针,但无论指针指向什么,指针的大小都是恒定的。

【讨论】:

我尝试在其他编译器上运行它...答案不是 24 但它仍然是一个常数,无论字符串的大小如何...所以指针的大小会随着编译器的变化而变化? ? @ChiragJoshi std::string 类的定义随着标准库的实现而改变。指针的大小在编译器之间不会改变,但会在不同的 CPU 架构之间发生变化(并且 x86 支持具有不同大小指针的多种模式)。 @ChiragJoshi 它可能是指针的大小,特别是如果一个是 32 位而另一个是 64 位。也可以是其他成员的数量和类型。【参考方案2】:

考虑这个简单的例子

class string

    const char* _ptr;
    ....
    ....
public:
   

当你写sizeof(string)时,你会得到类的大小,而不是_ptr指向的字符串字面量的大小。

【讨论】:

以上是关于以下Java代码执行结果是啥,请详细分析为啥?的主要内容,如果未能解决你的问题,请参考以下文章

java使用jdbc连接mysql数据库,表里有记录,但是查询的结果集为空,是啥原因

SVN 中的结果代码是啥意思?

sql语句的执行顺序是啥,为啥下面这两个sql执行的结果是一样的

当我运行此代码时,无论字符串是啥,结果始终为 24。为啥? [复制]

lua解释器 是啥东西? lua 后面加lua文件名为啥不行?

格式化程序转换 - 为啥以下代码的结果 = “true”?