0
点赞
收藏
分享

微信扫一扫

1.集合框架

booksmg2014 2022-04-16 阅读 91
java架构

1.1目录

1.为什么使用集合?

2.集合架构有哪些?

3.List集合

4.ArrayList集合

5.LinkedLIst集合

6.Set集合

7.HashSet集合

8.TreeSet集合

9.Map

10.HashMap集合

11.TreeMap集合

1.2为什么使用集合

数组有缺陷长度固定(一旦数组定义好,数组的长度就无法改变)没有办法动态扩展 如果需要改变数组长度,变的很复杂 而集合(集合就是用于存储对象的容器)存储数据时是没有长度限制的,是可以动态扩展的。

是否可以自己定义长度可变的容器--当然可以

手撕一个长度可变的容器

//自定义一个自动扩容的容器
public class MyArray3 {
    //声明定义一个Object类型数组
    private Object[] arr;
    //声明一个变量充当数组的下标
    private int size;
    //创建一个无参构造
    public MyArray3() {
    }
    //创建一个有参构造
    public MyArray3(int initSize) {
        //判断传过来的参数是否有误
        if (initSize<0){
            throw new RuntimeException("数组长度有误");
        }
        //将传过来的参数赋值给定义的数组 创建一个定容数组
        arr=new Object[initSize];
    }
    //创建一个存储元素的方法
    public void addData(Object o){
        //判断下标是否超过定容数组的长度
        if (size>=arr.length){
            //数组满了就要扩容  1容器的长度变大变长 2把原来容器的元素复制到新的容器中去
           //Arrays(数组的工具类)  original(起初的 原先的) 将原来的元素扩容到新的地方
            Object[] al = Arrays.copyOf(arr, arr.length * 2);
        }
        //将传递过来的元素存储到数组中来 不能直接传到0的位置这样数值覆盖 就不能创建一个动态扩容的数组了
        //需要声明一个变量初始值为0 然后让其自增
        arr[size]=o;
        size++;
    }
    //创建一个根据传过来的下标 查找元素
    public Object getData(int index){
        //判断下标是否越界
        if (index>=size){
            throw new ArrayIndexOutOfBoundsException("下标越界异常");
        }
        //入过传过来的下标没有越界异常根据这个下标查到元素并返回
        Object o = arr[index];
        return o;
    }

    @Override
    public String toString() {
        return "MyArray3{" +
                "arr=" + Arrays.toString(arr) +
                ", size=" + size +
                '}';
    }
}

测试类

public class TestMyArray3 {
    public static void main(String[] args) {
        MyArray3 myArray3 = new MyArray3(2);
        myArray3.addData("张三");
        myArray3.addData("王五")
        System.out.println(myArray3);
        Object data = myArray3.getData(1);
        System.out.println(data);
    }
}

java官方 基于数组 根据不同的数据结构 创建了多个类 这些类统称为集合框架。所以我们说结合框架时 就是表示多个类

1.3集合的架构

 1.4List集合-ArrayList

1.4.0创建集合对象

 //创建一个集合对象 如果没有指定集合容器的长度默认为15

    List list = new ArrayList();

   List list1 = new ArrayList(15);

1.4.1添加操作

public static void main(String[] args) {
    ArrayList<Object> aryt = new ArrayList<>();
    aryt.add("张三");
    aryt.add("张三");
    aryt.add(123);
    aryt.add(null);
    System.out.println(aryt);
    //下标为1的位置添加元素
    aryt.add(1,"王五无");
    System.out.println(aryt);
    ArrayList<Object> aryt2 = new ArrayList<>();
    aryt2.add("java");
    aryt2.add("集合");
    aryt2.add(333);
    aryt2.add(222);
    System.out.println(aryt2);
    //添加多个元素把aryt中的每个元素一一添加到aryt2中
    aryt2.addAll(1,aryt);
    System.out.println(aryt2);
}

1.4.2 删除操作

public static void main(String[] args) {
    ArrayList<Object> arty = new ArrayList<>();
    arty.add("张三");
    arty.add(123);
    arty.add("java");
    arty.add(null);
    System.out.println(arty);
    //删除下标为0的元素
    arty.remove(0);
    System.out.println(arty);
     //删除指定元素
    boolean remove1 = arty.remove("java");
    System.out.println(remove1);
    System.out.println(arty);
    //清空集合中的元素
    arty.clear();
    Syetem.out.println(arty);
}

1.4.3修改操作

public void test(){
    ArrayList<Object> alt = new ArrayList<>();
    alt.add("张三");
    alt.add("java");
    alt.add(21233);
    System.out.println(alt);
    //修改下标为1的元素
    alt.set(1,"王五无");
}

1.4.4查询操作

