java基础之十五->集合、泛型

一、容器的概念

java基础之十五->集合、泛型_第1张图片
java基础之十五->集合、泛型_第2张图片

二、容器API

java基础之十五->集合、泛型_第3张图片
特点:
1、可以存放不同类型的数据,二数组只能存放固定类型的数据
2、使用Arraylist子类实现的时候,初始化的长度是10,当长度不够的时候会进行自动扩容操作
api方法:
1、add:要求必须传入的参数是Object对象,因此写入基本数据类型的时候,包含了自动拆箱和自动装箱的过程
2、addAll:添加另一个集合的元素到此集合中
3、clear:清空集合的内容,但是集合对象不会被回收
4、contains:判断此集合中是否包含指定的元素
5、containsAll:判断此集合中是否包含另一个集合
6、equals:也是比较集合里面的元素是否相等
7、isEmpty:判断集合是否为空
8、remove:删除集合中的一个元素
9、removeAll:删除此集合中包含的另一个集合的元素
10、removeIf:判断此集合是否拥有另一个集合的所有元素
11、size:返回当前结合的元素个数
12、toArray:将集合转换成数组

示例

package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
    public static void main(String[] args) {
        Collection collection = new ArrayList();
        collection.add(1); // 看起来是个1,实际上是个包装类型,因为add方法要求的是Object类型
        collection.add(true);
        collection.add(1.23);
        collection.add("abc");
        System.out.println(collection);
        //添加一个元素到指定位置
        ((ArrayList)collection).add(0,"mashibing");
        System.out.println(collection);
        Collection collection1 = new ArrayList();
        collection1.add("a");
        collection1.add("b");
        collection1.add("c");
        collection1.add("c");
        //往集合里面加入另一个集合里面的内容
        collection.addAll(collection1);
        System.out.println(collection);
//        collection.removeAll(collection1);
//        System.out.println(collection);
        System.out.println(collection1.retainAll(collection));
        Object[] objects = collection.toArray();
        System.out.println(objects[1]);
    }
}

三、Collection接口

java基础之十五->集合、泛型_第4张图片

1、List 接口

java基础之十五->集合、泛型_第5张图片
java基础之十五->集合、泛型_第6张图片

特点:
1、可以存放不同类型的数据,二数组只能存放固定类型的数据
2、使用Arraylist子类实现的时候,初始化的长度是10,当长度不够的时候会进行自动扩容操作

Arraylist 示例
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add(1);
        list.add(true);
        list.add("a");
        System.out.println(list);
        System.out.println(list.get(0));
        System.out.println(list.indexOf("a"));
        System.out.println(list.lastIndexOf("a"));
        System.out.println("---------------");
        list.set(0,"b");
        System.out.println(list);
        System.out.println("----------------");
        List list1 = list.subList(0,2);
        System.out.println(list1);
        
    }
}
LinkedList 示例

java基础之十五->集合、泛型_第7张图片

package com.msbline.basic.collectionPkg;
import java.util.LinkedList;
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add(123);
        linkedList.add(false);
        linkedList.add("abc");
        System.out.println(linkedList);
        linkedList.add(0,"mashibing");
        System.out.println(linkedList);
        linkedList.addFirst("a");
        System.out.println(linkedList);
        linkedList.addLast("b");
        System.out.println(linkedList);
        System.out.println("element:"+linkedList.element());
        linkedList.offer("3333");
        System.out.println(linkedList);
        System.out.println("peek:"+linkedList.peek());
        System.out.println("poll:"+linkedList.poll());
    }
}
Vector 示例

1、Vector也是List接口的一个实现
2、Vector跟Arraylist一样,底层都是使用数组进行实现的
3、跟Arraylist的区别是:

(1)、Arraylist是线程不安全的,效率高,Vector是线程安全的效率低
(2)、Arraylist扩容的时候,是扩容1.5倍,Vector扩容的时候,是扩容2倍
package com.msbline.basic.collectionPkg;
import java.util.Vector;
public class VectorDemo {
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add(1);
        vector.add("abc");
        System.out.println(vector);
    }
}
小结

java基础之十五->集合、泛型_第8张图片

2、Set接口

java基础之十五->集合、泛型_第9张图片
java基础之十五->集合、泛型_第10张图片
java基础之十五->集合、泛型_第11张图片

TreeSet

java基础之十五->集合、泛型_第12张图片

1、底层是TreeMap,而TreeMap的底层又是红黑树实现的,根据树的特性,TreeSet只能存储相同类型的数据
2、红黑树也符合二叉树(也叫二叉平衡树)的特性,左边节点的值小于双亲节点,右边节点的值大于双亲节点
3、红黑树左右子树的深度差规则是最长路径不超过最短路径的2倍,避免树倾斜太大,保证查找的速度
4、树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话该怎么比较呢,需要自定义比较器,往TreeSet里面放的时候它才知道该根据什么进行比较和排序,也就是后面说的Comparable
package com.msbline.basic.collectionPkg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo {
    public static void main(String[] args) {
        //底层是红黑树实现的
        TreeSet treeSet = new TreeSet();
        treeSet.add(65);
        treeSet.add(1);
        treeSet.add(3);
        System.out.println(treeSet);
        
        TreeSet treeSet = new TreeSet();
        treeSet.add(new Person("a",20));
        treeSet.add(new Person("b",60));
        treeSet.add(new Person("c",80));
        treeSet.add(new Person("d",14));
        System.out.println(treeSet);
    }
}
package com.msbline.basic.collectionPkg;
public class Person implements Comparable{
    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
 public int compareTo(Object o) {
        Person p = (Person) o;
        if(p.age > this.age){
            return 1;
        } else if(p.age < this.age){
            return -1;
        } else {
            return 0;
        }
    }
    @Override
 public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}
