为什么传入实参会自动在字符串常量池
时间: 2023-09-09 12:11:10 浏览: 45
在 Java 中,字符串常量池是一个特殊的内存区域,用于存储字符串常量。当我们使用字符串字面量的方式创建字符串时,例如 `"hello"`,Java 编译器会首先检查字符串常量池中是否存在值为 `"hello"` 的字符串常量,如果存在,则直接使用这个常量;如果不存在,则在常量池中创建一个新的字符串常量,然后使用它。因为字符串常量池的特殊性质,相同的字符串常量在内存中只会存在一份,所以在使用字符串字面量时,可以有效地减少内存的占用。
而当我们使用 `new String("hello")` 的方式创建字符串时,Java 会先在常量池中查找是否存在值为 `"hello"` 的字符串常量,如果存在,则在堆中创建一个新的字符串对象,这个对象的值与常量池中的字符串常量相同;如果不存在,则先在常量池中创建一个新的字符串常量,然后在堆中创建一个新的字符串对象,这个对象的值与常量池中的字符串常量相同。因此,如果我们需要创建一个新的字符串对象,可以使用 `new String("hello")` 的方式,但如果只是需要使用一个字符串常量,应该使用字符串字面量的方式。
相关问题
因为String类型是一个不可变类型,而以new String("字符串")这种方式创建字符串时,当你传入实参,实参其实已经在常量池创建了一个字符串original,等同于String original = "字符串"
非常正确!Java 中的 String 类型是一个不可变类型,是基于字符数组实现的,它的值在创建后是不可更改的。而使用 `new String("字符串")` 的方式创建字符串时,实参 `"字符串"` 会首先在常量池中创建一个字符串常量,然后使用这个常量创建一个新的字符串对象。如果常量池中已经存在这个字符串常量,则直接使用这个常量创建字符串对象,不会创建新的对象。因此,当使用 `new String("字符串")` 创建字符串时,实际上是复制了一个已有的字符串对象,这个新对象和原来的对象在内存中的地址不同,但它们的值相同。为了避免创建不必要的对象,我们通常建议使用字符串字面量的方式创建字符串,例如 `"字符串"`,这种方式会直接在常量池中创建字符串常量,不需要创建新的对象。
字符串常量做参数形参是什么c++
在C++中,字符串常量做参数形参时,通常会被声明为指向常量字符的指针。也就是说,函数的形参应该是 const char* 类型,这样可以避免在函数内部对字符串常量进行修改。例如:
```c++
void myFunction(const char* str) {
// 不能对 str 进行修改,因为它是指向常量字符的指针
// ...
}
int main() {
myFunction("Hello, world!"); // 字符串常量作为实参
return 0;
}
```
在上面的代码中,`myFunction` 函数的形参 `str` 被声明为 `const char*` 类型,因此不能在函数内部对它进行修改。在 `main` 函数中,我们调用 `myFunction` 函数时,把字符串常量 `"Hello, world!"` 作为实参传入。由于字符串常量本身就是指向常量字符的指针,因此可以直接作为实参传入函数。