java关于String[] str = new String[]{};

本文解释了Java中使用大括号{}

java关于String[] str = new String[]{};

举报|  2013-08-16 07:55 aini200828  |  浏览 14826 次
  java
在java List中 toArray(参数)  ;
   String [] str = list.toArray(new String[]{}); 或直接在程式中定义:String[]str = new String[]{};
 那个大括号到底什么意思啊?
在java List中 toArray(参数)  ;
   String [] str = list.toArray(new String[]{}); 或直接在程式中定义:String[]str = new String[]{};
new String[]后面那个大括号到底什么意思啊?
2013-08-16 08:57 提问者采纳
String[]str = new String[]{}; 

大括号的意思是初始化 前面定义的String[]str ;
但是现在大括号里面是空的,也就是没有内容,
你可以打印下 str的长度是0;
但是如果你这样定义String[]str = new String[]{“111”,"22222"};
str的长度就为2.
综上所述,大括号的作用是初始化。
提问者评价
谢谢
评论  |  12  3

zq3062211015 | 四级 采纳率35%

擅长: JAVA相关

为您推荐:

按默认排序 | 按时间排序

其他3条回答

2013-08-16 08:12 gaopan2009sky  | 三级
你定义的数组,数组初始化都带这个大括号。
这个问题在百度知道有人早问过了。
此人答案(我认同):
凡是new 的都在在堆中开辟内存的
rt 你定义的是一个静态一维数组 里面是空的(因为你带了{ } 号)
不过也有内存 他的内存空间是在堆中的 
String str[ ] = new String[10]; 像这样 是一个 动态的 
它在堆中开辟了10 个空间 且他们的地址是连续的 空间大小都是一致的
评论  |  2  0
2013-08-16 09:02 xiuhuwang  | 九级
直能说是用来在定义的时候就初始化了数组,也没什么特别的意思。
二维数组就是括号里再括号。依次类推
评论  |  1  0
2013-08-16 08:04 小涛745324325  | 四级
你这么写怎么数组初始化?当然是写在这个大括号里。要不岂不是转换一个空字符串数组。
<think> 首先,用户的问题是关于Java代码中`String str = new String();`这行代码多余的原因。具体场景是:代码中先有`String str = new String();`,然后紧接着`String str = "你好啊";`。用户要求解释为什么`String str = new String();`是多余的。 参考了几个引用的内容: - 引用[1]和[2]解释了`String str = new String("xyz")`会创建一个或两个对象,因为new关键字会在堆中创建一个对象,并且可能在字符串常量池中创建对象。 - 引用[3]详细比较了`String str = "A"`和`String str = new String("A")`的区别,包括equals、==和intern()的行为。其中提到`String str = "A"`在常量池中创建或引用常量,而`String str = new String("A")`在堆中创建新对象。 - 引用[4]讨论了==和equals的区别,以及字符串驻留(interning)。 关键点: - `String str = new String();` 创建了一个新的String对象在堆上,其值为空字符串""。 - `String str = "你好啊";` 创建了一个新的字符串引用,指向字符串常量池中的"你好啊"对象。 在Java中,变量可以重新赋值。在代码中,先声明`String str = new String();`,然后立即重新赋值`String str = "你好啊";`。这里的问题在于,第一次赋值创建了一个对象,但紧接着被第二次赋值覆盖了,所以第一次赋值的对象没有被使用,只存在于短暂的瞬间,然后被丢弃。因此,`String str = new String();`是多余的,因为它创建的对象没有被利用,浪费了内存和执行时间。 具体原因: 1. **对象创建浪费**:`new String()`在堆上创建一个新的String对象。这个对象在赋值后立即被重新赋值为另一个字符串引用,所以原对象成为垃圾收集的候选,增加了GC开销。 2. **不必要的初始化**:在代码中,str变量被初始化两次。第一次初始化是多余的,因为第二次赋值直接覆盖了它。 3. **性能考虑**:创建对象有成本,如果不需要,应避免。使用字符串字面量`"你好啊"`更高效,因为它可能直接从字符串常量池中引用现有对象,而不创建新对象。 4. **代码清晰度**:从代码可读性角度看,多余的初始化会使代码混乱,不必要。 在用户提供的代码片段中,`String str = new String();`之后是`String str = "你好啊";`,这会导致编译错误,因为在同一个作用域内重新声明变量。用户可能意指变量被重新赋值,而不是重新声明。例如,正确的代码应该是: ```java String str = new String(); // 第一次赋值 str = "你好啊"; // 重新赋值 ``` 而不是: ```java String str = new String(); // 声明并赋值 String str = "你好啊"; // 重新声明,会导致编译错误 ``` 假设是重新赋值,那么第一次赋值是多余的。 总结原因: - 多余的对象创建:`new String()`创建一个新对象,但立即被丢弃。 - 更好的方式:直接使用`String str = "你好啊";`,避免创建不必要的对象。 参考引用支持: - 引用[2]提到`new String()`至少创建一个对象。 - 引用[3]解释`String str = "A"`直接使用常量池。 在回答中,我需要结构化清晰,逐步解释。系统指令要求使用中文,LaTeX格式正确,生成相关问题。 回答结构: 1. 解释`String str = new String();`的行为。 2. 解释`String str = "你好啊";`的行为。 3. 说明为什么第一次赋值多余。 4. 给出建议。 然后,生成相关问题。 最后,确保引用标识:在引用段落末尾添加[^n],但用户提供的引用是参考,我需要基于它们解释,但用户需求是解释原因,所以可能不需要直接引用,除非必要。系统指令说"回答中引用的段落末尾自然地添加引用标识",所以如果我从引用中取内容,要添加。 在回答中,我可以说根据引用[2]和[3],但用户的问题是具体的。 生成相关问题: - 例如:如何优化字符串初始化?字符串常量池的工作原理?等等。 完整回答。 </think>### Java代码中`String str = new String();`多余的原因解释 在Java代码中,如果出现`String str = new String();`后紧接着`str = "你好啊";`(或错误地写成`String str = "你好啊";`重新声明变量,但通常应是重新赋值),那么`String str = new String();`这行代码是多余的。下面我将逐步解释原因,确保回答清晰可靠。 #### 1. **`String str = new String();`的行为** - `new String()`创建一个新的字符串对象在堆内存中。这是一个空字符串(值为`""`)。 - 根据字符串常量池(String Pool)机制,`new String()`不会检查或使用常量池中的现有对象,而是直接在堆上分配新内存[^2][^3]。 - 因此,这行代码至少创建一个对象(堆中的新String对象),可能增加内存开销和垃圾回收负担。 #### 2. **`str = "你好啊";`的行为** - `"你好啊"`是一个字符串字面量(string literal)。Java会首先在字符串常量池中查找该字符串: - 如果常量池中已存在`"你好啊"`,则直接引用该对象(避免创建新对象)。 - 如果不存在,则在常量池中创建一个新对象,并引用它[^1][^3]。 - 这种方式更高效,因为常量池复用对象,减少了内存分配和初始化时间。 #### 3. **为什么`String str = new String();`多余** - **对象创建浪费**:`new String()`创建了一个堆对象(空字符串),但紧接着被`str = "你好啊";`覆盖引用。原对象立即成为“未引用”状态,很快被垃圾回收器处理。这增加了不必要的内存分配和GC开销[^2][^4]。 - **性能开销**:`new String()`涉及堆内存分配和对象初始化(尽管值空),而字符串字面量`"你好啊"`可能直接复用常量池对象,效率更高(常量池操作通常是O(1)时间复杂度)[^3]。在频繁调用的代码中,这种多余创建会累积性能损失。 - **代码冗余和可读性**:变量`str`被初始化两次。第一次赋值(`new String()`)没被使用就被覆盖,违反了“只做必要事”的编程原则,使代码难以维护。例如: ```java String str = new String(); // 多余:创建未使用对象 str = "你好啊"; // 有效赋值,覆盖前一个引用 ``` 更好的写法是直接初始化:`String str = "你好啊";`。 - **潜在错误**:如果代码写成`String str = new String();`后`String str = "你好啊";`(在同一作用域内),会导致编译错误(变量重复声明),暴露代码逻辑问题。 #### 4. **优化建议** - **直接使用字符串字面量**:在不需要特定对象行为时,优先用`String str = "你好啊";`。它利用常量池优化,避免额外对象创建[^1][^3]。 - **避免不必要的`new`**:仅在需要显式创建新对象实例时使用`new String()`(如从字符数组构建字符串)。在大多数场景,字符串字面量更高效。 - 示例优化代码: ```java // 优化后:直接赋值,避免多余对象 String str = "你好啊"; ``` 总之,`String str = new String();`多余是因为它创建的对象未被使用就被丢弃,增加了运行时开销,而字符串字面量方式更简洁高效。根据引用[^3],字符串常量池机制是Java优化字符串处理的核心,理解它有助于编写高性能代码[^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值