本节课我学习的主要内容有:
List接口
ArrayList类
LinkedList类
List接口:
泛型接口
顺序存储结构,可以存放相同的元素,包括NULL
顺序表中存放的元素都对应的提供了一个整数索引值。
我们可以通过这个索引值来对数据进行一系列操作。
get(int index)得到index索引位置处的值。
indexOf(Object o)得到o在表中的位置。
add(int index,Object o)在索引为index的位置存入o。
subList(int fromIndex,int toIndex)截取当前顺序表中从fromIndex处(包含fromIndex)开始到toIndex(不包含toIndex)之间的顺序表子表。
listIterator()双向遍历顺序表。
ArrayList适合随机查询情况多的情况下来使用。
ArrayList类:
可变长度数组,元素之间的关系是前驱后继的,容量每次增加原来的一半。
构造方法:
List<E>/ArrayList<E> name = new ArrayList<E>();建立一个空顺序表(可变长度数组形式)。
List<E>/ArrayList<E> name = new ArrayList<E>(int capacity)建立一个初始指定长度的空顺序表。
List<E>/ArrayList<E> name = new ArrayList<E>(Collection c)将集合c建立成一个顺序表。
LinkedList类:
双向链表,查询优化,提供二分查找,链表元素之间的关系是没有前驱后继的。
List<E>/LinkedList<E> name = new LinkedList<E>();建立一个空顺序表(数组形式)。
List<E>/LinkedList<E> name = new LinkedList<E>(Collection c)将集合c建立成一个顺序表。
LinkedList适合元素插入和删除多的情况下来使用
新增的方法:
void addFirst/Last(Object o) 将o插入表头/表尾。
Object getFirst/Last() 获得表头/表尾。
Object removeFirst/Last() 移除并返回表头/表尾。
Object peekFrist/Last() 检索表头/表尾元素不进行操作。
Object pollFrist/Last() 检索表头/表尾元素并删除。
ListTest01类(测试以上三个东西):
package LessonForList01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
class Game
{
private String name;
public Game(String name)
{
this.name = name;
}
@Override
public String toString()
{
return this.name;
}
}
public class ListTest01
{
public static void main(String[] args)
{
List<String> l1 = new ArrayList<String>();
//也可以ArrayList<String> al1 = new ArrayList<String>();我个人喜欢这样
//向顺序表中添加元素
l1.add("a");
l1.add("c");
l1.add("d");
l1.add("f");
l1.add("e");
l1.add(0, "ZLM");
l1.add(0, "HLW");
System.out.println("顺序表l1的当前长度为:"+l1.size());
//遍历顺序表l1
// for (String s:l1)
// {
// System.out.println("顺序表中的元素有:"+s);
// }
Iterator<String> str1 = l1.iterator();
while (str1.hasNext())
{
System.out.println("顺序表中的元素有:"+str1.next());
}
System.out.println("---------------------------------");
//截取顺序表
List<String> l2 = new ArrayList<String>(l1.subList(0, 2));
System.out.println("顺序表l2的当前长度为:"+l2.size());
System.out.println("被截取后的顺序表l1长为:"+l1.size());
//可见该截取方法并不会影响原顺序表中的内容
Iterator<String> str2 = l2.iterator();
while(str2.hasNext())
{
System.out.println("l1被截取第0~1位上的元素作为l2的表的内容此时表中元素为:"+str2.next());
}
//str1中的指针指到最后了了所以得创建新的迭代器来遍历,我们也可以选择for循环或者for-each方法。
Iterator<String> str3 = l1.iterator();
while (str3.hasNext())
{
System.out.println("顺序表中的元素有:"+str3.next());
}
System.out.println("---------------------------------");
//判断包含
System.out.println("l2表中是否包含叫做ZLM的字符串:"+l2.contains("ZLM"));
ArrayList<Game> a1 = new ArrayList<Game>();
Game g1 = new Game("MHW");
Game g2 = new Game("MHW");
Game g3 = new Game("Rario");
a1.add(g1);
a1.add(g3);
//这里调用的是Object类中的equals方法来比较的,比较地址。
System.out.println("l2表中是否包含叫做ZLM的字符串:"+a1.contains(g2));
//双向遍历
ListIterator<Game> game1 = a1.listIterator();
//顺序
while (game1.hasNext())
{
System.out.println("a1中有啥元素:"+game1.next());
}
//倒序
while (game1.hasPrevious())
{
System.out.println("a1中有啥元素:"+game1.previous());
}
System.out.println("-----------------------");//LinkedList测试
LinkedList<String> lk1 = new LinkedList<String>(l1);
lk1.forEach(System.out::println);
lk1.addFirst("LTW");
lk1.addLast("ZYH");
lk1.forEach(System.out::println);//向表中添加元素并遍历
System.out.println("lk1中的第一个元素:"+lk1.peekFirst());
System.out.println("lk1中的最后一个元素:"+lk1.peekLast());
System.out.println("移除lk1中的第一个元素名为:"+lk1.pollFirst());
System.out.println("移除lk1中的最后一个元素名为:"+lk1.pollLast());
lk1.forEach(System.out::println);//删除后再次遍历表
}
}
本篇部分文字来源于:
咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
在这里十分感谢老师能够给我带来学习的激情。
2020.10.31
本文章是本人学习笔记,不进行任何商用所以不支持转载请理解!也请别拿去商用!
如果觉得对你有帮助那么欢迎你随时来回顾!
只为记录本人学习历程。
毕