单列集合主要包括List和set两大类:list集合中的元素有序可重复,set集合中的元素无需不可重复。
注:若遇到要去除集合中重复元素的情况下,可以将数据存入set集合。
1. List:元素有序可重复
1. ArrayList:底层是通过数组来实现元素存储,所以再查找元素时效率较高(通过索引查找),但在对集合进行增加或删除操作时,都会重新创建一个新的数组,导致效率变慢,所以ArrayList不适合做大量的增删操作。
2. LinkedList:底层是通过一个双向循环链表存储元素的,所以增删较快,查找相对慢些。
3. Iterator迭代器(正向迭代)
主要用来遍历集合中的元素。
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();//声明一个list集合
Collections.addAll(list, 1.98,5,"hello",4,'d');//向集合中添加元素
Iterator<Object> it = list.iterator();//通过集合对象获取迭代器对象
while(it.hasNext()){//迭代
Object value = it.next();
System.out.println(value.toString());
}
}
控制台输出结果:
1.98
5hello
4
d
注:通过迭代器迭代的元素,对象类型为Object,在实际使用时可能需要进行类型转换。
在使用迭代器迭代的过程中,若删除某元素回导致迭代异常报错,如下
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();//声明一个list集合
Collections.addAll(list, 1.98,5,"hello",4,'d');//向集合中添加元素
Iterator<Object> it = list.iterator();//通过集合对象获取迭代器对象
while(it.hasNext()){//迭代
Object value = it.next();
if(value.toString()=="hello"){
list.remove(value);//list集合的删除方法移除元素
}
System.out.println(list);
}
}
解决方法1:在迭代过程中,删除元素后,执行break操作跳出循环
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();//声明一个list集合
Collections.addAll(list, 1.98,5,"hello",4,'d');//向集合中添加元素
Iterator<Object> it = list.iterator();//通过集合对象获取迭代器对象
while(it.hasNext()){//迭代
Object value = it.next();
if(value.toString()=="hello"){
list.remove(value);
break;
}
System.out.println(list);
}
}
解决方法2:使用迭代器本身的删除方法remove()删除元素
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();//声明一个list集合
Collections.addAll(list, 1.98,5,"hello",4,'d');//向集合中添加元素
Iterator<Object> it = list.iterator();//通过集合对象获取迭代器对象
while(it.hasNext()){//迭代
Object value = it.next();
if(value.toString()=="hello"){
it.remove();//迭代器方法移除元素
}
System.out.println(list);
}
}
4. ListIterator迭代器(反向迭代)
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();//声明一个list集合
Collections.addAll(list, 1.98,5,"hello",4,'d');//向集合中添加元素
Iterator<Object> it = list.listIterator(list.size());//通过集合对象获取反向迭代器对象
while(it.hasNext()){//迭代
Object value = it.next();
System.out.println(value.toString());
}
}
注:在迭代过程中若要删除元素,也需要使用迭代器本身的方法,否则会出现异常
5. forEach()循环
public static void main(String[] args) {
List<Object> lists = new ArrayList<Object>();//声明一个list集合
Collections.addAll(lists, 1.98,5,"hello",4,'d');//向集合中添加元素
for (Object list : lists) {
System.out.println(list);
}
}
注:在forEach循环过程中无法对元素进行操作
循环效率:for循环>迭代器>forEach循环
2. Set:不可重复
1. HashSet:根据对象的哈希值来确定元素在集合中的存储位置。存取和查找效率较快
2.TreeSet:以自平衡二叉树的方式存储元素,可以实现对集合中元素的排序
3. HashSet向集合中添加元素时,首先调用hashCode()方法确定元素存储的位置,之后调用equals()方法来确保没有重复元素。
若要确保集合中对象都不重复,则可在对象实体类中实现hashCode()和equals()方法。
4. TreeSet向集合中添加元素时,为确保元素的有序不可重复,内部会调用compareTo()方法进行比较排序。
Integer,Double,String等都实现了CompareTo(),所以在存储Integer等类型元素时,会自动排序去重,对于没有实现CompareTo()的类,要实现去重排序,可自定义实现。
5. 迭代器遍历set集合
public static void main(String[] args) {
Set<Object> sets = new HashSet<Object>();//声明一个set集合
Collections.addAll(sets, 1,4,32,23,'r',0.23);
Iterator<Object> it = sets.iterator();
while(it.hasNext()){
Object value = it.next();
System.out.println(value);
}
}