三、java数据类型之List(集合)
需要导入的包:
import java.util.List;
import java.util.ArrayList;
(一)数据格式
[指定索引并强行插入, 不指定索引插入, 指定索引并按顺序插入]
UpdateTime--2017年12月6日16:10:19
(二)初始化
// 方式一:初始化list,当第一个元素添加后,容量大小将设为10
List<String> list01 = new ArrayList<String>();
// 方式二:初始化list并指定集合容量大小
List list02 = new ArrayList(8);
说明:
初始化的时候既可以指定集合初始容量大小也可以不指定,主要涉及的是内存的优化,以后需要再说;// TODO
初始化的时候既可以对泛型进行控制也可以不做泛型控制,建议添加泛型控制;
list集合的初始size为0,可容纳的元素数为1;
可容纳的元素个数为[0,list.size],每增加一个元素,size就会+1,并且可容纳的元素个数会随着list.size的递增而递增;
当现有容量无法承载时,容量会自动扩增,具体扩增多少,有待研究。// TODO
(三)常用操作
3.3.1 增
UpdateTime--2017年9月5日08:48:02
往List中插入数据有两种方式:
按顺序插入元素
语法:
list.add(element)
举例:
List<Object> list = new ArrayList<Object>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
将元素插入到List中指定位置
语法:
list.add(index, element)
用途:向集合中添加一个元素
说明:
使用这种方式插入元素的条件:该元素下标已在集合中存在;
插入后造成的影响:在该索引的内容变更为强行插入的内容,并且原来在该元素下标的内容及排在该元素下标后面的内容的索引号+1;
举例论证:
List<String> list = new ArrayList<String>();
list.add("不指定索引插入");
list.add(1,"指定索引并按顺序插入");
// list.add(5,"指定索引但间隔插入");// 运行时会报错:java.lang.IndexOutOfBoundsException: Index: 5, Size: 2;
// 因为超出了list的范围,此时list.size=2
System.out.println(list.toString());// [不指定索引插入, 指定索引并按顺序插入]
list.add(0,"指定索引并强行插入");
System.out.println(list.toString());// [指定索引并强行插入, 不指定索引插入, 指定索引并按顺序插入
往List中插入数据的第三种方式
语法:
list.putAll(list2)
用途:将一个集合中的所有元素拷贝到另一个集合当中
// 代码片断一
List<String> list = new ArrayList<String>();
list.add("不指定索引插入");
list.add(1,"指定索引并按顺序插入");
list.add(0,"指定索引并强行插入");
List<String> list2 = new ArrayList<String>();
list2.add("将list中的元素全部复制给list2");
// 将list中的元素全部复制给list2,返回Boolean类型结果,用于校验是否拷贝成功
boolean isCopySuccess = list2.addAll(list);
说明:
putAll()方法将list集合中的所有元素都拷贝到了list2集合中,该方法实现了完全拷贝而不是像Map那样只是对对象的引用。
// 接着上面的代码
// 清除list
list.clear();
// 打印list
System.out.println("list中内容为:" + list.toString());// {}
// 打印list2
System.out.println("list2中内容为:" + list2.toString());// [将list中的元素全部复制给list2, 指定索引并强行插入, 不指定索引插入, 指定索引并按顺序插入]
// 实验证明:list2中的内容并没有因为list中的内容清空而受到影响,即深层拷贝
3.3.2 删
语法:
list.remove(index/element)
用途:移除集合中一个指定的元素
用法一:按元素下标(index)进行移除
// 接着代码片断一
// 按元素下标进行移除
list2.remove(0);
System.out.println("移除list中的第一个元素后:" + list2.toString());// [不指定索引插入, 指定索引并按顺序插入, 将list中的元素全部复制给list2]
用法二:元素内容(element)进行移除
// 接着代码片断一
list2.add("将list中的元素全部复制给list2");
System.out.println(list2.toString());// [将list中的元素全部复制给list2, 指定索引并强行插入, 不指定索引插入, 指定索引并按顺序插入, 将list中的元素全部复制给list2]
// 按集合元素所对应的内容进行移除,这种方式只能移除第一次匹配到的元素
list2.remove("将list中的元素全部复制给list2");
System.out.println(list2.toString());// [指定索引并强行插入, 不指定索引插入, 指定索引并按顺序插入, 将list中的元素全部复制给list2]
按元素内容进行移除,这种方式只会移除第一次匹配到的元素
方式二:使用clear()
语法:
list.clear()
用途:清除集合中的所有元素
// 接着代码片断一
// 清除list
list.clear();
// 判断list集合是否为空
boolean isEmptyList = list.isEmpty();
if (isEmptyList) {
System.out.println("list中内容为:" + list.toString());// {}
}
语法:
list.set(index,content)
// 接着代码片断一
// 修改指定元素下标对应的内容
String updateMsg = list2.set(2, "");
System.out.println("下标为2的元素之前所代表的内容是:" + updateMsg);// 不指定索引插入
语法:
list.get(index)
// 接着代码片断一
// 获取指定元素下标所对应的内容
String elementMsg = list2.get(2);
System.out.println(elementMsg);// 不指定索引插入
3.3.5 迭代集合
/**
* 方法一:使用forEach遍历(推荐使用)
* 类型、别名、数组名
*/
for (Object li:list) {
System.out.println(li);
}
/**
* 方法二:使用迭代器1
*/
Iterator<Object> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
/**
* 方法三:使用迭代器方法2
*/
for (Iterator<Object> ite=list.iterator();ite.hasNext();) {
System.out.println(ite.next());
}
/**
*方法四: 使用for循环
*/
System.out.println("使用for循环遍历");
for (int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
(四)其他用法
UpdateTime--2017年7月21日08:55:01
3.4.1 非空判断
UpdateTime--2017年7月26日16:52:42
方法一:使用isEmpty()方法(推荐使用)
if (!list.isEmpty()) {
//对list进行操作
}
if (list.size() > 0) {
//对list进行操作
}
如果集合为空,返回的是0。
UpdateTime--2018年1月29日11:31:37
3.4.2 contains
用途:用于判断集合中是否包含指定字符串(该元素是否已经存在)
返回值:包含-TRUE,不包含-FALSE
(五)格式转换
3.5.1 List集合转换成json代码(List-->JSONArray)
List list = newArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray2 =JSONArray.fromObject( list );
更多介绍请移步文章:java-JOSN
UpdateTime--2017年12月6日17:28:37
共用代码
List<String> list2 = new ArrayList<String>();
list2.add("不指定索引插入");
list2.add("指定索引并按顺序插入");
list2.add("");
3.5.2 list转字符串(List-->String)
// list转字符串(List-->String)
String listStr = list2.toString();
System.out.println(listStr);// [不指定索引插入, 指定索引并按顺序插入, ]
说明:
转换后的字符串,两边分别包含的是"[]"
格式:"[str1, str2, str3, ...]"
进一步转换:去除[]
listStr.substring(1, listStr.length() - 1)
3.5.3 list转数组(list-->array)
// list转数组(list-->array)
// 方式一:这种方式只能用Object形式的[]接收,不能强制转换
Object[] array = list2.toArray();
System.out.println(Arrays.toString(array));// [不指定索引插入, 指定索引并按顺序插入, ]
// 方式二
String[] array2 = new String[list2.size()];
list2.toArray(array2);
System.out.println(Arrays.toString(array2));// [不指定索引插入, 指定索引并按顺序插入, ]
(六)进一步封装
UpdateTime--2017年5月31日17:42:03
3.6.1 大集合拆分成小集合
/**
* 拆分集合
* @param <T>
* @param resList
* 要拆分的集合
* @param count
* 每个集合的元素个数
* @return 返回拆分后的各个集合
*/
public static <T> List<List<T>> split(List<T> resList, int count) {
if (resList == null || count < 1)
return null;
List<List<T>> ret = new ArrayList<List<T>>();
int size = resList.size();
if (size <= count) { // 数据量不足count指定的大小
ret.add(resList);
} else {
int pre = size / count;
int last = size % count;
// 前面pre个集合,每个大小都是count个元素
for (int i = 0; i < pre; i++) {
List<T> itemList = new ArrayList<T>();
for (int j = 0; j < count; j++) {
itemList.add(resList.get(i * count + j));
}
ret.add(itemList);
}
// last的进行处理
if (last > 0) {
List<T> itemList = new ArrayList<T>();
for (int i = 0; i < last; i++) {
itemList.add(resList.get(pre * count + i));
}
ret.add(itemList);
}
}
return ret;
}
示例:见iBATIS文章中的批量插入
(七)功能实现
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!