JavaSE学习笔记day13

一,集合框架体系

定义:用来存储多个数据的一种容器,与数组不同的是。。

集合 数组
长度 可变 固定
存储的类型是否固定 数据类型不固定 数据类型固定
存储的类型 只能存储引用类型 基本和引用类型
功能 有属性和方法 没有方法,没有属性(lenght除外)

二,Collection

Collection : 是单列集合层次结构中的根接口

collection下的子实现类是:有的集合可以无序也可有序,可重复可不重复。

方法:

boolean add() 添加

boolean addAll() 添加所有

clear() 清除

size() 长度

remove() 删除

removeAll() 删除所有

contains() 判断是否包含

isEmpty() 判断是否为空

public static void main(String[] args) {
     // Collections 是接口的,演示需要创建子类对象,ArrayList
     Collection coll = new ArrayList();
     System.out.println(coll);

     coll.add("伟哥");
     coll.add(18);
     coll.add("爱吃海狗人参丸");
     coll.add(new Date());
     System.out.println(coll);
     // addAll(Collection c); 将集合中的所有元素,全部添加到当前集合
     Collection coll2 = new ArrayList();
     coll2.add("a");
     coll2.add("b");
     coll2.add("c");
     System.out.println(coll2);
     System.out.println(coll2.size());
     Collection coll3 = new ArrayList();
     coll3.add(1);
     coll3.add(2);
     coll3.add(3);
     coll3.add(coll2);
     System.out.println(coll3);
     System.out.println(coll3.size());

     Collection coll4 = new ArrayList();
     coll4.add(1);
     coll4.add(2);
     coll4.add(3);
     coll4.add("a");
     coll4.add("b");
     coll4.add("c");
     // boolean remove
     System.out.println(coll4);
     coll4.remove(1);
     System.out.println(coll4);
     // boolean removeAll 删除全部 可以用于删除两个集合的交集的部分元素
     coll4.removeAll(coll4);
     System.out.println(coll4);
 }


// retainAll() 交集部分全保留,不是交集的全部删除。
     Collection c1 = new ArrayList();
     c1.add("a");
     c1.add("b");
     c1.add("c");
     c1.add("d");

     Collection c2 = new ArrayList();
     c2.add("a");
     c2.add("b");
     c1.retainAll(c2);
     System.out.println(c1);

     // 判断是否包含 contains()
     Collection c3 = new ArrayList();
     c3.add("a");
     c3.add("b");
     c3.add("c");
     System.out.println(c3.contains("c"));
     System.out.println(c3.contains("A"));
     // 判断是否为空
     System.out.println(c3.isEmpty());;
     // 清理集合
     c3.clear();
     System.out.println(c3.isEmpty());

三,泛型

泛型就是一种比较宽泛的类型定义,是一种抽象的类型。

1.作用:消除强制类型转换。

泛型使用:

在类或者方法参数定义使用泛型字母来取代之前固定的数据类型。

add(Object obj) --> add(E e)


常见的泛型字母

E(element)T(target) K(key) V(value) ?(未知)

public static void main(String[] args) {
        // 设置泛型,一旦设置泛型就约束了集合只能存储该类型数据
        Collection <String>  c1 = new ArrayList<>();
        // 这么做的目的,为了消除强制类型转换。
        c1.add("a"); // 不能加入其他类型的参数。
    }

四,迭代(重要)

迭代(遍历),将集合元素迭代,目的是取出来元素。

