Java学习 DAY16 列表、迭代器

8 篇文章 0 订阅
1 篇文章 0 订阅

List

实现类:ArrayList、LinkedList、Vector、Stack

***ArrayList:***底层由数组实现数据存储,默认初始容量为10,数组底层扩容根据右移运算每次扩容一半

***ArrayList(顺序表)***:底层由数组实现的数据,,默认初始容量为10,内存连续,需要扩容底层根据右移运算进行扩容,每次扩容都是在原容量的基础上增加一半。增删效率较低、查询效率较高。线程不安全的集合。
小练习:用数组实现ArrayList

package cn.tedu.collection.list;

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

public class ListDemo {
    public static void main(String[] args) {
        //创建集合对象
        //向上造型的对象
        List<String> list=new ArrayList<>();
        //添加元素
        list.add("abc");
        list.add("bc");
        list.add("ac");
        list.add("ab");
        //插入元素
        //最大支持的插入下标是元素个数
        //IndexOutOfBoundsException---下标越界异常
        //list.add(5,"123");

        //根据下标来删除元素
        //最大支持删除下标是元素个数减1
        //list.remove(2);

        //根据指定内容来删除元素
        //如果指定内容没有出现在元素中就不做任何操作
        list.remove("a1b");

        //清空集合
        //list.clear();

        //判断指定内容是否包含在元素中
        //System.out.println(list.contains("ac"));

        //根据指定下标来获取元素
        //System.out.println(list.get(0));

        //返回指定内容第一次出现的下标值
        //System.out.println(list.indexOf("ab"));

        //判断是否是一个空集合
        //System.out.println(list.isEmpty());

        //替换元素
        /*list.remove(0);
        list.add(0,"123");*/
        //list.set(0,"123");

        //返回元素个数
        //System.out.println(list.size());

        //截取子列表
        //指定下标含头不含尾
        //System.out.println(list.subList(1,3));

        //把集合元素放到数组当中来返回
        /*Object[] os=list.toArray();
        for (Object o:os) {
            String s=(String) o;
        }*/
        //传入数组对象返回对应类型的数组
        //给定数组长度只要大于等于零即可
        String[] ss=list.toArray(new String[1]);


        //保证数据存放有序
        System.out.println(list);
    }
}

LinkedList(链表)
底层基于节点(静态内部类)来存储数据,通过地址值的指向来维系节点的。内存不连续,不需要扩容。增删效率较高、查询效率较低。线程不安全的集合。
**思考:**当场景里增删操作和查询操作相当,选用ArrayList还是LinkedList?
在这里插入图片描述

Vector(向量):
最早的集合类
底层基于数组实现数据存储,默认的初始容量为10
底层根据三目运算符进行扩容,如果增量值大于0每次扩容的值就是增量的值,如果增量不大于0每次扩容的值就是原容量的大小。
线程安全的集合

package cn.tedu.collection.list;

import java.util.Vector;

public class VectorDemo {
    public static void main(String[] args) {
        //如果指定的值每次扩容的值就是增量的值
        //如果不指定增量,每次扩容就是在原来的基础上增加一倍
        Vector<String> vector=new Vector<>(10,5);
        //添加元素
        for (int i = 0; i < 84; i++) {
            vector.add("a");
        }
        //返回当前容量值
        System.out.println(vector.capacity());
    }
}

Stack(栈结构):
遵循先进后出
栈顶元素:最后一个存放元素
栈底元素:第一个存放元素
入栈/压栈:往栈里存放元素
出栈/弹栈:从栈里获取元素
继承Vector类

package cn.tedu.collection.list;

import java.util.Stack;

public class StackDemo {
    public static void main(String[] args) {
        //创建栈结构对象
        Stack<String> s=new Stack<>();
        //入栈
        s.push("abc");
        s.push("ab");
        s.push("bc");
        s.push("ac");
        //返回栈顶元素并不删除
        //如果是空栈---EmptyStackException(空栈异常)
        //System.out.println(s.peek());
        //返回栈顶元素并且删除
        //System.out.println(s.pop());
        //判断是否是空栈
        System.out.println(s.empty());
        //从栈顶往栈底来查找指定内容来查找指定内容的位置(从1开始计数)
        //没有找到返回-1
        System.out.println(s.search("ac"));
        //保证和List接口的特点保持一致
        //保证数据存放有序
        System.out.println(s);
    }
}

迭代器(Itrator接口)

底层根据指针挪动到进行迭代遍历
在遍历期间不能直接增删原集合元素
Itrator方法定义在Itrator接口里
类实现Itrator接口产生的对象就能被增强for循环来进行操作—增强for循环底层由迭代器实现–增强for虚幻是jdk1.5新特性

package cn.tedu.collection.list;

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

public class IteratorDemo {
    public static void main(String[] args) {
        //创建集合对象
        List<String> list=new ArrayList<>();
        //添加元素
        list.add("abc");
        list.add("bc");
        list.add("ab");
        list.add("ac");
        //调用方法返回迭代器
        Iterator<String> it=list.iterator();
        //通过循环实现
        while (it.hasNext()){//判断下一位是否有元素
            //获取下一个元素
            String s=it.next();
            //System.out.println(s);
            //调用的是迭代器提供的remove方法
            //改变标记值间接的删除原集合元素
            //it.remove();
            //调用集合的remove方法
            //调用集合的remove方法直接删除原集合元素,但是需要和默认的标记值进行比较
            //此时就会报错
            //list.remove(s);
        }
        //输出集合对象存储数据
        System.out.println(list);
    }
}


package cn.tedu.collection.list;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class ComparatorDemo {
    public static void main(String[] args) {
        //创建集合对象
        List<String> list=new ArrayList<>();
        //添加元素
        list.add("abc");
        list.add("bc");
        list.add("1ab");
        list.add("ac");
        //调用sort对集合元素进行排序
        //Comparator接口代表比较器,需要指定比较规则其他的都不用操心
        list.sort(new Comparator<String>() {
            //重写方法---指定比较规则
            //根据首字母来进行升序排序
            @Override
            public int compare(String o1, String o2) {
                //如果返回值是整数表面前面对象大于后面对象
                //如果返回值是整数表面前面对象小于后面对象
                //如果返回值是0表面前面对象等于后面对象
                return o2.charAt(0)-o1.charAt(0);
            }
        });
        System.out.println(list);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值