java容器和数据结构 20200208

@2020-02-08

容器和数据结构**

##概念

  1. Collection表示一组对象,它是集中,收集的意思,就是把一些数据收集起来。
  2. Collection函数库是在java.util包下的一些类和接口,类拾用来产生对象存放数据用的,而接口是访问数据的方式。
  3. Collection 函数库与数组的两点不同:1)数组的容量是有限制的,而Collection是没有这样的限制。它容量可以自动调节。2) Collection函数库只能用来存放对象,而数组没有这样的限制
  4. Collection 接口是Collection层次结构中的接线口,它定义了一些最基础的访问方法,让我们能用同一的方式通过它或它的子接口来访问数据。
  5. 区别:Collection 代表一组对象,Collection 函数库就是java
  6. 框架:Collection接口,是这个集合框架中的根接口
  7. 存放在Collection库中的

API

Collection---Set--MashSet:不允许重复没有顺序  Collection--List 允许重复并且有序 Map--HashMap 键值对

泛型是JDK1.5后增加的

  • ArrayList底层是用数组实现的存储。特点 : 查询效率高,曾删效率低,线程不安全。我们一般使用它
  • ? 数组长度是有限的,而ArrayList是可以存放任意数量的对象,长度不受限制,那么它拾怎么实现的呢?

LinkeList的特点和底层实现

  1. LinkeList 底层使用双向链表实现的存储。特点:查询效率低,曾删效率高,线程不安全。
  2. 双向链表页脚双链表,拾链表的一种,它的每个节点都有两个指针,分别指向前一个节点和后一个节点。所以,从双向链表的任意一个节点开始,都可以很方便的找到所有节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zNMjuP08-1581178973145)(https://www.sxt.cn/360shop/Public/admin/UEditor/20170524/1495616843888130.png (双向指针)])

class Node{
	Node previous; //前一个节点
	Object element //本节点保存的数据
	Node next;
}

Vector向量

  • Vector 底层是用数组实现的List,相关方法都加了同步检查,因此***线程安全,效率低*** 比如,indexOf方法就增加了synchronized同步标记
public synchronized int indexOf(Object o,int index){
//代码省略
}	

小结:

  • 如何选用ArrayList LinkeList Vector?
  1. 需要线程安全时,用Vetor
  2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)
  3. 不存在线程安全问题时, 增加和刪除元素較多時用LinkeList

附代码

*** LinkeList***

package mycollection;

/**
 *  自定义链表
 *  增加小的封装,泛型
 * author 管浩杰
 */
public class SxtLinkeList05<E> {
    private Node first;
    private Node last;
    private int size;
    Object element;

    //[]
    public void add(E e){
        //新的节点
        Node node = new Node(e);

        //链表为空
        if(first == null){
//            node.previous = null;
//            node.next = null;
            first = node;
            last = node;
        }else{
            //链表不为空
            node.previous = last;       //新节点前一个为链表元素的最后一个
            node.next = null;           //新节点的下一个为空
            last.next =node;            //最后一个节点指向新节点
            last = node;
        }
        size++;
    }

    public void add(int index,E e){
        checkIndex(index);
        Node newNode = new Node(e);     // 创建新的节点
        Node temp = getNode(index);          //当前节点
        if(temp!=null){
            Node up =temp.previous;

            up.next = newNode;
            temp.previous = newNode;

            newNode.previous= up;
            newNode.next= temp;

        }

    }

//    public void remove(){
//
//    }

    public void remove(int index){
        checkIndex(index);
        Node temp = getNode(index);
        if(temp!=null){
            Node up = temp.previous;
            Node down = temp.next;

            if(up!=null){
                up.next = down;
            }
            if(down!=null){
                down.previous = up;
            }

            if(index==0){
                first = down;
            }
            if(index==size-1){
                first = up;
            }
            size--;
        }

    }

    public void remove(E e){

    }

    private void checkIndex(int index){
        if(index<0||index>size-1){
            throw new RuntimeException("索引数字不合法"+ index);
        }
    }

    public Object get(int index){
        checkIndex(index);
        Node temp = getNode(index);
        return temp!=null?temp.element:null;
    }



