三、List集合
特点
- 有序,打印输出的顺序和添加时的顺序一致(不会帮你自动排序)
- 有下标,可以通过下标的形式访问对象
- 元素可以重复
方法
- void add(int index,Object o) //在index位置插入元素
- boolean addAll(int index,Collection c) //将一个集合中的元素添加到次集合中的index位置
- Object get(int index) //返回集合中指定位置的元素
- List subList(int fromIndex,int toIndex) //返回二者之间的元素
package com.zheng.demo1;
import java.util.ArrayList;
import java.util.ListIterator;
public class MyList2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(2);
list.add(3);
list.add(1);
list.add(5);
list.add(2);
list.add(4);
System.out.println("通过下标访问:" + list.get(0));
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
}
}
listIterator:迭代器
hasNext(); 查看是否有下一个元素。有为true,无为false
- next(); 取出下一个元素的值
- hasPrevious();查看前一个元素是
- previous();取出前一个元素
- remove(); 删除当前元素
package com.zheng.demo1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class MyList {
public static void main(String[] args) {
//创建一个list集合容器
List list = new ArrayList();
//添加数据
list.add("1-小红");
list.add("2-小黑");
list.add("3-小青");
list.add("4-小紫");
System.out.println("当前集合大小" + list.size());
//一般的遍历
System.out.println("=========一般的遍历=======");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("=========增强for循环遍历=======");
//增强for循环遍历
for (Object o : list) {
System.out.println(o);
}
System.out.println("=========一般的迭代器遍历=======");
//一般的迭代器遍历
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("=========list迭代器从前到后遍历=======");
//list特有的
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
String str = (String) listIterator.next();
System.out.println(str);
}
System.out.println("=========list迭代器从后到前遍历=======");
while (listIterator.hasPrevious()) {
Object obj = listIterator.previous();
System.out.println(obj);
}
}
}
List实现类
1、ArrayList【重点】
- 数据结构实现,查询快(数组是连续的存储地址)。增删慢(每增加或者删除都要移动大量的数据。末尾快一点)
- jdk1.2版本。运行效率高,线程不安全
2、Vector:
- 数组结构,查询快,增删慢
- jdk1.0版本,运行效率低,线程安全
3、LinkedList
- 链表结构实现,增删快(不连续的存储空间,只需要改变节点之间的指向)查询慢
package com.zheng.demo1;
import java.util.LinkedList;
import java.util.ListIterator;
public class MyLinkList {
public void print(LinkedList<Student> students) {
//迭代器遍历
System.out.println("======迭代器遍历======");
ListIterator<Student> studentListIterator = students.listIterator();
while (studentListIterator.hasNext()) {
Student student = studentListIterator.next();
System.out.println(student);
}
}
public static void main(String[] args) {
MyLinkList myLinkList = new MyLinkList();
//1、创建一个容器
LinkedList<Student> students = new LinkedList<>();
//2、创建对象
Student student1 = new Student(1, "小黑", "周口");
Student student2 = new Student(2, "小名", "沈丘");
Student student3 = new Student(3, "小郑", "范营乡");
Student student4 = new Student(4, "小芳", "666");
//3、将对象加入集合
students.add(student1);
students.add(student2);
students.add(student3);
students.add(student4);
//查看
System.out.println(students.toString());
//调用迭代器遍历
myLinkList.print(students);
//删除
System.out.println("=====删除某个元素=====");
students.remove(1);
myLinkList.print(students);
}
}
四、泛型
jdk1.5中引入的新特性。本质是参数化类型,把类型当做参数传递
- 泛型接口、泛型方法、泛型类
- <T,…> T为占位符,表示一种引用类型
- 优点:(1)、提高代码的复用。(2)、防止类型转换异常,提高代码的安全性
1、泛型类
泛型变量
- 泛型作为传递的参数
- 泛型作为方法的返回值
注意:
- 泛型只能使用引用类型
- 不同泛型类型对象之间不能相互赋值
package com.zheng.demo2;
//泛型类
public class MyGeneric<T> {
T t;//1、泛型变量
//2、泛型作为传递的参数
public void show(T t) {
System.out.println(t);
}
//3、泛型作为方法的返回值
public T getT() {
return t;
}
}
package com.zheng.demo2;
public class TestMyGeneric {
public static void main(String[] args) {
//使用泛型类创建对象
MyGeneric<String> sm = new MyGeneric<>();
sm.t = "你好";
sm.show("呦呦呦");
System.out.println(sm.getT());
System.out.println("=============");
MyGeneric<Integer> im = new MyGeneric<>();
im.t = 999;
im.show(666);
System.out.println(im.getT());
}
}
2、泛型接口
package com.zheng.demo2;
public interface MyInterface<T> {
T show(T t);
}
实现类
package com.zheng.demo2;
public class MyInterfaceImpl1 implements MyInterface<Integer>{
@Override
public Integer show(Integer integer) {
return integer;
}
public static void main(String[] args) {
MyInterfaceImpl1 impl1 = new MyInterfaceImpl1();
System.out.println(impl1.show(999));
}
}
2、
package com.zheng.demo2;
public class MyInterfacetImpl implements MyInterface<String>{
public String show(String s) {
return s;
}
public static void main(String[] args) {
MyInterface omf = new MyInterfacetImpl();
System.out.println(omf.show("hhhhhh"));
}
}
3、
package com.zheng.demo2;
public class MyInterfaceImpl2<T> implements MyInterface<T> {
@Override
public T show(T t) {
return t;
}
public static void main(String[] args) {
MyInterfaceImpl2<String> impl2 = new MyInterfaceImpl2<>();
System.out.println(impl2.show("daoajao"));
System.out.println("============");
MyInterfaceImpl2<Double> impl21 = new MyInterfaceImpl2<>();
System.out.println(impl21.show(520.1313));
}
}
3、泛型方法
package com.zheng.demo2;
public class MyGenericMethod {
//泛型方法
public <T> T show(T t) {
System.out.println("泛型方法" + t);
return t;
}
public static void main(String[] args) {
System.out.println(new MyGenericMethod().show(5));
System.out.println("=============");
System.out.println(new MyGenericMethod().show("哈哈哈哈"));
}
}