java - C++ 引用和 Java 引用

标签 java c++

//C++例子

#include <iostream>
using namespace std;

int doHello (std::string&);
int main() {
    std::string str1 = "perry";
    cout << "String=" << str1 << endl;
    doHello(str1);
    cout << "String=" << str1 << endl; // prints pieterson
    return 0;
}

int doHello(std::string& str){
    str = "pieterson";
    cout << "String=" << str << endl;
    return 0;
}

在上述情况下,正如预期的那样,当 str 引用被修改时,字符串 'str1' 引用也被修改

//Java示例

public class hello {

    public static void main(String args[]){
        String str1 = "perry";
        System.out.println("String=" + str1);
        doHello(str1);
        System.out.println("String=" + str1); // does not prints pieterson
    }

    public static void doHello(String str){
        str = "pieterson";
        System.out.println("String = " + str);
    }
}

在 Java 中,String str 和 String str1 是两个不同的对象,最初引用同一个 String,所以当我们在 doHello() 中更改 str 引用时,str1 引用不会改变。

我们如何在 Java 中使用字符串、集合(如列表、 vector 和其他对象)实现 C++ 风格的功能。

更新:

感谢Jon的精彩讲解,相信任何Java初学者都会遇到这个问题。 让我解释一下我在使用列表时遇到的问题。

//bad doHello() 

void doHello(List inputList) { 
    inputList = getListFromAnyFunction(); // wrong, didnt work 
} 

// good doHello 

void doHello(List inputList) { 
    inputList.addAll(getListFromAnyFunction()); // worked 
}

感谢 Powell 和 Harshath 的解释和代码示例。

最佳答案

Java 根本没有通过引用传递(您在 C++ 代码中使用的)。引用按值传递。 (strstr1 的值根本不是对象,它们是引用 - 将这两个概念分开确实很有帮助。)

如果需要,通常您会使用返回值来返回新的引用:

str1 = doHello(str1);

请注意,String 与 List 等略有不同,因为字符串是不可变的。要修改一个集合(好吧,任何可变集合)你不需要创建一个新集合,你只需通过原始引用修改对象:

public static void addHello(List<String> items)
{
    items.add("Hello");
}

然后你可以这样调用它:

List<String> list = new ArrayList<String>();
addHello(list);
System.out.println(list.get(0)); // "Hello"

改变现有对象 和更改变量值以引用不同 对象之间的区别至关重要。如果您想单独保留现有集合并创建一个新集合,则必须明确地这样做:

public static List<String> withHello(List<String> items)
{
    List<String> newList = new ArrayList<String>(items);
    newList.add("Hello");
    return newList;
}

然后你可以这样调用它:

List<String> empty = new ArrayList<String>();
List<String> newList = withHello(empty);
System.out.println(empty.size()); // Prints 0
System.out.println(newList.size()); // Prints 1

这是否满足了您的所有需求?

关于java - C++ 引用和 Java 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/979814/

相关文章:

c++ - 为命名空间中定义的类重载 ostream 运算符 (<<)

java - 魔方旋转算法

java - 通过浏览器注入(inject) header

c++ - 在所有操作系统中应用文件统计(统计的结构类型)

c++ - consteval 包装器与 source_location

c++ - Lambda 表达式等效 C++ 代码

c++ - 缩短字节 vector 上的 push_back 系列

java - java程序中的命令提示符

java - 实现 Clarifai API

java - Flutter - 无法将 MethodChannel 与 Firebase onBackgroundMessage 一起使用