代码1:
ArrayList arr = new ArrayList();
arr.add(3);
arr.add("ss");
代码2:
ArrayList<Object> arr = new ArrayList<Object>();
arr.add(3);
arr.add("ss");
代码3:
ArrayList<Object> arr = new ArrayList<Object>();
arr.add(new Integer(3));
arr.add(new String("ss"));
所有上述三个代码都工作正常..有人可以告诉我哪个是首选的,为什么...以及为什么eclipse编译器总是在没有提到Arraylist的参数类型时发出警告..提前感谢。
答案 0 :(得分:10)
第一个简单的规则:永远不要使用String(String)
构造函数,它绝对没用(*)。
所以arr.add("ss")
就好了。
3
略有不同:3
是int
字面值,不是对象。只有对象可以放入List
。因此,int
需要转换为Integer
对象。在大多数情况下,将自动为您完成(该过程称为自动装箱)。它有效地与Integer.valueOf(3)
做同样的事情,可以(并且会)在某些情况下避免创建新的Integer
实例。
因此,实际编写arr.add(3)
通常比使用arr.add(new Integer(3))
更好的主意,因为可以避免创建新的Integer
对象,而是重用和现有的。
免责声明:我关注的是第二个和第三个代码块之间的区别,而且几乎忽略了泛型部分。有关泛型的更多信息,请查看其他答案。
(*)有一些模糊的角落情况 有用,但是一旦你接近那些,你就会知道永远不要把绝对的陈述当作绝对的; - )
答案 1 :(得分:6)
第二个是首选:
然而,在同一个列表中有两种不同类型的对象有一点不好的设计气味。我们需要更多的背景来谈论这个问题。
答案 2 :(得分:3)
第二种形式是首选:
ArrayList<Object> arr = new ArrayList<Object>();
arr.add(3);
arr.add("ss");
使用泛型类型(例如ArrayList<T>
)时始终指定泛型参数。这排除了第一种形式。
至于最后一种形式,它更加冗长,并且做了额外的工作,没有任何好处。
答案 3 :(得分:2)
通过上面的操作,你可以打开运行时错误,除非你乐意接受你的arraylists可以包含字符串,整数和大象。
Eclipse返回一个错误,因为它不希望你不知道通过为泛型参数指定没有类型的事实,你为运行时错误打开了自己。至少在其他两个例子中你知道你可以在你的Arraylist中拥有对象,因为Inetegers和Strings都是对象Eclipse并不会警告你。
代码2或3都可以。但是如果你知道你的元组合中只有一个或只有一个字符串,那么我会做
ArrayList<Integer> arr = new ArrayList<Integer>();
或
ArrayList<String> arr = new ArrayList<String>();
分别
答案 4 :(得分:2)
实际上,第三个是首选:
ArrayList<Object> array = new ArrayList<Object>();
array.add(Integer.valueOf(3));
array.add("ss");
这可以避免自动装箱(Integer.valueOf(3)
与3
)并且不会创建不必要的String对象。
当你不使用像ArrayList这样的泛型类型的类型参数时,Eclipse会抱怨,因为你正在使用一种叫做raw类型的东西,这是不鼓励的。如果一个类是通用的(也就是说,它有类型参数),那么你应该总是对该类使用类型参数。
另一方面,Autoboxing是个人偏好。有些人对它好,有些则没有。我不喜欢它,我打开了自动装箱/自动装箱的警告。答案 5 :(得分:2)
您收到警告,因为ArrayList
是java泛型的一部分。从本质上讲,它是一种在编译时捕获类型错误的方法。例如,如果您使用Integer(ArrrayList<Integer>
)类型声明数组列表,然后尝试向其添加字符串,则在编译时会出现错误 - 避免在运行时发生令人讨厌的崩溃。
第一种语法是为了向后兼容,应该尽可能避免(请注意旧版java中没有泛型)。
第二和第三个例子几乎相同。由于您需要将对象而不是基本类型传递给add
方法,因此您的3
会在内部转换为Integer(3)
。通过在双引号中编写字符串,您实际上正在创建一个String
对象。调用String("ss")
时,您正在创建一个新的String
对象,其值与参数(“ss”)相同。
除非您确实需要在列表中存储不同类型,否则我建议使用正确的类型声明,例如: ArrayList<Integer> = new ArrayList<Integer>()
- 从长远来看,它会给你带来很多麻烦。
如果您确实需要列表中的多个数据类型,那么第二个示例更好。
答案 6 :(得分:2)
最后两个变体是相同的,int
会自动包装到Integer
,您需要Object
。如果你不在&lt;&gt;中写任何课程它默认为Object
。所以没有区别,但是如果你写Object
,那就更好了。
答案 7 :(得分:1)
Java 9中有一种更快速,更简单的方法,不需要太多代码:使用array (
'type' => 'template',
'altText' => 'this is a carousel template',
'template' =>
array (
'type' => 'carousel',
'columns' =>
array (
0 =>
array (
'thumbnailImageUrl' => 'https://example.com/images/item1.jpg',
'imageBackgroundColor' => '#FFFFFF',
'title' => 'this is menu',
'text' => 'description',
'actions' =>
array (
0 =>
array (
'type' => 'postback',
'label' => 'Buy',
'data' => 'action=buy&itemid=111',
),
),
),
1 =>
array (
'thumbnailImageUrl' => 'https://example.com/images/item1.jpg',
'imageBackgroundColor' => '#FFFFFF',
'title' => 'this is menu',
'text' => 'description',
'actions' =>
array (
0 =>
array (
'type' => 'postback',
'label' => 'Buy',
'data' => 'action=buy&itemid=111',
),
),
),
),
),
)
方法:
Collection Factory
答案 8 :(得分:0)
在第一个中你没有定义将在你的arraylist结构中保存和链接的类型
这是首选方法,您可以定义列表的类型,而ide将处理其余的
在第三个中,您最好为较短的代码定义List