我是Java的新手,我对使用构造函数有一些疑问:
Map<String, Object> map = new HashMap<String, Object>();
map.put("one", new String("Hello"));//1
map.put("two", "world");//2
哪种说法更加糟糕?有什么区别?哪一个最好?
答案 0 :(得分:8)
两种形式都是一样的,但是引擎盖下有所不同。如果使用String
构造函数,则跳过内部字符串池,始终创建一个新对象 - 而使用字符串文字首先查找池中的字符串,如果在那里找到它,则重用它(仅如果之前不在池中,则创建一个新字符串) - 因此它更有效,因为它避免了不必要的对象实例化。顺便说一句,字符串可以从池中共享,因为它们是不可变的。
许多静态代码分析工具将String
构造函数用法标记为违反良好编程习惯,并且通常应该避免使用。
答案 1 :(得分:2)
第一个:
map.put("one", new String("Hello"));//1
几乎不需要。这会创建一个不必要的String
对象。虽然在运行时它并不重要,因为它只是一个对象。但是在某些循环中使用这样的东西时肯定会有所作为。循环中的对象创建是一项昂贵的操作。
另一方面是第二个:
map.put("two", "world");//2
将重新使用 String Literal Pool 中的实习字符串文字。 String文本池是对在堆上创建的字符串对象的引用的集合。 Java会自动插入String文字,因此多次使用相同的字符串文字不会每次都创建新的字符串对象。当第一次遇到字符串文字时,会在堆上创建一个对象,并且对该字符串文字池存储对该对象的引用。
在后续使用相同的字符串文字时,将使用文字池中的相同字符串引用,而不是在堆上创建新的字符串对象。这是安全的,因为Strings是不可变的,我们可以共享对同一个String对象的引用。所以,这肯定是更好的方法。
答案 2 :(得分:1)
你应该做
map.put("two", "world");
因为#2方法每次都会创建新的字符串,而不像Oscar提到的那样在池中查找已存在的字符串。