0
点赞
收藏
分享

微信扫一扫

Java 集合框架

幸甚至哉歌以咏志 2022-04-16 阅读 91
java

目录

为什么要用集合

集合架构

 List集合

 ArrayList

创建集合对象

集合添加操作

集合删除操作

集合修改操作

集合查询操作

 ArrayList底层源码

LinkedList

LinkedList添加操作

LinkedList删除操作

LinkedList修改操作

LinkedList查询操作


为什么要用集合

1.相对于数组,数组有缺陷》》》定容【数组一旦定义好,他们的长度就无法改变】,如果改变数组的长度就会很复杂。

2.可以定义一个长度可以改变的容器

手写可变长度的容器

public class MyArray {
    public Object [] arr;
    public int size;//数组下标

    public MyArray(){

    }
    public MyArray(int intSize){
        if (intSize<0){
            throw new ArrayIndexOutOfBoundsException("长度不合法");
        }
        arr = new Object[intSize];
    }

    public void addDate(Object a){
        //扩容
        if (size>= arr.length){
            Object[] newArr = Arrays.copyOf(arr, size * 2);
            arr=newArr;
        }
        //添加数组元素
        arr[size]=a;
        size++;
    }
    public Object getDate(int index){
        if (index<0){
            throw new ArrayIndexOutOfBoundsException("下标越界");
        }
        Object a = arr[index];
        return a;
    }
}

===========================================================
public class TestArray {
    public static void main(String[] args) {
        MyArray my = new MyArray(5);
        my.addDate("java01");
        my.addDate("java02");
        my.addDate("java03");
        Object date = my.getDate(0);
        System.out.println(date);
        for (int i = 0; i <my.size; i++) {
            Object o = my.getDate(i);
            System.out.println(o);
        }
    }
}

java官网 基于数组 根据不同的数据结构 创建多个类 而这些类统称为 集合框架

以后我们在说集合框架时,就表示多个类

集合架构

 List集合

 ArrayList

创建集合对象

//创建集合对象
        List list = new ArrayList();//默认集合长度为10
        //初始化集合空间  长度为 2
        List list1 = new ArrayList(2);

集合添加操作

//增加操作 集合可增加任意类型
        list.add(100);
        list.add(1.52525);
        list.add("张三");
        list.add(true);
        list.add(new Date());

        //在下标为 2 的位置添加元素,并把后面元素进行移位
        list.add(2,"李四");
        System.out.println(list);

        //添加多个元素 将list1的元素添加到list中
        list1.add("a");
        list1.add("b");
        list.addAll(list1);
        System.out.println(list);

集合删除操作

  //删除操作
        list.remove(2);
        System.out.println(list);
        //清空集合元素
        list.clear();
        System.out.println(list);

集合修改操作

 //修改操作
        list.set(1,"赵六");
        System.out.println(list);

集合查询操作

 //查询操作
        Object o = list.get(2);//根据下标获取元素
        System.out.println(o);
        //获取元素中的个数
        int size = list.size();
        System.out.println(size);
        //判断元素是否在集合中
        boolean zs = list.contains("张三");
        System.out.println(zs);//返回true/false
        //查询元素在集合中第一次出现的位置
        int ls = list.indexOf("李四");
        System.out.println(ls);//返回元素下标 没有返回-1

        //遍历集合中的元素 for循环方式
        for (int i = 0; i < list.size(); i++) {
            Object o1 = list.get(i);
            System.out.println(o1);
        }
        System.out.println("================");
        //遍历集合中的元素 foreach循环方式
        for (Object o2 : list
             ) {
            System.out.println(o2);
        }

 ArrayList底层源码

从构造方法来入手。new ArrayList(22) 底层声明了一个Object类型的数组 名字elementData
  Object[] elementData

  public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) { //大于0
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) { //等于初始化为一个空数组
            this.elementData = EMPTY_ELEMENTDATA;
        } else { //抛出一个异常
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

==========add("java01")======E理解为Object类型================  
   public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 扩容 
        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;  //返回元素在集合中位置
        }
        return -1;
    }   

===========size() 请求数组的长度======================
 public int size() {
        return size;
    }   

============contain("java05")判断元素是否在集合中==============
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
===============get(1) 获取指定位置的元素========
   public E get(int index) {
        rangeCheck(index); //判断指定的位置是否合法 

        return elementData(index);
    }  

    E elementData(int index) {
        return (E) elementData[index];
    } 

============toString() 为什么不打印对象的引用地址 
    [java01, java02, java03, java02]因为重写了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的底层就是基于数组实现的。

LinkedList

它是一个链表结构。

LinkedList添加操作

 //添加
        linkedList.add("java01"); //追加尾部
        linkedList.addFirst("java02"); //添加到头部
        linkedList.addLast("java03");//追加到尾部
        linkedList.addFirst("java04"); //追加到头部
        linkedList.addLast("java05");//追加到尾部
        System.out.println(linkedList);

LinkedList删除操作

  //删除操作
        linkedList.removeFirst();//移除头部元素
        System.out.println(linkedList);

        linkedList.remove(2);//移除指定位置的元素
        System.out.println(linkedList);

        linkedList.removeLast();//移除尾部的元素
        System.out.println(linkedList);

LinkedList修改操作

//修改操作
        linkedList.set(1,"java11");
        System.out.println(linkedList);

LinkedList查询操作

        //查询操作
        int size = linkedList.size();//求长度
        boolean empty = linkedList.isEmpty();//是否为空

        boolean b = linkedList.contains("java01");//判断元素是否在集合中

        Object o = linkedList.get(1);//根据下标获取指定位置的元素

        Object first = linkedList.getFirst();//获取第一个元素
        System.out.println(first);

        Object last = linkedList.getLast();
        System.out.println(last);
举报

相关推荐

java集合框架

JAVA集合框架

java 集合框架

JAVA 集合框架

Java集合框架

Java集合框架-1

Java-集合框架

0 条评论