Collection 根接口,提供了一个迭代器规范 iterator(),调用该方法返回

 Collection<String> c = new ArrayList<>();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        c.add("e");

        // 获得迭代器(里面拥有所有元素)
        Iterator<String> iterator = c.iterator();
		// 判断有没有下一个
        while (iterator.hasNext()){
            // 有下一个就返回
            String e = iterator.next();
            System.out.println(e);
// 体会一下泛型的好处       
Collection c1 = new ArrayList();
        c1.add("1");
        c1.add("2");
        c1.add(2);
        c1.add("4");
        c1.add("5");
        c1.add("6");
        Iterator iterator1 = c1.iterator();
        while (iterator1.hasNext()){
            String e = (String) iterator1.next();
            System.out.println(e);
        }

注意:

在迭代的过程中不能删除元素添加元素只能使用一次,必须要使用自身的添加和删除。

增强for循环

for(数据类型 变量名 : 要遍历的集合/数组){
 // ...
}
左则的数据类型,变量要根据集合/数组类定,变量是每次循环输出的东西。

List

List 是 Collection的子接口。

List是有序的集合:有序是指迭代顺序和和插入顺序。

特点:允许有重复的元素。

提供了可以针对索引下标操作元素的方法。

List接口中的方法大部分与父类接口Collection一样

但是除此之外的方法,确实提了可以通过下标操作元素的方法

void add(int index ,E e)

E remove(int index)

E get(int index)

E set(int index,E e)

List 是接口,没有办法演示其中的方法

List接口的两个实现类,Array List 和Link List;

Array List [重点]

array List 实现了List接口,即Array List也是有序集合,允许重复元素,且那些关于下标操作集合的方法Arra List都有。

Array List 底层是数组,大小可变是指它会扩容(不是真正的变化大小)

构造方法

  • ArrayList() 创建空集合,默认创建一个长度为10 的数组
  • ArrayList(Collection c) 创建一个集合,集合内容直接就是有指定的参数
  • ArrayList(int initialCapacity) 创建一个指初始化容量的数组。
    ArrayList list = new ArrayList<>();
        list.add(6);
        list.add(8);
        list.add(6);
        list.add(8);
//        for (Integer in : list) {
//            System.out.print(in);
//        }

        System.out.println();

        list.remove(2);
//        for (Integer in : list) {
//            System.out.print(in);
//        }
        list.add(1,7);
        System.out.println(list);

        list.set(2,0);
        System.out.println(list);

方法

void add(int index ,E e)

E remove(int index)

E get(int index)

E set(int index,E e)

底层原理

Array List 的底层是数组。默认的长度是10,但是存储元素多余10会扩容

如何扩容的?

  • 当加入元素时,先判断加入后会不会超出默认值。
  • 如果没有超出默认长度
  • add(Object0 ) 元素直接放后
  • add(int index,Object o) 先将该位置以后的元素依次往后移动一个,然后放放到该位置
  • 当加入元素时查看会不会超过容量,如果超出就扩容 阔为原来的1.5倍。
  • 将原来的数组拷贝到原来的数组
  • 然后再放入新元素

特点

1,有序 2,重复 3,查询更新效率低 4,删除插入效率低

应用场景 :适用于查询频率高的地方。经常查不经常改。

并发修改异常。

Linked List

是list的实现类,也是可以重复,有序,

且Link List集合也有关于下标的操作的集的方法,但是还提供一些,关于操作开头和结尾的方法

底层是使用链表实现:

特点

1.有序

2.允许重复

3.查找更新时相对效率比较低

4。插入删除时效率比较高

 LinkedList<Integer> ll = new LinkedList<>();
        ll.add(9);
        ll.add(4);
        ll.add(2);
        ll.add(8);
        ll.add(6);
        ll.add(8);
        System.out.println(ll);
        ll.add(3,5);
        System.out.println(ll);
        ll.set(3,50);
        System.out.println(ll);
        ll.remove(3);
        System.out.println(ll);


        // 特殊的方法 操作头尾
        // 获取一个头部
        System.out.println(ll.getFirst());
        // 获取最后一个
        System.out.println(ll.getLast());

        // 向头部插入
        ll.addFirst(0);
        System.out.println(ll);
        // 向尾部添加一个
        ll.addLast(66);
        System.out.println(ll);
        // peek() 获取移除第一个
        // poll() 获取并移除第一个
        // pop()

Array List Link List
特点
不同点
查询效率
删除效率
底层原理

总结:

Collection : 里面的方法都很常见,其中的方法必须记住。泛型会用就行。

迭代Iterator 或者 foreach都要会

Array List全部都是重点。创建集合,方法的使用,原理特点。

Link List 主要记住特点。

你可能感兴趣的:(javaSE-学习笔记,学习,java,数据结构)