一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
Java中的List接口、Set接口及实现类
掌握:
List接口及其实现类的特点及相关方法的用法;
集合元素遍历的5种方式:
1、普通for循环配合List接口中的size()和get()方法
2、使用Iterator迭代器及其方法
a:通过集合对象获取迭代器对象
b:通过迭代器对象的hasNext()方法判断有没有元素
c:通过迭代器对象的next()方法获取元素并移动到下一个元素位置
3、使用增强for循环
JDK5的新特性:
自动拆装箱,增强for,泛型。
增强for:
是for循环的一种,本质上是迭代器。
格式:
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
好处:
简化了数组和集合的遍历。的成员变量值是否相同。
4、使用JDK 8——forEach
forEach(Consumer action)方法是JDK 8中新增的遍历集合元素的方法,根据Lambda表达式特性,该方法所需要的参数是一个函数式接口。
list.forEach((Object o)->{System.out.println("迭代集合元素:"+o);});
5、JDK 8中还针对Iterator迭代器对象提供了一个forEachRemaining(Consumer action)方法来进行遍历,该方法同样需要一个函数式接口。
这里给出前三种遍历方法:
System.out.println("----普通for-----");
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
System.out.println(o);
}
System.out.println("----迭代器-----");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String str =(String)iterator.next();
System.out.println(str);
}
System.out.println("----增强for-----");
for (Object o : list) {
System.out.println(o);
}
ArrayList:
是由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
去除集合中自定义对象的重复值(对象的成员变量值都相同):
按照和字符串一样的操作,发现出问题了。
为什么呢?我们必须思考哪里会出问题?
通过简单的分析,我们知道问题出现在了判断上。而这个判断功能是集合自己提供的,所以我们如果想很清楚的知道它是如何判断的,就应该去看源码。contains()方法的底层依赖的是equals()方法。而学生类中没有equals()方法,这个时候,默认使用的是它父亲Object的equals()方法,Object()的equals()默认比较的是地址值,所以,它们进去了。因为new的东西,地址值都不同。按照我们自己的需求,比较成员变量的值,重写equals()即可。
使用List集合从1-36之间选出7个数,要求不能重复:
思路及步骤:
A:创建产生随机数的对象
B:创建一个存储随机数的集合。
C:定义一个统计变量。从0开始。
D:判断统计遍历是否小于7
是:先产生一个随机数,判断该随机数在集合中是否存在。
如果不存在:就添加,统计变量++。
如果存在:就不添加。
否:循环结束
E:遍历集合
Random rd=new Random();
List<Integer> numbers=new ArrayList<Integer>();
int count=0;
while(count<7){
int number=rd.nextInt(36)+1;
if(!numbers.contains(number)){
numbers.add(number);
count++;
}
}
numbers.forEach(i->System.out.print(i+"\t"));
LinkedList :
对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替)还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
LinkedList<String> list = new LinkedList<String>();
list.add("list2");
list.add("list3");
list.addFirst("list1");
list.addLast("list4");
for(String str : list) {
System.out.println(str);
}
System.out.println("链表头数据:"+ list.getFirst());
System.out.println("链表尾数据:"+ list.getLast());