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 接口