public static void main(String[] args) {
    ArrayList<Object> alt = new ArrayList<>();
    alt.add("java01");
    alt.add("java02");
    alt.add("java03");
    //根据下标获取元素
    Object o=alt.get(1);
    //获取集合中元素的个数
    System.out.println(o);
    int size = alt.size();
    System.out.println(size);
    //判断元素是否在集合中
    boolean java05 = alt.contains("java05");
    System.out.println(java05);
    //查询元素在集合中第一次出现的位置
    int java03 = alt.indexOf("java03");
    System.out.println(java03);
    //遍历集合中的元素 for循环
    for (int i=0;i< alt.size();i++){
        Object o1=alt.get(i);
        System.out.println(o1);
    }
    //遍历集合中的元素 forEach循环
    for (Object o1:alt){
        System.out.println(o1);
    }
}

1.4.5ArrayList底层源码

ArrayList arrayList = new ArrayList(22);

        //ArraylIst 底层使用的还是Object类型的数组
    //底层无参构造
/*DEFAULTCAPACITY_EMPTY_ELEMENTDATA(默认容量空元素数据)
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}*/

    //底层声明了一个Object类型的数组 名字为elementData
    //transient Object[] elementData;
    //底层有参构造
   /*new ArrayList(22) 参数22给了initialCapacity(初始容量)
    public TestArrayList(int initialCapacity) {
            //判断穿过来的参数是否大于0
        if (initialCapacity > 0) {
        //将22初始容量赋值给 这个数组长度为22
            this.elementData = new Object[initialCapacity];
            //如果为0初始化一个空数组
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
        //不大于0也不等于0抛出异常
            throw new IllegalArgumentException("Illegal Capacity: "+
                    initialCapacity);
        }
    }*/
    //======================add("java01")======E理解为Object类型=============
    //底层代码
    //将java01 变量给e 相当于给了elementData[size++]数组的响应位置
    /*public boolean add(E e) {
        //扩容element数组的长度
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //上面已经扩容了 判断是否扩容  复制完之后size再加加 ++在后 先执行在++
        elementData[size++] = e;
        return true;
    }*/
    //=====================indexOf("java02")判断元素在集合中第一次出现的位置

    /*public int indexOf(Object o) {
        //判断传过来的对象是否为空
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
        //不为空执行这个循环
            for (int i = 0; i < size; i++)
            //传过来的对象和数组中的元素进行对比
                if (o.equals(elementData[i]))
                //若有返回元素在数组中的位置
                    return i;
        }
        //没有找到该元素返回-1
        return -1;
    }*/
    //=====================size()求数组的长度=========================
    /*public int size() {
        return size;
    }*/
    //=====================contain("java01")=================
    /*public boolean contains(Object o) {
    //调用indeOf(o) 将java01传过去  如果数组没有indexOf(o) >= 0 为false   若有返回true
        return indexOf(o) >= 0;
    }*/

    //=======================get(i)获取指定位置的元素===================
    /*public E get(int index) {
        //rangeCheck(index)方法判断指定位置是否合法 传过来的参数index可能超过下标或为负数
        rangeCheck(index);
        //调用elementData(index)方法并传参
        return elementData(index);
    }*/
    /*E elementData(int index) {
        //返回elementData[index];这个下标的元素
        return (E) elementData[index];
    }*/
    //=================toString()为什么不打印引用对象的地址=============
    //重写了object里面的toString()方法
    /*public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }*/
    //通过对ArrayList方法的底层代码分析:底层就是对数组的操作
   //ArrayList的底层就是基于数组实现的

1.5LinkedList

LinkedList是一个链表结构

1.5.1添加

//LinkedList是链表结构
public static void main(String[] args) {
    //LinkedList底层不是数组不在指定长度
    LinkedList linkedList = new LinkedList();
    //不加First Last 默认添加到数组的尾部
    linkedList.add("java01");
    //添加元素到头部
    linkedList.addFirst("java02");
    //也重写了toString方法
    System.out.println(linkedList);
    //添加元素到尾部
    linkedList.addLast("java03");
    //代码从上往下执行 java04在元素的头部
    linkedList.addFirst("java04");
    //代码从上往下执行 添加元素到尾部
    linkedList.addLast("java05");
    System.out.println(linkedList);
}

1.5.2 删除

//移除头部元素
linkedList.removeFirst();
System.out.println(linkedList);
//移除指定下标元素
linkedList.remove(3);
//移除尾部元素
System.out.println(linkedList);
//清空所有元素
linkedList.clear();
System.out.println(linkedList);

1.5.3修改操作

linkedList.set(2,"张三");
System.out.println(linkedList);

1.5.4查询操作

//查询长度
int size = linkedList.size();
System.out.println(size);
//是否为空
boolean empty = linkedList.isEmpty();
System.out.println(empty);
//是否含有某元素
boolean contains = linkedList.contains("张三");
System.out.println(contains);
//根据下标获取指定位置的元素
Object o = linkedList.get(1);
System.out.println(o);
//获取第一个元素
Object first = linkedList.getFirst();
System.out.println(first);
//获取最后一个元素
Object last = linkedList.getLast();
System.out.println(last);

举报

相关推荐

0 条评论