List接口和常用方法:
List接口是Collection接口的子接口:List.java
(1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
(2)List集合中的每个元素都有其对应的顺序索引,即支持索引。
(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
(4)JDK API 中List接口的实现类有:
JDK官方文档地址(所有版本):Java SE Specifications
我们进入手册进行查看:
我们可以看到所有已知实现类:
常用的有:
代码示例如下所示:
package com.rgf.list; import java.util.ArrayList; import java.util.List; public class List_ { @SuppressWarnings({"all"}) public static void main(String[] args) { //(1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复 List list = new ArrayList(); list.add("jdk"); list.add("jdbc"); list.add(15); list.add(15); System.out.println("list="+list); //(2)List集合中的每个元素都有其对应的顺序索引,即支持索引。 //(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素 //索引是从0开始的 System.out.println(list.get(1));//返回"jdbc" System.out.println(list.get(2));//返回15 } }
List接口的常用方法:
List集合里添加了一些根据索引来操作集合元素的方法:
package com.rgf.list; import java.util.ArrayList; import java.util.List; public class ListMethod { @SuppressWarnings({"all"}) public static void main(String[] args) { List list = new ArrayList(); list.add("沃尔"); list.add("快船"); //1.void add(int index,Object ele):在index位置插入ele元素 //在index=1的位置插入一个对象 list.add(1,"乔治"); System.out.println("list="+list); //2.boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来 List list1 = new ArrayList(); list1.add("小卡"); list1.add("祖八茨"); list.addAll(1,list1); System.out.println("list="+list); //3.Object get(int index):获得指定index位置的元素 System.out.println(list.get(1)); // 4.int indexOf(Object obj):返回obj在集合中首次出现的位置,如果不存在,返回-1. System.out.println(list.indexOf("沃尔"));//返回0 // 5.int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置,如果不存在,返回-1. list.add("沃尔"); System.out.println("list="+list); System.out.println(list.lastIndexOf("沃尔"));//返回5 // 6.Object remove(int index):移除指定index位置的元素,并返回此元素 list.remove(5); System.out.println("list="+list); //7.Object set(int index,Object ele):设置指定index位置的元素为ele,相当于是替换 list.set(2,"小莫里斯"); //如果我们的索引为10,即不存在的时候,我们会发现出现异常IndexOutOfBoundsException,索引越界的异常 //如果我们索引为5,即放在最后,也是不可以的,索引必须是存在的。 System.out.println("list="+list); // 8.List subList(int formIndex,int toIndex):返回从formIndex到toIndex位置的子集合,元素为在toIndex之前的。 //注意返回的子集合formIndex=
运行界面如下所示:
list接口实例练习1:
添加10个以上的元素(比如String "hello"),在2号位插入一个元素”快船总冠军“,获得第五个元素,删除第六个元素,修改第七个元素,在使用迭代器遍历集合,要求:使用List的实现类ArrayList完成。
我们的代码设计如下所示:
package com.rgf.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListExercise { @SuppressWarnings({"all"}) public static void main(String[] args) { // 添加10个以上的元素(比如String "hello"),在2号位插入一个元素”快船总冠军“,获得第五个元素, // 删除第六个元素,修改第七个元素,在使用迭代器遍历集合,要求:使用List的实现类ArrayList完成。 //要求:使用List的实现类ArrayList完成 List list = new ArrayList(); List list1 = new ArrayList(); // 添加10个以上的元素(比如String "hello") for (int i = 0; i < 12; i++) { list1.add("hello"+i); } System.out.println(list1); //我们也可以进行如下创建的list。 list.add(new String("快船")); list.add(12); list.add(new String("沃尔为首发控卫")); list.add(32); list.add(new String("小卡复出")); list.add(31); list.add(new String("乔大将军")); list.add(25); list.add(new String("争夺总冠军")); list.add(3); list.add(new String("泰伦卢")); System.out.println("list="+list); //在2号位(第二号元素,并不是索引为2)插入一个元素”快船总冠军“ list.add(1,"快船总冠军"); System.out.println("list="+list); // 获得第五个元素,索引为4 System.out.println("第五个元素="+list.get(4)); //删除第六个元素,索引为5 list.remove(5); System.out.println("list="+list); //修改第七个元素,因为上面删除了一个元素,修改第七个元素变成了修改第六个,即索引为5.看题要根据全题进行查看 list.set(5,"保罗乔治"); System.out.println("list="+list); //在使用迭代器遍历集合 Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); System.out.println("obj="+obj); } } }
运行界面如下所示:
总结:List的常用方法:
增:add(Object obj)删:remove(int index/remove(Object obj)
改:set(int index,Object ele)
查:get(int index)
插:add(int index,Object ele)
长度:size
遍历:(1)iterator迭代器方式
(2)增强for循环
(3)普通for循环。
List(List的三个子类)ArrayList、LinkedList、Vector)的三种遍历方式:
我们使用LinkedList完成,使用方式和Arraylist一样。
(1)方式一:使用iteratot.
Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); System.out.println("obj="+obj); }
(2)方式二:使用增强for循环
for (Object obj:list) { System.out.println("list="+obj); }
(3)方式三:使用普通for循环
for (int i = 0; i < list.size(); i++) { Object o = list.get(i); System.out.println("o="+o); }
我们进行代码示例如下所示:
package com.rgf.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; public class ListFor { @SuppressWarnings({"all"}) public static void main(String[] args) { // List 接口的实现子类 Vector LinkedList ArrayList List list = new ArrayList(); list.add("jdbc"); list.add("jdk"); list.add(15); System.out.println("list="+list); //使用iterator(迭代器)进行遍历 System.out.println("=========iterator迭代器=========="); Iterator it = list.iterator(); while (it.hasNext()) { Object o = it.next(); System.out.println("list1=" + o); } System.out.println("=======增强for循环========="); //使用增强for循环进行遍历 for (Object o1 :list) { System.out.println("list2="+o1); } //使用普通for循环进行遍历 System.out.println("========普通for循环=========="); for (int i = 0; i < list.size(); i++) { Object o2 = list.get(i); System.out.println("list3="+o2); } } }
List接口的实现子类 ArrayList LinkedList Vector
我们看看其他类怎么样。我们的代码如下所示:LinkedList
package com.rgf.list; import java.util.*; public class ListFor { @SuppressWarnings({"all"}) public static void main(String[] args) { // List 接口的实现子类 Vector LinkedList ArrayList List list = new LinkedList(); list.add("jdbc"); list.add("jdk"); list.add(15); System.out.println("list="+list); //使用iterator(迭代器)进行遍历 System.out.println("=========iterator迭代器=========="); Iterator it = list.iterator(); while (it.hasNext()) { Object o = it.next(); System.out.println("list1=" + o); } System.out.println("=======增强for循环========="); //使用增强for循环进行遍历 for (Object o1 :list) { System.out.println("list2="+o1); } //使用普通for循环进行遍历 System.out.println("========普通for循环=========="); for (int i = 0; i < list.size(); i++) { Object o2 = list.get(i); System.out.println("list3="+o2); } } }
Vector类:
package com.rgf.list; import java.util.*; public class ListFor { @SuppressWarnings({"all"}) public static void main(String[] args) { // List 接口的实现子类 Vector LinkedList ArrayList List list = new Vector(); list.add("jdbc"); list.add("jdk"); list.add(15); System.out.println("list="+list); //使用iterator(迭代器)进行遍历 System.out.println("=========iterator迭代器=========="); Iterator it = list.iterator(); while (it.hasNext()) { Object o = it.next(); System.out.println("list1=" + o); } System.out.println("=======增强for循环========="); //使用增强for循环进行遍历 for (Object o1 :list) { System.out.println("list2="+o1); } //使用普通for循环进行遍历 System.out.println("========普通for循环=========="); for (int i = 0; i < list.size(); i++) { Object o2 = list.get(i); System.out.println("list3="+o2); } } }
运行之后,我们发现我们的结果都是如下所示:
List接口实例练习2:
使用List的实现类添加三本图书,并遍历,打印如下效果:
名称:xx 价格:xx 作者:xx
名称:xx 价格:xx 作者:xx
名称:xx 价格:xx 作者:xx
要求:
(1)按价格排序,从低到高(使用冒泡法)
(2)要求使用ArrayList、LinkedList和Vector三种集合实现
我们先进行new一个类:ArrayList,然后新建一个Book类,然后进行创建它的构造方法,设置它的getter和setter,同时设置它的toString方法。我们的初步代码如下所示:
package com.rgf.list; import java.util.ArrayList; import java.util.List; public class ListExercise2 { public static void main(String[] args) { List list = new ArrayList(); } } class Book{ private String name; private int price; private String author; public Book(String name, int price, String author) { this.name = name; this.price = price; this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", price=" + price + ", author='" + author + '\'' + '}'; } }
我们编写的main方法如下所示:
public static void main(String[] args) { List list = new ArrayList(); list.add(new Book("水浒传",50,"施耐庵")); list.add(new Book("西游记",80,"吴承恩")); list.add(new Book("红楼梦",90,"曹雪芹")); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } }
我们进行运行之后,如下所示:
我们发现所打印出来的并不像题中的输出格式,我们进行重写toString方法:
//格式化的快捷键:Alt+ctrl+L public String toString() { return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t'; }
下面我们发现我们的要求里面有:按价格排序,从低到高(使用冒泡法)
我们进行编写sort方法进行排序:
public static void sort(List list){ int s = list.size(); for (int i=0;i
book2.getPrice()){//交换 list.set(j,book2); list.set(j+1,book1); } 我们的整体代码如下所示:
package com.rgf.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListExercise2 { @SuppressWarnings({"all"}) public static void main(String[] args) { List list = new ArrayList(); list.add(new Book("水浒传", 90, "施耐庵")); list.add(new Book("西游记", 50, "吴承恩")); list.add(new Book("红楼梦", 30, "曹雪芹")); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } //冒泡排序: sort(list); System.out.println("====排序后======"); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { Object next = iterator1.next(); System.out.println(next); } } //如何对集合进行排序: //静态方法 //价格要求是从小到大 public static void sort(List list){ int s = list.size(); for (int i=0;i
book2.getPrice()){//交换 list.set(j,book2); list.set(j+1,book1); } /* 我们的遍历思路如下所示: 当i=0的时候,i<2,i自加后为1,进入内层循环,j=0,j<2,j自加为1 我们取出水浒传90与西游记50比较,前者大于后者,进行交换,即为 50 90 30. 此时我们的j为1,仍然符合<2,我们继续进行比较, 我们取出交换过后的水浒传与红楼梦进行比较,前者大于后者,进行交换,即为50 30 90 此时j=2,不符合条件,第一次循环结束 之后我们进行第二层循环,i=1,i<2,i自增后为2,进入内层循环 j=0,j<1,j自增为1, 我们将西游记与红楼梦进行比较,前者大于后者,进行交换,即为30 50 90, 此时j为1,进行判断条件,已经不符合了,退出内层循环,循环结束。 */ } } } } class Book { private String name; private int price; private String author; public Book(String name, int price, String author) { this.name = name; this.price = price; this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override //格式化的快捷键:Alt+ctrl+L public String toString() { return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t'; } } 我们的运行界面如下所示:
我们利用LinkedList与Vector进行创建如下所示:
LinkedList类:package com.rgf.list; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class ListExercise2 { @SuppressWarnings({"all"}) public static void main(String[] args) { List list = new LinkedList(); list.add(new Book("水浒传", 90, "施耐庵")); list.add(new Book("西游记", 50, "吴承恩")); list.add(new Book("红楼梦", 30, "曹雪芹")); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } //冒泡排序: sort(list); System.out.println("====排序后======"); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { Object next = iterator1.next(); System.out.println(next); } } //如何对集合进行排序: //静态方法 //价格要求是从小到大 public static void sort(List list){ int s = list.size(); for (int i=0;i
book2.getPrice()){//交换 list.set(j,book2); list.set(j+1,book1); } /* 我们的遍历思路如下所示: 当i=0的时候,i<2,i自加后为1,进入内层循环,j=0,j<2,j自加为1 我们取出水浒传90与西游记50比较,前者大于后者,进行交换,即为 50 90 30. 此时我们的j为1,仍然符合<2,我们继续进行比较, 我们取出交换过后的水浒传与红楼梦进行比较,前者大于后者,进行交换,即为50 30 90 此时j=2,不符合条件,第一次循环结束 之后我们进行第二层循环,i=1,i<2,i自增后为2,进入内层循环 j=0,j<1,j自增为1, 我们将西游记与红楼梦进行比较,前者大于后者,进行交换,即为30 50 90, 此时j为1,进行判断条件,已经不符合了,退出内层循环,循环结束。 */ } } } } class Book { private String name; private int price; private String author; public Book(String name, int price, String author) { this.name = name; this.price = price; this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override //格式化的快捷键:Alt+ctrl+L public String toString() { return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t'; } } Vector类:
package com.rgf.list; import java.util.*; public class ListExercise2 { @SuppressWarnings({"all"}) public static void main(String[] args) { List list = new Vector(); list.add(new Book("水浒传", 90, "施耐庵")); list.add(new Book("西游记", 50, "吴承恩")); list.add(new Book("红楼梦", 30, "曹雪芹")); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } //冒泡排序: sort(list); System.out.println("====排序后======"); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { Object next = iterator1.next(); System.out.println(next); } } //如何对集合进行排序: //静态方法 //价格要求是从小到大 public static void sort(List list){ int s = list.size(); for (int i=0;i
book2.getPrice()){//交换 list.set(j,book2); list.set(j+1,book1); } /* 我们的遍历思路如下所示: 当i=0的时候,i<2,i自加后为1,进入内层循环,j=0,j<2,j自加为1 我们取出水浒传90与西游记50比较,前者大于后者,进行交换,即为 50 90 30. 此时我们的j为1,仍然符合<2,我们继续进行比较, 我们取出交换过后的水浒传与红楼梦进行比较,前者大于后者,进行交换,即为50 30 90 此时j=2,不符合条件,第一次循环结束 之后我们进行第二层循环,i=1,i<2,i自增后为2,进入内层循环 j=0,j<1,j自增为1, 我们将西游记与红楼梦进行比较,前者大于后者,进行交换,即为30 50 90, 此时j为1,进行判断条件,已经不符合了,退出内层循环,循环结束。 */ } } } } class Book { private String name; private int price; private String author; public Book(String name, int price, String author) { this.name = name; this.price = price; this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override //格式化的快捷键:Alt+ctrl+L public String toString() { return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t'; } } 我们的运行界面都是如下所示:
面试题如下:
package com.rgf.jihe; import java.util.ArrayList; import java.util.List; public class Iterator3 { //区分List中remove(int index)和remove(Object obj) public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add(3); updateList(list); System.out.println(list); } public static void updateList(List list){ list.remove(2); //索引为2,删除3,剩下1,2 } public static void updateList1(List list){ list.remove(new Integer(1)); //删除值为1, } }
运行之后如下所示: