一:总结
1.希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据推荐使用ArrayList集合(有序,可重复,有索引),底层是基于数组的。
2.希望记住元素的添加顺序,且增删首尾数据情况较多推荐使用LinkedList集合(有序,可重复,有索引),底层基于双链表实现的。
3.不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快推荐使用HashSet集合(无序,不重复,无索引),底层基于哈希表实现的。
4.希望记住元素的添加顺序,业内有重复元素需要存储,且希望增删改查都快推荐使用LinkedHashSet集合(有序,不重复,无索引),底层基于哈希表和双链表。
5.如果要对元素进行排序,也没有重复元素需要存储,且希望增删改查都快推荐使用TreeSet集合,基于红黑树实现。
二:注意实现:集合的并发修改异常问题
1.使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。
2.由于增强for循环遍历集合就是迭代器遍历集合的简化写法,因此,使用增强for循环遍历集合,又同时删除集合中的数据时,程序也会出现并发修改异常的错误。(forEach也会出现并发修改异常问题)
3.如何保证遍历集合同时删除数据不出bug?
①使用迭代其遍历集合,但用迭代器自己的删除方法删除数据即可。
②如果能用for循环遍历是:可以倒着遍历并删除;或者从前往后遍历,但删除元素后做i--的操作。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Attention {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("迈克杰克逊");
list.add("许嵩");
list.add("周杰伦");
list.add("黑屋乐队");
list.add("张杰");
Iterator<String> it = list.listIterator();
while (it.hasNext()){
String ele = it.next();
if (ele.contains("杰")){
it.remove();//删除迭代器当前遍历的对象,每删除一个数据之后相当于在底层也做了for循环中的i--
}
}
System.out.println(list);
}
}
---------------------------------------------------------------------------------------------------------------------------------
可变参数
一:就是一种特殊形参,定义在方法,构造器的形参列表里,格式是:数据类型...参数名称;
二:可变参数的特点和好处
1.特点:可以不传数据1给它;可以传一个或同时传多个数据给它;也可以传一个数组给它。
2.好处:常常用来灵活的接受数据。
3.示例:
import java.util.Arrays;
public class ChangeableNumber {
public static void main(String[] args) {
go(45);
go(123,456,56,56,645);
go(new int[]{12,123,432,435,654});
}
//注意事项1:一个形参列表中,只能有一个可变参数。
//注意事项2:可变参数必须放在形参列表的最后面。
public static void go(int...num){
//可变参数在方法内部 本质就是一个数组
System.out.println(num.length);
System.out.println(Arrays.toString(num));
System.out.println("---------------------------------");
}
}
注意事项1:一个形参列表中,只能有一个可变参数。
注意事项2:可变参数必须放在形参列表的最后面。
注意事项3:可变参数在方法内部 本质就是一个数组。