Collection子接口一:List
-
通常用List替代数组
-
List集合类中的元素都是有序、可重复的,集合中的每个元素都有其对应的顺序索引
-
JDK API中List接口实现类常用的有:ArrayList、LinkedList、Vector
-
ArrayList、LinkedList、Vector的异同点:
- 同:三个类都实现了List接口,存储数据的特点相同:存储有序的、可重复的数据
- 异:ArrayList:为List的主要实现类,线程不安全,效率高:底层使用Object[] elementData存储;LinkedList:对于频繁的插入、删除操作,使用此类的效率比ArrayList效率高:底层使用双向链表存储;Vector:线程安全,效率低,底层使用Object[] elementData存储
-
ArrayList的源码分析:
-
jdk 7的情况下:
1.ArrayList list=new ArrayList();//底层创建了长度是10的Object[]数组elementData
2.list.add(123);//elementData[0]=new Integer(123)
…
list.add(11);//如果此次的添加使原来的elementDate数组容量不够,则扩容;默认情况下,扩容为原来的1.5倍,同时将原有数组中的元素复制到新的数组中
3.建议在开始时使用带参的构造器:ArrayList list=new ArrayList(int capacity)
-
jdk 8的情况下:
1.ArrayList list=new ArrayList();//底层Object[] elementData初始化为{},没有创建长度是10的Object[]数组elementData
2.list.add(123);//第一次调用add()时,底层才创建了长度是10的数组,并将数据123添加到elementData
-
总结:jdk 8相比jdk 7,延迟了数组的创建,节省了内存
-
-
LinkedList的源码分析
- LinkedList list=new LinkedList();//内部声明了Node类型的first和last属性,默认值为null
- list.add(123);//将123封装到Node中,创建了Node对象
- Node定义为:体现了LinkedList的双向链表的说法
-
Vector的源码分析:jdk 7和jdk 8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组,扩容时,默认扩容为原来的2倍
-
List接口方法:List处理从Collection集合继承的方法外,List集合里添加了一些根据索引来操作集合元素的方法,如下所示:
- void add(int index, object ele):在index位置插入ele元素
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //void add(int index, object ele):在index位置插入ele元素 arrayList.add(1,"BB"); System.out.println(arrayList);//[AA, BB, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] } }
- boolean addAll(int index, Collection eles):从index开始将eles中的所有元素添加进来
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] ArrayList arrayList1 = new ArrayList(); arrayList1.add(456); arrayList1.add(7); //boolean addAll(int index, Collection eles):从index开始将eles中的所有元素添加进来 arrayList.addAll(0,arrayList1); System.out.println(arrayList);//[456, 7, AA, CC, Java, 123, Thu Nov 19 16:39:58 CST 2020] } }
- Object get(int index):获取指定index位置的元素
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //Object get(int index):获取指定index位置的元素 System.out.println(arrayList.get(0));//AA } }
- int indexOf(Object obj):返回obj在集合中首次出现的位置
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //int indexOf(Object obj):返回obj在集合中首次出现的位置,如果不存在,则返回-1 System.out.println(arrayList.indexOf("CC"));//1 } }
- int lastIndexOf(Object obj):返回obj在集合中最后出现的位置
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); arrayList.add("CC"); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //int lastIndexOf(Object obj):返回obj在集合中最后出现的位置 System.out.println(arrayList.lastIndexOf("CC"));//5 } }
- Object remove(int index):移除指定index位置的元素,并返回此元素
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); arrayList.add("CC"); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //Object remove(int index):移除指定index位置的元素,并返回此元素 System.out.println(arrayList.remove(5));//CC } }
- Object set(int index,Object ele):设置指定index位置的元素为ele
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); arrayList.add("CC"); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //Object set(int index,Object ele):设置指定index位置的元素为ele arrayList.set(1,"BB"); System.out.println(arrayList);//[AA, BB, Java, 123, Thu Nov 19 16:50:40 CST 2020, CC] } }
- List subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置左闭右开的子集合
package www.bh.c.listtest; import java.util.ArrayList; import java.util.Date; import java.util.List; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("AA"); arrayList.add("CC"); arrayList.add("Java"); arrayList.add(123); arrayList.add(new Date()); arrayList.add("CC"); System.out.println(arrayList);//[AA, CC, Java, 123, Thu Nov 19 16:36:54 CST 2020] //List subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置左闭右开的子集合 List list = arrayList.subList(1, 3); System.out.println(list);//[CC, Java] System.out.println(arrayList);//[AA, BB, Java, 123, Thu Nov 19 16:50:40 CST 2020, CC] } }
-
List常用方法总结:
-
增:add(Object obj)
-
删:remove(int index) / remove(Object obj)
-
改:set(int index,Object obj)
-
查:get(int index)
-
插:add(int index,Object obj)
-
长度:size()
-
遍历:1.Iterator迭代器方式
2.增强for循环
3.普通循环
-
-
面试题:
package www.bh.c.listtest; import java.util.ArrayList; import java.util.List; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add(1); arrayList.add(2); arrayList.add(123); System.out.println(arrayList);//[1, 2, 123] //调用removeTest() removeTest(arrayList); System.out.println(arrayList);//[1, 2],删除了索引值所在的元素 } public static void removeTest(List list){ list.remove(2); } }
package www.bh.c.listtest; import java.util.ArrayList; import java.util.List; public class ListTest1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add(1); arrayList.add(2); arrayList.add(123); System.out.println(arrayList);[1, 2, 123] 调用removeTest() removeTest(arrayList); System.out.println(arrayList);//[1, 123],删除了时间的元素 } public static void removeTest(List list){ list.remove(new Integer(2)); } }