列表(List)
即线性表
1. List是一个接口
接口:没有字段的抽象类
-
类似于数组,但数组只能放统一类型的数据
-
而List可以在其中放对象,对象可以用于许多个不同类型的属性
-
如Student的对象中可以包含name、age、hobby等等
-
直接new List()需要重写接口中的所有方法
public class Test { public static void main(String[] args) { new List() { @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public boolean contains(Object o) { return false; } @Override public Iterator iterator() { return null; } @Override public Object[] toArray() { return new Object[0]; } @Override public boolean add(Object o) { return false; } @Override public boolean remove(Object o) { return false; } @Override public boolean addAll(Collection c) { return false; } @Override public boolean addAll(int index, Collection c) { return false; } @Override public void clear() { } @Override public boolean equals(Object o) { return false; } @Override public int hashCode() { return 0; } @Override public Object get(int index) { return null; } @Override public Object set(int index, Object element) { return null; } @Override public void add(int index, Object element) { } @Override public Object remove(int index) { return null; } @Override public int indexOf(Object o) { return 0; } @Override public int lastIndexOf(Object o) { return 0; } @Override public ListIterator listIterator() { return null; } @Override public ListIterator listIterator(int index) { return null; } @Override public List subList(int fromIndex, int toIndex) { return null; } @Override public boolean retainAll(Collection c) { return false; } @Override public boolean removeAll(Collection c) { return false; } @Override public boolean containsAll(Collection c) { return false; } @Override public T[] toArray(Object[] a) { return new T[0]; } }; } }
2. 通常使用ArrayList和LinkedList去实现List接口
- ArrayList通过数组实现,便于遍历查找
- 追加元素,会新建一个把长度扩大一倍的数组,把原来的元素都拷贝新的数组中
- LinkedList通过链表实现,便于增删改
3. List不加泛型默认为Object类型的对象
public class Test01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("!");
for (Object s : list) {
System.out.println(s);
}
}
}
-
但如果不规定泛型,当多个list出现,都是Object类型,难以区分,因此最好还是加上泛型约束
public class Test01 { public static void main(String[] args) { List<String> list = new ArrayList(); list.add("hello"); list.add("world"); list.add("!"); for (String s : list) { System.out.println(s); } } }
4. List中都是引用对象
而不是在List中创建一个真实对象
4.1 8种基本数据类型不能创建对象,因此会用到对应的包装类
//整型
short ---> Short
int ---> Integer
long ---> Long
//浮点型
float ---> Float
double ---> Double
//字符型
byte ---> Byte
char ---> Character
//布尔型
boolean ---> Boolean
-
包装类会进行自动装箱和拆箱
//自动装箱 Integer a = 10;//把10包装成Integer类型赋给Integer类型的a //自动拆箱 int b = a;//把a拆包装后成为int类型赋值给int类型的bpublic class Test01 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(10); list.add(100); list.add(1000); for (int num : list) { System.out.println(num); } } }
4.2 引用对象
-
这里的2个
"world"显然不是同一个对象,但是在结果中还是删除了worldpublic class Test01 { public static void main(String[] args) { List<String> list = new ArrayList(); list.add("hello"); list.add("world"); list.add("!"); list.remove(new String("world")); for (String s : list) { System.out.println(s); } } } /* hello ! */- 因此可以判断不是比较地址
==,因为2个"world"不是同一个对象 - 而是使用了
equals()方法进行比较数值 - 而在String里实现了对equals的重写,所以会删除
"world"
- 因此可以判断不是比较地址
-
那么不使用提供的系统类,如String、Integer等,而是使用自定义的类,如Student、Person等,该如何去实现同样的操作呢?
-
判断两个对象的数值是否相等需要满足三个条件
-
自反——
x.equals(x) == true -
对称性——
x.equals(y) == y.equals(x) -
传递性——
x.equals(y),y.equals(z),则x.equals(z)//把自定义类作为泛型 public class Test03 { public static void main(String[] args) { List<Player> list = new ArrayList(); list.add(new Player("小明",15)); list.add(new Player("小红",14)); list.add(new Player("小刘",18)); list.add(new Player("小王",20)); //删除不了,因为不是同一个对象,需要重写equals比较方法 Player man = new Player("小明", 15); list.remove(man); //直接打印为false,重写equals后为true System.out.println(list.contains(man)); } } class Player{ String name; int age; public Player(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { String result = String.format("%d岁的%s",age ,name); return result; } @Override public boolean equals(Object obj) { boolean nameTF = false; boolean ageTF = false; //把obj类型强转为Player类型,从而可以拥有name和age属性 Player player = (Player) obj; //如果两个player的name和age都相等则视为同一个对象 if (player.name==null) { nameTF = false; }else if (this.name.equals(player.name)) { nameTF = true; }else { nameTF = false; } if (player.age<=0 || player.age>120) { ageTF = false; } else if (this.age == player.age) { ageTF = true; }else { ageTF = false; } return nameTF && ageTF; } }
-
-
5.创建不可改变的List
-
通常我们创建一个含有元素的List需要有,先创建List,再add元素进去
List<String> list = new ArrayList(); String[] s = "哈哈,嘿嘿,吼吼,呵呵".split(","); for (String temp : s) { list.add(temp); } -
而在java9中提供的
List.of方法创建List,但这个list是不可改变的List<String> list = List.of("哈哈","嘿嘿"); //无法改变 list.set(1, "呜呜"); // Fails //不支持null List.of("haha", "嘿嘿", null); // 异常:NullPointerException

浙公网安备 33010602011771号