2013-09-26 43 views
2

我在Java中newbe,我已经得到了有关使用构造一些问题:对象问题。使用构造函数还是不行?

Map<String, Object> map = new HashMap<String, Object>(); 
     map.put("one", new String("Hello"));//1 
     map.put("two", "world");//2 

哪种说法更awfull?有什么区别?哪一个是最好的?

+6

对于'String'使用'2'。 –

+0

[在Java中表达式“new String(...)”的目的是什么意思?](http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-表达新串式-java的)。另请参阅http://stackoverflow.com/q/7277650/1281433,http://stackoverflow.com/q/13803505/1281433, –

回答

8

这两种形式都是一样的,但引擎盖下却有区别。如果使用String构造函数,则跳过内部字符串池,始终创建一个新对象 - 而使用字符串常量首先查找池中的字符串,如果它在那里找到它,则重用它(仅创建一个新字符串如果它之前不在池中) - 因此效率更高,因为它避免了不必要的对象实例化。顺便说一句,字符串可以从池中共享,因为它们是不可变的

许多静态代码分析工具会将String构造函数的用法标记为违反良好编程实践,并且通常应该避免它。

1

你应该做

map.put("two", "world");#2,方法将创建新的字符串每次不作为奥斯卡提到池中寻找已经存在的字符串。

2

第一招:

map.put("one", new String("Hello"));//1 

几乎不再需要。这会创建一个不必要的String对象。虽然它在运行时并不重要,因为它只是一个单独的对象。但是,在某些循环中使用时,肯定会有所作为。在循环中创建对象是昂贵的操作。


第二个在另一方面:

map.put("two", "world");//2 

将重新使用实习串从字符串文字池字面。字符串文字池是对在堆上创建的字符串对象的引用的集合。 Java自动执行字符串文字,以便相同字符串文字的多次使用不会每次都创建一个新的字符串对象。当第一次遇到字符串文字时,会在堆上创建一个对象,并将对该对象的引用存储在字符串文字池中。

在后续使用相同的字符串文字时,将使用来自文字池的相同字符串引用,而不是在堆上创建新的字符串对象。这是安全的,因为字符串是不可变的,我们可以共享对同一个String对象的引用。所以,这当然是更好的方法。