JAVA第十三天(一)
List
有序的Collection,也叫序列、列表。
定义:此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引访问元素,并搜索到列表中的元素。
常用方法(存储)
boolean add(E e)
将指定的元素追加到此列表的末尾(可选操作)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
boolean b = list.add("元素"+i);
System.out.print(b+" ");
}
list.add("此元素被添加成功!");
System.out.println(list);
输出结果:
true true true true true [元素0, 元素1, 元素2, 元素3, 元素4, 此元素被添加成功!]
---------------------------------------------------------------------------------
void add(int index, E element)
将指定的元素插入此列表中的指定位置(可选操作)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("元素"+i);
}
list.add(2,"此元素被添加成功!");
System.out.println(list);
输出结果:
[元素0, 元素1, 此元素被添加成功!, 元素2, 元素3, 元素4]
---------------------------------------------------------------------------------
boolean addAll(Collection<? extends E> c)
按指定集合的迭代器(可选操作)返回的顺序将指定集合中的所有元素附加到此列表的末尾。
例:
Collection collection = new ArrayList();
for(int i = 0;i<5;i++) {
collection.add("集合元素"+i);
}
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
boolean b = list.addAll(collection);
System.out.println(b);
System.out.println(list);
输出结果:
true
[列表元素0, 列表元素1, 列表元素2, 列表元素3, 列表元素4, 集合元素0, 集合元素1,
集合元素2, 集合元素3, 集合元素4]
---------------------------------------------------------------------------------
boolean addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到此列表中的指定位置(可选操作)。
例:
Collection collection = new ArrayList();
for(int i = 0;i<5;i++) {
collection.add("集合元素"+i);
}
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
boolean b = list.addAll(2,collection);
System.out.println(b);
System.out.println(list);
}
输出结果:
true
[列表元素0, 列表元素1, 集合元素0, 集合元素1, 集合元素2, 集合元素3, 集合元素4,
列表元素2, 列表元素3, 列表元素4]
---------------------------------------------------------------------------------
常用方法(获取)
E get(int index)
返回此列表中指定位置的元素。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
String str = (String)list.get(4);
System.out.println(str);
输出结果:
列表元素4
---------------------------------------------------------------------------------
int size()
返回此列表中的元素数。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
System.out.println("此列表中的元素个数为:"+list.size());
System.out.println(list);
输出结果:
此列表中的元素个数为:5
[列表元素0, 列表元素1, 列表元素2, 列表元素3, 列表元素4]
---------------------------------------------------------------------------------
常用方法(遍历)
获取方法+for循环
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
for(int i = 0;i<list.size();i++) {
//当已知目标类型时,使用强转
//String str = (String)list.get(i);
//System.out.print(str+" ");
//当未知目标类型时,使用Object接收
Object obj = list.get(i);
System.out.print(obj+" ");
}
输出结果:
列表元素0 列表元素1 列表元素2 列表元素3 列表元素4
---------------------------------------------------------------------------------
ListIterator<E> listIterator()
返回列表中的列表迭代器(按适当的顺序)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
ListIterator liter = list.listIterator();
while(liter.hasNext()) {
String str =(String)liter.next();
System.out.print(str+" ");
}
输出结果:
列表元素4 测试插入 列表元素3 测试插入 列表元素2 测试插入 列表元素1 测试插入 列表元素0
---------------------------------------------------------------------------------
void add(E e)
将指定的元素插入列表(可选操作)。 (利用游标添加时,是先添加再去访问元素)
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
ListIterator liter = list.listIterator();
//liter.add("测试插入");
//此处的打印结果为[测试插入, 列表元素0, 列表元素1, 列表元素2, 列表元素3, 列表元素4]
while(liter.hasNext()) {
liter.add("测试插入");
String str =(String)liter.next();
System.out.print(str+" ");
}
System.out.println();
System.out.println(list);
输出结果:
列表元素0 列表元素1 列表元素2 列表元素3 列表元素4
[测试插入, 列表元素0, 测试插入, 列表元素1, 测试插入, 列表元素2, 测试插入, 列表元素3,
测试插入, 列表元素4]
---------------------------------------------------------------------------------
boolean hasPrevious()
返回 true如果遍历反向列表,列表迭代器有多个元素。
E previous()
返回列表中的上一个元素,并向后移动光标位置。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
ListIterator liter = list.listIterator();
while(liter.hasNext()) {
String str =(String)liter.next();
System.out.print(str+" ");
}
System.out.println();
while(liter.hasPrevious()) {
String str =(String)liter.previous();
System.out.print(str+" ");
}
输出结果:
列表元素0 列表元素1 列表元素2 列表元素3 列表元素4
列表元素4 列表元素3 列表元素2 列表元素1 列表元素0
---------------------------------------------------------------------------------
常用方法(删除)
E remove(int index)
删除该列表中指定位置的元素(可选操作)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
list.remove(2);
System.out.println(list);
输出结果:
[列表元素0, 列表元素1, 列表元素3, 列表元素4]
---------------------------------------------------------------------------------
boolean remove(Object o)
从列表中删除指定元素的第一个出现(如果存在)(可选操作)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素"+i);
}
list.add("中间元素");
list.add("列表元素4");
System.out.println(list);
list.remove("列表元素4");
System.out.println(list);
输出结果:
[列表元素0, 列表元素1, 列表元素2, 列表元素3, 列表元素4, 中间元素, 列表元素4]
[列表元素0, 列表元素1, 列表元素2, 列表元素3, 中间元素, 列表元素4]
---------------------------------------------------------------------------------
boolean removeAll(Collection<?> c)
从此列表中删除包含在指定集合中的所有元素(可选操作)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素一"+i);
}
List list2 = new ArrayList();
for(int i = 0;i<5;i++) {
list2.add("列表元素二"+i);
}
list.addAll(list2);
System.out.println(list);
list.removeAll(list2);
System.out.println(list);
输出结果:
[列表元素一0, 列表元素一1, 列表元素一2, 列表元素一3, 列表元素一4, 列表元素二0,
列表元素二1, 列表元素二2, 列表元素二3, 列表元素二4]
[列表元素一0, 列表元素一1, 列表元素一2, 列表元素一3, 列表元素一4]
---------------------------------------------------------------------------------
void clear()
从此列表中删除所有元素(可选操作)。
例:
List list = new ArrayList();
for(int i = 0;i<5;i++) {
list.add("列表元素一"+i);
}
list.clear();
System.out.println(list);
输出结果:
[]
---------------------------------------------------------------------------------
线程安全与不安全的解释
1、线程安全:
指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行程序时出现意外结果。
2、线程不安全:
是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
举例说明:假设售票系统有1000张票,A和B同时来买票,如果是线程不安全,那么可能售票系统可能出现1000-1去同时执行的情况,最终结果是A和B都买完后剩下999张票,而不是998张。
ArrayList
定义:可调整大小的数组,其实现了List接口。实现所有可选列表操作,并允许包括null在内的所有元素。
除了实现List的接口之外,该类还提供了一些方法来操纵内部用来存储列表的数组的大小。
特点:①ArrayList中的元素可以重复;②是有序的集合,长度不固定;③不是线程安全的;④效率高(多线程操作);
由于ArrayList是List的实现类,所以其方法与List的方法一致,详见jdkAPI
LinkedList
定义:List接口的链接列表的实现。实现所有可选的列表操作,并且允许包括null在内的所有元素。
除了实现List接口外,LinkedList类还为在列表开头及结尾get、remove和insert元素提供了统一的命名方法。这些操作允许将链接列表用作堆、栈、队列或双端队列。
特点:①LinkedList中的元素可以重复;②是有序的集合,长度不固定;③不是线程安全的;④效率高(多线程操作);
特有方法(简单列举,详见JdkAPI)
E element()
检索但不删除此列表的头(第一个元素)。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
Object obj = linkedList.element();
System.out.println(obj);
}
输出结果:
链表元素0
---------------------------------------------------------------------------------
E getFirst()
返回此列表中的第一个元素。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
Object obj = linkedList.getFirst();
System.out.println(obj);
输出结果:
链表元素0
---------------------------------------------------------------------------------
E getLast()
返回此列表中的最后一个元素。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
Object obj = linkedList.getLast();
System.out.println(obj);
输出结果:
链表元素3
---------------------------------------------------------------------------------
E peek()
检索但不删除此列表的头(第一个元素)。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
Object obj = linkedList.peek();
System.out.println(obj);
输出结果:
链表元素0
---------------------------------------------------------------------------------
E poll()
检索并删除此列表的头(第一个元素)。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
Object obj = linkedList.poll();
System.out.println(obj);
System.out.println(linkedList);
输出结果:
链表元素0
[链表元素1, 链表元素2, 链表元素3]
---------------------------------------------------------------------------------
E set(int index, E element)
用指定的元素替换此列表中指定位置的元素。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
linkedList.set(1, "此元素已被替换");
System.out.println(linkedList);
输出结果:
[链表元素0, 此元素已被替换, 链表元素2, 链表元素3]
---------------------------------------------------------------------------------
E pop()
从此列表表示的堆栈中弹出一个元素。换句话说,删除并返回此列表的第一个元素。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
Object obj = linkedList.pop();
System.out.println(obj);
System.out.println(linkedList);
输出结果:
链表元素0
[链表元素1, 链表元素2, 链表元素3]
---------------------------------------------------------------------------------
void push(E e)
将元素推送到由此列表表示的堆栈上。换句话说,在该列表的前面插入元素。
例:
LinkedList linkedList = new LinkedList();
for(int i = 0;i<4;i++) {
linkedList.add("链表元素"+i);
}
linkedList.push("此元素的被插入");
System.out.println(linkedList);
输出结果:
[此元素的被插入, 链表元素0, 链表元素1, 链表元素2, 链表元素3]
---------------------------------------------------------------------------------
泛型
使用:通过泛型指定一种集合中存储数据的数据类型。
作用:在对集合使用其方法对元素做操作时不用使用根类Object或指定数据类型进行强转,同样在使用迭代器时,元素的数据类型也会由泛型来指定。
例:定义一个元素类型为String的ArrayList
Collection<String> 集合名 = new ArrayList<String>();
<? extends E>
意思为要么为泛型本身,要么为泛型的子类。
自定义泛型(T、W、E)
这里的T、W、E是代表字母,在自定义泛型时可以按需自定义。(例如你创建了一个学生类,这个学生类的Student
也可以是一种泛型)
public class 类名<T>{
类体;
}
①所有泛型方法声明都有一个类型参数声明部分(<>
),该类型声明部分在返回值类型之前
。
②每一个类型参数声明部分包含一个或多个类型参数,参数间用,
隔开。一个泛型参数(类型变量),是用于指定一个泛型类型名称的标识符。
③类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
④泛型方法体的声明和一般方法一样。类型参数只能代表引用型类型,不能是原始类型(例:int、double等)。
1.泛型类是创建其对象的时候指明泛型的具体类型。
2.泛型方法是在调用方法的时候指明泛型的具体类型。
例:
1.类名<引用类型> 对象名 = new 类名<引用类型>();
2.访问限定修饰符<引用类型> 返回值类型 方法名(参数列表){方法体}