17、泛型 List ArrayList LinkedList

1、泛型

1.1、概念
  • 泛型的形式:,中间定义的类型本能是八大基本类型
  • 泛型经常和集合一起使用
  • 泛型的引入:为了像定义数组一样在编译时就能检错

1.2、集合中泛型的运用
 				  List<String> arrayList = new ArrayList<>();
          arrayList.add("字符串类型");
//        arrayList.add(1);
//        arrayList.add(1.2);
//        arrayList.add('c');   报错 ,泛型指定为String类型
1.3、泛型方法

泛型方法的语法格式:

  • 两个E必须同时出现:第一个E是位置是返回值类型前
  • 第二个E是方法参数类型
public static <E>void method(E  a){}
1.4、泛型常定义的类型

image-20210719181139756.

2、集合Collection

2.1、集合的分类

image-20210719181314974.

注:最下面一层是实现类,其余都是接口,不能直接创建对象

集合的特点:长度可变

2.2、Collection接口的常用API

image-20210719181540501.

 Object[] objects = c.toArray();//将集合转换成数组
 System.out.println(Arrays.toString(objects));
  • 迭代器(iterator)遍历集合

迭代步骤:

  1. 获取迭代器 c.itreator();
  2. 判断是否有下一个迭代对象 c.hasnext();
  3. 获取当前迭代到的元素 c.next();
Iterator<Integer> it = c.iterator();
while (it.hasNext()){
Integer next = it.next();
System.out.println(next);
}

3、List接口

3.1、特点

数据是有序的,每个元素都有对应的下标

3.2、ArrayList

image-20210719182351412.

package cn.tedu.collection;
/*本类用于测试List接口*/

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("大力娃");
        list.add("头铁娃");
        list.add(3, "小蝴蝶");//在指定索引处添加元素
        System.out.println(list.indexOf("小蝴蝶"));//获取小蝴蝶第一次出现的索引
        System.out.println(list.lastIndexOf("小蝴蝶"));

        System.out.println(list.remove(5));
        System.out.println(list);
        System.out.println(list.get(3));
        System.out.println(list.set(6, "蝎子精"));
        System.out.println(list);
        System.out.println("=====================");

        List<String> list2 = new ArrayList<>();
        list2.add("1");
        list2.add("2");
        list2.add("3");
        list2.add("4");
        System.out.println(list2);
        System.out.println(list.addAll(1,list2));//从指定位置添加
        System.out.println(list);
        System.out.println(list.containsAll(list2));
        System.out.println(list.removeAll(list2));
        System.out.println(list);
    }
}

3.3、四种方式遍历ArrayList集合
  1. for循环
  2. 增强for循环
  3. 迭代器itreator
  4. listIterator
package cn.tedu.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class TestList2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("喜羊羊");
        list.add("美羊羊");
        list.add("懒羊羊");
        list.add("沸羊羊");
        /*集合的迭代方式:
        * 1、for循环   (List集合是有序的,元素有对应的下标)
        * 2、增强for循环
        * 3、iterator
        * 4、listIterator
        * */
//        method01(list);
//        method02(list);
//        method03(list);
        method04(list);

    }

    private static void method04(List<String> list) {
        /*listIterator可以逆序遍历*/
        ListIterator<String> stringListIterator = list.listIterator();
        while (stringListIterator.hasNext()){
            System.out.println(stringListIterator.next());
        }
    }

    private static void method03(List<String> list) {
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

    private static void method02(List<String> list) {
        for (String s : list) {
            System.out.println(s);
        }
    }

    private static void method01(List<String> list) {
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

3.4、LinkedList

移除首元素:list.element(); list.peek();

增加元素:list.offer();

移除首元素:list.poll();

package cn.tedu.list;
/*本类用于LinkedList的相关测试*/

import java.util.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {     
        LinkedList<String> list2 = new LinkedList<>();
        list2.add("水浒传");
        list2.add("西游记");
        list2.add("三国演义");
        list2.add("红楼梦");
        System.out.println(list2.element());//获取集合的首元素
        /*查询系列*/
        System.out.println(list2.peek());//获取集合的首元素

        /*新增系列*/
        System.out.println(list2.offer("聊斋志异"));//在集合最后添加元素
        System.out.println(list2.offerFirst("斗罗大陆"));
        System.out.println(list2.offerLast("斗破苍穹"));
        System.out.println(list2);

        /*移除系列*/
        System.out.println(list2.poll());//移除首元素
        System.out.println(list2.pollFirst());
        System.out.println(list2.pollLast());

    }
}

4、总结

1、Arraylist底层是数组,查询快但是插入修改慢,适合查询较多的场景

2、LinkedList底层是链表,查询慢但是插入修改快,适合增删多的场景

注意:LinkedList查询慢是指数据量大的情况下查询中间元素,单是查询首尾元素还是比较快的

image-20210720202104311.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值