HashSet

java基础之十五->集合、泛型_第13张图片

1、HashSet使用的是HashMap,而HashMap使用的是数组加链表来存储的,所以HashSet最终使用的也是数组加链表来存储数据的
2、如上图,如果有两个相同的对象往HashSet里面放的时候,如果没有重写对象的equals和HashCode方法,那么比较的是两个对象的地址,两个对象的地址不同,即使内容相同也能同时存在与HashSet中,解决方法是重写equals和HashCode方法
3、小结
java基础之十五->集合、泛型_第14张图片
package com.msbline.basic.collectionPkg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetDemo {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add("123");
        set.add("123");
        set.add(1);
        set.add(true);
        System.out.println(set);
        System.out.println(set.isEmpty());
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //将while循环改成for循环
        for(Iterator iter = set.iterator();iter.hasNext();){
            System.out.println(iter.next());
        }
    }
}

四、Map 接口

五、Iterable接口、Iterator接口

java基础之十五->集合、泛型_第15张图片
java基础之十五->集合、泛型_第16张图片
java基础之十五->集合、泛型_第17张图片

在Java代码中包含三种循环方式,do...while,while,for
还有一种增强for循环的方式,可以简化循环的编写
所有集合类都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环的能力,也就是for-each

Iterable的接口:

(1) iterator() 返回一个Iterator的具体实现
(2) foreach() 增强for循环

Iterator的接口:

(1) hasNext() 是否还有下一个元素
(2) next() 获取下一个元素

注意:

(1) 在使用iterator的过程中,如果删除(list.remove(o))其中的某个元素会报错,因为list和iterator是两个不同的对象,两个对象操作同一份数据,一个在遍历一个在删除,导致并发操作异常,因此,如果遍历的同时需要修改元素,就使用iterator来操作,由这一个对象对数据进行修改,便不会有并发操作这种异常
(2) ListIterator不仅可以向后遍历,还可以向前遍历,不过得先向后再向前,始终是通过cursor和lastret的指针来获取元素值及向下的遍历索引
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class IteratorDemo {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
//        for(int i = 0; i

六、泛型

java基础之十五->集合、泛型_第18张图片
当做一些集合的统一操作的时候,需要保证集合里面的数据类型是一致的,此时就需要泛型来进行限制
优点:

1、数据安全,只能放泛型规定的类型
2、获取数据时效率比较高

泛型的高阶应用

1、泛型类
在定义类的时候,在类名的后面加,起到占位的作用,类中的方法返回值类型和属性的类型都可以使用

示例
package com.msbline.basic.collectionPkg;
public class FaxingClass {
    private String name;
    private A a;
    public FaxingClass() {
    }
    public FaxingClass(String name, A a) {
        this.name = name;
        this.a = a;
    }
    public void show(){
        System.out.println("name:"+name+", id:"+a);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public A getA() {
        return a;
    }
    public void setA(A a) {
        this.a = a;
    }
}
package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.List;
public class FanXingDemo {
    public static void main(String[] args) {
        FaxingClass fxc = new FaxingClass<>();
        fxc.setName("zhangsan");
        fxc.setA("male");
        fxc.show();
        FaxingClass fxc1 = new FaxingClass<>();
        fxc1.setName("zhangsan");
        fxc1.setA(1);
        fxc1.show();
        FaxingClass fxc3 = new FaxingClass<>();
        fxc3.setName("zhangsan");
        fxc3.setA(new Person("lisi",1));
        fxc3.show();
    }
}

2、泛型接口

示例
package com.msbline.basic.collectionPkg;
public interface FanxingInterface {
    public B test();
    public void test2(B b);
}
package com.msbline.basic.collectionPkg;
public class FanXingInterfaceImpl implements FanxingInterface{
    @Override
 public String test() {
        return "abc";
    }
    @Override
 public void test2(String s) {
        System.out.println(s);
    }
}
FanXingInterfaceImpl fx1 = new FanXingInterfaceImpl();
System.out.println(fx1.test());
fx1.test2("1");

3、泛型方法
在定义方法的时候,指定方法的返回值和参数是自定义的占位符,可以是类名中的T,也可以是自定义的Q,只不过在使用Q的时候要定义在返回值的前面

示例
package com.msbline.basic.collectionPkg;
public class FanXingMethod {
    private T t;
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }
    public T test() {
//        return t;
        return (T) "aaa";
    }
    public  Q show(Q q){
        System.out.println(q);
        System.out.println(t);
        return q;
    }
}
FanXingMethod fxm = new FanXingMethod();
fxm.setT("ttt");
fxm.show(123);
fxm.show(true);
System.out.println(fxm.test());
4、泛型的上限(还不太理解)
如果父类确定了,所有子类都可以之间使用
java基础之十五->集合、泛型_第19张图片

5、泛型的下限(还不太理解)
如果子类确定了,子类的所有父类都可以直接传递参数值
image.png

普通泛型示例

package com.msbline.basic.collectionPkg;
import java.util.ArrayList;
import java.util.List;
public class FanXingDemo {
    public static void main(String[] args) {
        //加了泛型之后就只能放Person类型的对象
        List list = new ArrayList();
        list.add(new Person("zhangsan",10));
        for(int i = 0; i

你可能感兴趣的:(java)