    private Node getNode(int index){
        checkIndex(index);
        Node temp = null;
        if(index <= size>>1){//size>>1向右移动一位就是除以2
            temp =first;
            for(int i =0;i<index;i++){
                temp = temp.next;
            }
        }else{
            temp =last;
            for(int i =size-1;i>index; i--){
                temp = temp.previous;
            }
        }
        return temp;
    }



    /*重写toString() 方法*/
    @Override
    public String toString(){
        //[a,b,c]  first=a last=c
        //a,b.c
        StringBuilder stb =new StringBuilder();

        Node temp = first;
        stb.append("[");
        while(temp !=null){
            stb.append(temp.element).append(",");
            temp = temp.next;
        }
        stb.setCharAt(stb.length()-1,']');


        return stb.toString();
    }

    public static void main(String[] args) {
        SxtLinkeList05<String> list = new SxtLinkeList05<String>();
        list.add("a");
        list.add("a");
        list.add("a");
        list.add(2,"p");

        System.out.println(list);
        list.remove(0);
        System.out.println(list);
        System.out.println(list.get(1));
    }

}

ArrayList

package mycollection;

import java.util.ArrayList;

/**
 * 增加remove
 * author 管浩杰
 */

public class SxtArrayList03<E> {
    private Object[] elementData;
    private int size;
    private  static final int DEFALT_CAPACITY  = 10;

    public SxtArrayList03(){
        this(DEFALT_CAPACITY);
    }


    public SxtArrayList03(int capacity){
        if(capacity<0){
            throw new RuntimeException("索引不合法!"+ "---------"+capacity);
        }else if(capacity ==0 || capacity ==1){
            elementData = new Object[DEFALT_CAPACITY];
        }else{
            elementData =new Object[capacity];
        }
    }

    public void add(E object){
        /*什么时候扩容?*/
        if(size == elementData.length){
            /*怎么扩容?*/
            Object[] newArray = new Object[elementData.length + (elementData.length>>1)];
            System.arraycopy(elementData,0,newArray,0,elementData.length);
            elementData  = newArray;//将地址传回老数组
            /*垃圾自动回收*/
        }
        elementData[size++] = object;
    }

    public int size(){
        return this.size;
    }

    public boolean isEmpty(){
        return size == 0;
    }

    public void remove(Object element){
        //element ,將它和所有元素做比較,獲得的第一個爲true的,返回。

        for(int i=0; i<size;i++){
            if(element.equals(get(i))){   //容器中所有的比較都是equails方法
                //將該元素從此處移除
                remove(i);
            }
        }
    }

    public void remove(int index){
        //a,b,c,d,e
        //a,c,d,e
        int numMoved =  elementData.length-index-1;
        if(numMoved>0){
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
            //拷貝哪個數組/從哪裏開始拷貝/拷贝给谁/到那个位置/拷贝多少个
            elementData[size-1] = null;
        }else{
            elementData[size-1] = null;
        }
    }

    public Object get(int index){
        checkRange(index);
        return elementData[index];
    }

    public boolean set(E element,int index){
        checkRange(index);
        elementData[index] = element;
        return true;
    }

    public void checkRange(int index){
        if(index<0||index>size){
            throw new RuntimeException("索引不合法!"+ "---------"+index);
        }
    }


    /*重写toString() 方法*/
    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for(int i=0; i<size ;i++){
            sb.append(elementData[i]).append(",");
        }
//        sb.append("]");
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }


    public static void main(String[] args) {
        ArrayList<String> s2 = new ArrayList<String>();
        SxtArrayList03<String> s1 = new SxtArrayList03<String>(1);
//        s1.add("aa");
//        s1.add("bb");
//        s1.add("cc");
        for(int i =1;i<=40;i++){
            s1.add("hojay"+i);
        }
        System.out.println(s1.size);
        System.out.println(s1.get(10));
        System.out.println(s1.toString());
        System.out.println(s1.set("10",10));
        s1.remove(2);
        System.out.println(s1.toString());
        System.out.println(s1.size());
        System.out.println(s1.isEmpty());
        /*System.out.println(s1);*/
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值