我们掌握了Collection接口的使用后,再来看看Collection接口中的子接口和实现类,他们都具备那些特性呢?
接下来,我们一起学习Collection中的常用几个子接口:
java.util.List
集合接口
java.util.Set
集合接口
-
List接口底层维护的是可变数组,集合中的每个元素都有对应的索引,通过索引就可以精确的操作集合中的元素。
-
它是一个元素存取有序的集合。可以保证元素的存取顺序。
-
它是一个可以保存重复元素的集合,通过元素的equals方法。
List接口继承了父接口Collection中的所有方法,并且因为List底层维护的是可变数组,所以有自己的特有方法
-
public void add(int index, E element)
: 将指定的元素,添加到该集合的指定下标位置。 -
public E get(int index)
:返回集合中指定下标对应的元素。 -
public E remove(int index)
: 移除集合中指定下标对应的元素, 返回的是被移除的元素。 -
List接口中有重载的
remove()
方法,如果参数给定的为int类型,则调用的为List接口中特的方法。 -
public E set(int index, E element)
:用指定元素替换集合中指定下标的元素,返回被替换的元素。
步骤
-
创建集合测试类
-
使用多态的方式newList接口的实现类对象
-
1 public class ListDemo { 2 public static void main(String[] args) { 3 // 创建List集合对象 4 Listlist = new ArrayList<>(); 5 // 给集合中添加原始数据 6 list.add("西游记"); 7 list.add("红楼梦"); 8 list.add("水浒传"); 9 list.add("三国演义");10 System.out.println(list);11 // 使用List集合特有的指定具体下标添加元素的方法12 list.add(1,"天龙八部");13 list.add(3,"射雕英雄传");14 System.out.println(list);15 16 // 使用List集合的特有方法,获取指定下标对应的元素17 String s = list.get(1);18 System.out.println("s = " + s);19 20 // 使用List集合的特有方法,修改指定下标对应的元素21 String set = list.set(1, "神雕侠侣");22 System.out.println("set = " + set); // 返回的数据为修改前的数据23 24 /*25 使用List集合特有的方法,删除指定下标对应的数据。并返回被删除的数据。26 注意:在List接口中有重载的remove()方法存在。如果给定的参数为整数,27 则默认调用List接口中的remove方法。28 Collection: remove(Object obj )删除指定的元素29 List: remove(int index )删除指定下标对应的元素30 */31 String remove = list.remove(1);32 System.out.println("remove = " + remove);33 }34 }
List集合接口的特点为可以保存重复的元素,并且可以保证元素的存取顺序。因为集合底层使用的可变数组,所有List集合接口中的特有方法都是围绕下标进行操作的。
-
List集合继承Collection集合,所以可以直接使用
Iterator
对List集合进行遍历。 -
高级for循环底层使用的迭代器,所以List集合也可以使用高级for循环遍历。
-
因为List集合中的元素都有下标,而List集合中有基于下标获取对应元素的方法,所以List集合也可以使用普通for循环进行遍历。
-
注意:因为List集合有下标,所以List集合中有一个特有的迭代器
ListIterator
,可以通过特有方法listIterator()
获取,因为并不常用,所以自行测试即可。
步骤
-
创建List集合对象
-
给集合中添加一些数据
-
分别使用3种不同的方式,遍历List集合中的数据
1 public class Demo { 2 public static void main(String[] args) { 3 // 创建List集合对象 4 Listlist = new ArrayList<>(); 5 // 给集合中添加数据 6 list.add("西游记"); 7 list.add("红楼梦"); 8 list.add("水浒传"); 9 list.add("三国演义");10 11 // 使用迭代器对集合进行遍历12 for(Iterator it = list.iterator(); it.hasNext(); ) {13 System.out.println( it.next() );14 }15 // 使用高级for循环,遍历集合16 for( String next : list ) {17 System.out.println(next);18 }19 20 // 使用普通for循环遍历集合21 for( int i = 0; i < list.size();i++ ) {22 System.out.println(list.get(i));23 }24 }25 }
小结
因为在使用迭代器对集合操作的同时不能使用集合本身的方法在对集合进行操作。所以List集合在非遍历操作的情况下,一般都是使用普通for循环进行遍历。
简单说一下ArrayList的底层就可以了,具体用法和List一样
Array List的底层是数组 , 数组的特性就是 查询快 增删慢 , 因为数组是有下标的每个数据都会对应有一个自己的下标.
实际开发中对一个集合元素的添加与删除有时会涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
-
public void addFirst(E e)
:将指定元素插入此列表的开头。 -
public void addLast(E e)
:将指定元素添加到此列表的结尾。 -
public E getFirst()
:返回此列表的第一个元素。 -
public E getLast()
:返回此列表的最后一个元素。 -
public E removeFirst()
:移除并返回此列表的第一个元素。 -
public E removeLast()
:移除并返回此列表的最后一个元素。 -
public E pop()
:从此列表所表示的堆栈处弹出一个元素。 -
public boolean isEmpty()
:如果列表不包含元素,则返回true。
1 public class LinkedListDemo { 2 public static void main(String[] args) { 3 // 创建LinkedList集合对象 4 LinkedListlist = new LinkedList<>(); 5 // 特有方法给集合头尾添加元素 6 list.addFirst("abc"); 7 list.addFirst("bcd"); 8 list.addFirst("cde"); 9 list.addFirst("def");10 System.out.println(list);11 12 // 特有方法获取集合头尾的元素13 String first = list.getFirst();14 System.out.println("first = " + first);15 16 // 特有方法删除集合中的元素17 String removeFirst = list.removeFirst();18 System.out.println("removeFirst = " + removeFirst);19 System.out.println(list);20 21 // 特有方式遍历集合22 /* while( !list.isEmpty() ) {23 String pop = list.pop();24 System.out.println(pop);25 }*/26 // 使用removeFirst()方法代替pop()方法27 while( !list.isEmpty() ) {28 String s = list.removeFirst();29 System.out.println(s);30 }31 }32 }