ArrayList<>/List<> 与使用 String 数组并将其转换为 ArrayList<>
ArrayList<>/List<> vs using String array and conerting it to ArrayList<>
我目前正在 Udacity 上 Google 参加 Android 开发课程。
我看过一个我不完全理解的代码示例(只是一个基本的 Java 问题):
String strarrWeek [] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
List<String> lstWeek = new ArrayList<String>(Arrays.asList(strarrWeek));
这样做的原因是什么转换如果你可以:
ArrayList<String> arlstWeek = new ArrayList<String>();
arlstWeek.add("Sunday");
arlstWeek.add("Monday");
arlstWeek.add("Tuesday");
arlstWeek.add("Wednesday");
arlstWeek.add("Thursday");
arlstWeek.add("Friday");
arlstWeek.add("Saturday");
我是不是漏掉了什么?
谢谢。
+编辑:
有没有办法只使用 List<> / ArrayList<> 构造函数(我的意思是没有“.add()”调用),而不创建 "String []" 数组?
主要区别在于第一个代码片段可以直接放入代码的声明部分(即在构造函数和方法之外),而第二个代码片段必须在代码块中。这是因为第一个片段仅使用初始化构造,而第二个片段混合了初始化(构造函数)和执行(add
的调用)。
第一个构造使用一个数组和一个列表包装器,它们都被删除,因此它的内存效率不如第二个。第二个版本可以通过请求 ArrayList
在添加字符串之前用确切的项目数初始化来改进:
ArrayList<String> arlstWeek = new ArrayList<String>(7);
// ^
当您向集合中添加元素时,这会阻止集合增长时的重新分配。
在第一个示例中,您只有两个函数调用,在第二个示例中,您有 n 个函数调用。我更喜欢第一种方法——应用程序需要做的事情越少,失败的频率就越低。
它保持元素的顺序并且它可能与效率有关,因为 .add() 方法将使数组在每次调用时在内存中增长。
当然这只是猜测,这是我唯一能想到的优点。
所有答案都有点误导,技术上并非 100% 正确:
String strarrWeek [] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
此代码:
- 在声明中使用数组初始化的快捷语法
- 创建一个恰好包含 7 个项目的数组
- Java 中的数组始终是可变数据结构
List<String> lstWeek = new ArrayList<String>(Arrays.asList(strarrWeek));
此代码:
- 将首先创建一个固定大小的实例
List
,它将把列表中的更改同步回数组
- 然后通过遍历第一个
List
并将所有元素添加到新创建的实例中来创建额外的 List
实例
ArrayList<String> arlstWeek = new ArrayList<String>();
arlstWeek.add("Sunday");
arlstWeek.add("Monday");
arlstWeek.add("Tuesday");
arlstWeek.add("Wednesday");
arlstWeek.add("Thursday");
arlstWeek.add("Friday");
arlstWeek.add("Saturday");
此代码:
- 将创建具有默认大小的
ArrayList
的空可变实例,并将所有值放入集合
在示例的第二部分中,您可以使用更短的语法:
ArrayList<String> arlstWeek = new ArrayList<String>(){
{
add("Sunday");
add("Monday");
add("Tuesday");
add("Wednesday");
add("Thursday");
add("Friday");
add("Saturday");
}
};
我目前正在 Udacity 上 Google 参加 Android 开发课程。
我看过一个我不完全理解的代码示例(只是一个基本的 Java 问题):
String strarrWeek [] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
List<String> lstWeek = new ArrayList<String>(Arrays.asList(strarrWeek));
这样做的原因是什么转换如果你可以:
ArrayList<String> arlstWeek = new ArrayList<String>();
arlstWeek.add("Sunday");
arlstWeek.add("Monday");
arlstWeek.add("Tuesday");
arlstWeek.add("Wednesday");
arlstWeek.add("Thursday");
arlstWeek.add("Friday");
arlstWeek.add("Saturday");
我是不是漏掉了什么?
谢谢。
+编辑: 有没有办法只使用 List<> / ArrayList<> 构造函数(我的意思是没有“.add()”调用),而不创建 "String []" 数组?
主要区别在于第一个代码片段可以直接放入代码的声明部分(即在构造函数和方法之外),而第二个代码片段必须在代码块中。这是因为第一个片段仅使用初始化构造,而第二个片段混合了初始化(构造函数)和执行(add
的调用)。
第一个构造使用一个数组和一个列表包装器,它们都被删除,因此它的内存效率不如第二个。第二个版本可以通过请求 ArrayList
在添加字符串之前用确切的项目数初始化来改进:
ArrayList<String> arlstWeek = new ArrayList<String>(7);
// ^
当您向集合中添加元素时,这会阻止集合增长时的重新分配。
在第一个示例中,您只有两个函数调用,在第二个示例中,您有 n 个函数调用。我更喜欢第一种方法——应用程序需要做的事情越少,失败的频率就越低。
它保持元素的顺序并且它可能与效率有关,因为 .add() 方法将使数组在每次调用时在内存中增长。
当然这只是猜测,这是我唯一能想到的优点。
所有答案都有点误导,技术上并非 100% 正确:
String strarrWeek [] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
此代码:
- 在声明中使用数组初始化的快捷语法
- 创建一个恰好包含 7 个项目的数组
- Java 中的数组始终是可变数据结构
List<String> lstWeek = new ArrayList<String>(Arrays.asList(strarrWeek));
此代码:
- 将首先创建一个固定大小的实例
List
,它将把列表中的更改同步回数组 - 然后通过遍历第一个
List
并将所有元素添加到新创建的实例中来创建额外的List
实例
ArrayList<String> arlstWeek = new ArrayList<String>();
arlstWeek.add("Sunday");
arlstWeek.add("Monday");
arlstWeek.add("Tuesday");
arlstWeek.add("Wednesday");
arlstWeek.add("Thursday");
arlstWeek.add("Friday");
arlstWeek.add("Saturday");
此代码:
- 将创建具有默认大小的
ArrayList
的空可变实例,并将所有值放入集合
在示例的第二部分中,您可以使用更短的语法:
ArrayList<String> arlstWeek = new ArrayList<String>(){
{
add("Sunday");
add("Monday");
add("Tuesday");
add("Wednesday");
add("Thursday");
add("Friday");
add("Saturday");
}
};