List接口
List接口的定义:
public interface List<E> extends Collection<E>
通过观察List接口的定义其继承的是Collection 接口

观察Collection常用方法
1 public boolean add(E e); 增加元素到集合
2 public boolean addAll(Collection<? extends E> c); 存放一个集合
3 public boolean contains(Object o); 查找集合中的元素
4 public boolean isEmpty() ; 判断一个集合是否为空
5 public boolean remove(Object o) 删除一个集合中的元素
6 public int size(); 返回集合中的长度
List扩展Collection中的方法
1public E get(int index); 根据指定索引取得元素
2 public E set(int index, E element) ; 替换元素, index要替换元素下标 element要替换的元素
3 public ListIterator<E> listIterator() List自己的迭代器
List接口的特点: 可重复的, 有序的
使用List list本身是一个接口,如果想要使用一个接口则可以使用该接口的实现类完成
List下面的实现类:
范例: 使用List 接口
public static void main(String[] args) { // 泛型的使用中 只能使用类 基本数据类型不行 List<Integer> array=new ArrayList<>(); array.add(4); //赋值 array.add(3); array.add(3); array.add(1); for(int i=0;i<array.size();i++) { System.out.println(array.get(i)); //通过get取值 } }//4331
通过使用ArrayList发现 其特点是 可重复的,并且有序的,顺序就存储时候的顺序
通过一个 add 增加元素到集合 通过get(index) 取出集合中的元素 下标的位置从0开始
观察其中的一些其他的操作方法:
1 判断集合是否为空 pulic boolean isEmpty();
2 取得集合中的长度 pulic int size();
3 删除集合中的元素 public boolean remove(Object obj);
// 泛型的使用中 只能使用类 基本数据类型不行 List<Integer> array=new ArrayList<>(); System.out.println(array.isEmpty()); array.add(4); //赋值 array.add(3); array.add(3); System.out.println(array.remove(1)); array.add(1); System.out.println(array.isEmpty()); System.out.println(array);
结果:
true
3
false
[4, 3, 1]
通过观察源码发现ArrayList 是一个对象数组, 每次增加的时候 会为数组扩容,数组长度是不能改变的,每次扩容数组内容拷贝的工作 ,
ArrayList如果频繁增加内容,效率不高, 但是查询的时候由于底层使用的是数组,所以查询效率会高。
面试题:
ArrayList保存自定义类:
首先观察使用系统自定义的类完成ArrayList类的添加
public static void main(String[] args) { // 泛型的使用中 只能使用类 基本数据类型不行 List<String> array=new ArrayList<>(); array.add("A"); array.add("B"); array.add("C"); System.out.println(array.contains("C")); for(String s:array) { System.out.println(s); } }
以上使用的类 为系统自定义的String类 其类功能已经非常完善了,现在使用用户自定义的类完成ArrayList的添加
范例:实现自定义类
public class Person { private String name; private int age; public Person(String name,int age) { this.name=name; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override //new Person("张三",20) public boolean equals(Object obj) { // 传进来要比较的内容 Person per=null; if(obj instanceof Person) { per=(Person)obj; // Object 向下转型 为 Person类型 } // this 当前的对象 Person 和 传进来的Person比较 if(this==per) { //内存地址 一样肯定是同样对象 return true; } if(this.age==per.age&&this.name.equals(per.name)) { return true; } return false; } }
调用一下
List<Person> list=new ArrayList<>(); list.add(new Person("张三",20)); list.add(new Person("李四",21)); list.add(new Person("王五",18)); System.out.println(list); System.out.println(list.remove(new Person("李四",21))); System.out.println(list);
如果equails方法没有重写
[Person [name=张三, age=20], Person [name=李四, age=21], Person [name=王五, age=18]] false [Person [name=张三, age=20], Person [name=李四, age=21], Person [name=王五, age=18]]
重写之后
[Person [name=张三, age=20], Person [name=李四, age=21], Person [name=王五, age=18]] true [Person [name=张三, age=20], Person [name=王五, age=18]]
通过代码,发现自定义类的时候,必须覆写equals方法才能完成集合中 对象查找和删除,主要原因是在于进行对象删除或者查找的时候,
集合中会判断传入的元素和集合本身的元素是否是内容相同的元素 只有相同才会删除或者查找
LinkedList类的定义
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
Cloneable 进行对象克隆的时候 必须实现该接口 才能有克隆的能力
Serializable : 要实现序列化的类 必须实现该接口才能有序列化的能力
特点: 插入方便 任意节点之间都可以插入 ,但是查询并不方便 效率不高
LinkedList的常用方法
1 public void addFirst(E e) ;
2 public void addLast(E e);
LinkedList<String> list=new LinkedList<>(); list.add("hello"); list.add("world"); list.add("java"); list.addFirst("hadoop"); list.addLast("hive"); for(String str:list) { System.out.println(str); }
// hadoop
hello
world
java
hive
ArrayList 与 LinkedList的区别?
ArrayList 基于数组开发的,查询的效率高, 但是修改数据效率低 会移动数组中的数据
LinkedList 基于链表开发的 ,两端插入的的时候效率高,但是查询的时候效率低(两端插入)
Set 接口
特点: 最大的特点 就是集合中的元素 不可重复 其也是Collection接口的子接口 , Set本身也是一个接口,同样不能直接使用,
需要实例化该接口的实现类 Set接口下面的实现类:
常用
1 TreeSet 有序 ,不可重复
范例: 观察TreeSet子类的使用
Set<String> all=new TreeSet<>(); all.add("B"); all.add("C"); all.add("A"); all.add("C"); //重复元素
System.out.println(arr);
输出//A B C
通过观察以上代码发现,TreeSet 存放的数据有以下两个特点:
1 有序 为什么有序?
2 不可重复 重复元素的区分 在TreeSet中是依靠compareTo方法是否返回0来判断的
TreeSet的排序是通过compreable 接口中的compareTo方法完成的 该方法返回 3个取值
分别为: 1 升序 - 1 降序 0 重复元素的判断
范例: 使用自定义类完成TreeSet
List<Person> list=new ArrayList<>();
list.add(new Person("张三",20));
list.add(new Person("李四",21));
list.add(new Person("王五",18));
System.out.println(list);
System.out.println(list.remove(new Person("李四",21)));
System.out.println(list);
程序运行出错:
Exception in thread "main" java.lang.ClassCastException: org.list.Person cannot be cast to java.lang.Comparable at java.util.TreeMap.compare(Unknown Source) at java.util.TreeMap.put(Unknown Source) at java.util.TreeSet.add(Unknown Source) at org.set.TreeSetDemo.main(TreeSetDemo.java:15)
说明在TreeSet中进行保存的时候,约定存储的类型必须实现一个接口,而这个接口就是comparable接口,如果没有这个接口则不能实现排序功能
范例:实现compareTo方法
@Override public int compareTo(Person o) { if(this.age>o.age) return 1; else if(this.age<o.age) return -1; return 0; }
之后的运行结果如下
[Person [name=张三, age=20], Person [name=李四, age=21], Person [name=王五, age=18]] true [Person [name=张三, age=20], Person [name=王五, age=18]]
List接口
List接口的定义:
|
public interface List<E> extends Collection<E> |
通过观察List接口的定义其继承的是Collection 接口
浙公网安备 33010602011771号