一.Java中的List集合。
终于有时间来好好整理一下Java中的集合。
首先要讲的就是List集合。Java中List集合主要将两个:
第一个是底层使用数组维护的ArrayList,第二个是底层是链表的LinkedList。
1.List
List集合继承Collection集合,就是一个有序列表。
2.ArrayList
1.优点:由于底层维护的是数组,随机访问较为方便。可以动态扩容
2.初始化时的默认长度,以及动态扩容:默认长度为10,动态扩容是1.5倍。
3.实现的主要接口有:List接口,克隆接口,随机访问接口,序列化接口。
4.方法注意:clear(),不是将底层数组删除,而是将其设置为null
代码演示:
package Study_Collection; import java.util.ArrayList; import java.util.Arrays; public class ArrayListText { public static void main(String[] args) { ArrayList<String> arr=new ArrayList<>(3); arr.add("A"); arr.add(1,"B"); if( arr.contains("A")){ System.out.println("集合含有A元素"); }else{ System.out.println("集合不含有A元素"); } if(arr.get(0).equals("A")) { System.out.println("0号位为A"); }else{ System.out.println("0号位不为A"); } arr.addAll(arr); System.out.println("添加了自己后的arr集合:"+arr.toString()); System.out.println("在来测试一下我想要得到一个集合中没有的元素C的位置;"+arr.indexOf("C")); arr.removeAll(new ArrayList<>(Arrays.asList(new String[] {"A"} ))); System.out.println(arr.toString()); } }
3.LinkedList
1.优点:插入删除效率较高
2.缺点:随机访问效率较低,虽然提供了get(),set()方法,但是如果随机访问次数较多建议使用ArrayList。
3.特点:Java中链表为双端链表,所以他的迭代器也有双端迭代器。
代码实验:
package Study_Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; /** * LinkedList测试类 */ public class LinkedListText { /*** * LinkedList类是一个链表,java中的链表为双向链表 * 优点:善于插入删除 * 缺点:无法随机访问 */ public static void main(String[] args) { LinkedList<Integer> list=new LinkedList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5);//链表的add方法直接将元素加入到链表的末尾 //对于列表,它含有双向迭代器,当然也有单向迭代器 ListIterator<Integer> it= list.listIterator(); while(it.hasNext()){//it迭代器的指针在开头位置 it.next();//指针后移 } while(it.hasPrevious()){//现在it迭代器的指针在末尾 System.out.println(it.previous());//指针前移 } //在迭代器中的add方法() //在Collection接口中的add方法实现是直接加到末尾,但是迭代器的add是随着迭代器的位置去加入的。 it.next(); it.next(); it.add(6); while(it.hasPrevious()){ System.out.println(it.previous()); } //多个迭代器的问题 Iterator<Integer> it2=list.listIterator(); it.next(); it.remove(); it2.next();//抛出并发修改异常,解决方式:多个迭代器时,只有一个可以读与写其他的都是读。 /** * 对于链表而言虽然提供了get set方法但是效率太低,需要随机访问建议使用ArrayList */ System.out.println(list.get(0)); list.set(0,3); System.out.println(list.get(0)); } }
3.针对迭代器
package Study_Collection; import java.util.ArrayList; import java.util.Iterator; /** *迭代器 */ public class IteratorText { public static void main(String[] args) { /*** * 首先Collection接口实现了迭代器的方法所以实现了collection的类都可以使用迭代器 */ ArrayList<String> arr=new ArrayList<>(); arr.add("A"); arr.add("B"); Iterator<String> it=arr.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //能够实现foreach循环的必须实现iterator接口 for(String str : arr){ System.out.println(str); } //迭代器中的删除,是指删除上一次next()返回的元素,也就是说remove必须和next联合使用 it.next(); it.remove(); System.out.println(it.next()); } }