JAVA数据结构之数组详细教程

本文整理了java数据结构的数组操作。希望对刚入门数据结构的同志们有帮助。
java数组非常简单。只要有JAVA语言基础就可以看这篇博文。大家不要害怕。。。非常简单。。
整理博客真的很花费时间,如果对大家有帮助,麻烦点赞评论,让我有动力继续更新下去,谢谢大家。

数组基础

数组的结构如下:
在这里插入图片描述我们在存数据的时候,存在数组里面,以索引来读取数据。可以通过数组名【索引】的形式访问。每一个格子都存放一个数据。
创建一个索引的代码:

/**
 * Created by hongyonghan
 */
public class Main {
    public static void main(String[]args){

        //方法一:声明一个数组,并给定数组长度
        int [] arr=new int[10];
        for (int i=0;i<arr.length;i++)
        {
            //给arr数组赋值赋值
            arr[i]=i;
        }

        //方法二:直接给数组赋初值
        int[] scores=new int[]{100,99,66};
        for (int i=0;i<scores.length;i++)
        {
            System.out.println(scores[i]);
        }
        //使用foreach的形式遍历数组
        for (int score:scores)
        {
            System.out.println(score);
        }

        //更改数组的值
        scores[0]=98;
        for (int score:scores)
        {
            System.out.println(score);
        }
    }
}

数组的优点和不足:
在这里插入图片描述
如果使用上面身份证号作为一个索引的话,就需要开辟这么大的数组空间,对计算机来说开辟这么大空间是不现实的。
在这里插入图片描述
java数组本身没有提供添加、删除数组元素这些功能,所以需要我们自己二次封装我们自己的数组。
在这里插入图片描述
上面的size是我们数组中有实际值元素的个数,而capacity是数组的容量。
下面是创建一个数组及初始化。

private Array(int capacity)
    {
        data=new int[capacity];
        size=0;
    }
    //无参数的构造函数
    public Array() {
        //如果用户不传入capacity的话,就默认构建一个长度是10的数组。
        this(10);
    }

    //获取数组中的元素个数
    public int getSize()
    {
        return size;
    }
    //获取数组的容量
    public int getCapapcity()
    {
        return data.length;
    }

    //获取数组是否为空
    public boolean isEmpty()
    {
        return size==0;
    }

向数组中添加元素

在这里插入图片描述
向数组末添加元素就是给定一个值,然后就可以直接添加进去。这里解释一下:这里的size值在最开始创建数组的时候,就是指在数组长度的位置上,也就是0那个位置。那么添加的话,也是添加在0那个位置。以后我们每添加一个元素除了给那个位置添加一个元素以外,还有给size的位置加一,目的是让这个size指在前面的位置上。

    //向所有元素后添加一个新元素
    public void addLast(int e)
    {
        if (size==data.length)
        {throw new IllegalArgumentException("failed;array is full");}
        //给size位置赋值。
        data[size]=e;
        //更新size的位置
        size++;
   }
向数组中指定位置添加元素

做法就是将指定位置以后的元素都往后挪动一个位置。下面是添加过程:
下面第一个图是一开始数据的位置,我们将77插入到索引位置为1的位置。那么将索引是1之后的所有元素后移,然后将77放在索引是1的位置的地方。
后移的过程是:将前面的值赋值给后面的值。比如这里将100赋值在size指向的位置,将99赋值到100位置处。
在这里插入图片描述
在这里插入图片描述
然后将元素放在这个位置,并且size也要加加。
在这里插入图片描述

 //在第index个位置插入元素e
    public void add(int index,int e)
    {
        if (size==data.length)
        {throw new IllegalArgumentException("failed;array is full");}
        if(index <0 || index > size )
        {
            throw new IllegalArgumentException("failed;index  >= 0 and  index <=size");
        }
        for (int i = size-1;i >= index; i--)
        {
            data[i+1]=data[i];
        }
        data[index]=e;
        size++;
    }

    //在所有元素前添加一个新元素添加元素
    public void addFirst(int e)
    {
        add(0,e);
    }
   //根据index索引位置获取元素
    public int get(int index)
    {
        if (index <0 || index >= size)
        {
            throw new IllegalArgumentException("failes,index is illegal");
        }
        return data[index];
    }
//修改index处位置为e
    public void set(int index,int e)
    {        if (index <0 || index >= size)
    {
        throw new IllegalArgumentException("failes,index is illegal");
    }
        data[index]=e;
    }
 //查看元素中是否包含元素e
    public boolean contains(int e)
    {
        for (int i=0;i<size;i++)
        {
            if (data[i]==e)
            {
                return true;
            }
        }
        return false;
    }
 //查找数组中元素e所在的索引,如果不存在元素e,则返回-1
    public int find(int e)
    {
        for (int i=0;i<size;i++)
        {
            if (data[i]==e)
            {
                return i;
            }
        }
        return -1;
    }

从数组中删除元素

数组中删除元素就是将某个位置之后的全部值前移,覆盖要删除位置的元素,然后size减减。
在这里插入图片描述
size要进行减减。
在这里插入图片描述

   //从数组中删除index位置的元素,返回删除的元素
    public int remove(int index)
    {
        if (index <0 || index >= size)
        {
            throw new IllegalArgumentException("failes,index is illegal");
        }
        int ret=data[index];
        for (int i=index+1;i<size;i++)
        {
            data[i-1]=data[i];
        }
        size--;
        return ret;
    }
        //从数组中删除第一个元素,返回删除的元素
    public int removeFirst()
    {
        return remove(0);
    }
    //从数组中删除最后一个元素,返回删除元素。
    public int removeLast()
    {
        return remove(size-1);
    }
    //从数组中删除元素e
    public boolean removeElement(int e)
    {
        int index=find(e);
        if (index != -1)
        {
            remove(index);
            return true;
        }
        return false;
    }
泛型

在这里插入图片描述

public class Array <E>{}

加了声明成为一个泛型数组,那么这个E就是数组中存放元素的类型。可以是int,可以是string等等。
全部代码如下:

/**
 * Created by hongyonghan on 2020/4/12.
 */
public class Array <E>{
    //定义数组
    private E[] data;
    //定义数组中元素的个数
    private int size;

    //capacity相当于是设定数组的大小


    public Array(int capacity)
    {
        data= (E[]) new Object[capacity];
        size=0;
    }
    //无参数的构造函数
    public Array() {
        //如果用户不传入capacity的话,就默认构建一个长度是10的数组。
        this(10);
    }

    //获取数组中的元素个数
    public int getSize()
    {
        return size;
    }
    //获取数组的容量
    public int getCapapcity()
    {
        return data.length;
    }

    //获取数组是否为空
    public boolean isEmpty()
    {
        return size==0;
    }

    //向所有元素后添加一个新元素
//    public void addLast(int e)
//    {
//        if (size==data.length)
//        {throw new IllegalArgumentException("failed;array is full");}
//        data[size]=e;
//        size++;
//        //复用add
        size=getSize();
       add(size,e);
//    }



    //在第index个位置插入元素e
    public void add(int index,E e)
    {

        if(index <0 || index > size )
        {
            throw new IllegalArgumentException("failed;index  >= 0 and  index <=size");
        }
        if (size==data.length)
        {
            //动态数组
            resize(2*data.length);
        }
        for (int i = size-1;i >= index; i--)
        {
            data[i+1]=data[i];
        }
        data[index]=e;
        size++;
    }
    public void  addLast(E e)
    {
        add(size,e);
    }

    //在所有元素前添加一个新元素添加元素
    public void addFirst(E e)
    {
        add(0,e);
    }

    //根据index索引位置获取元素
    public E get(int index)
    {
        if (index <0 || index >= size)
        {
            throw new IllegalArgumentException("failes,index is illegal");
        }
        return data[index];
    }
    //修改index处位置为e
    public void set(int index,E e)
    {        if (index <0 || index >= size)
    {
        throw new IllegalArgumentException("failes,index is illegal");
    }
        data[index]=e;
    }

    //查看元素中是否包含元素e
    public boolean contains(E e)
    {
        for (int i=0;i<size;i++)
        {
            if (data[i].equals(e))
            {
                return true;
            }
        }
        return false;
    }

    //查找数组中元素e所在的索引,如果不存在元素e,则返回-1
    public int  find(E e)
    {
        for (int i=0;i<size;i++)
        {
            if (data[i].equals(e))
            {
                return i;
            }
        }
        return -1;
    }

    //从数组中删除index位置的元素,返回删除的元素
    public E remove(int index)
    {
        if (index <0 || index >= size)
        {
            throw new IllegalArgumentException("failes,index is illegal");
        }
        E ret=data[index];
        for (int i=index+1;i<size;i++)
        {
            data[i-1]=data[i];
        }
        size--;
        data[size]=null;//这句话不是必须的,因为用户是无法访问到的。
        //减小容量
        if(size == data.length/4 && data.length /2 !=0 )
        {
            resize(data.length/2);
        }
        return ret;
    }
        //从数组中删除第一个元素,返回删除的元素
    public E removeFirst()
    {
        return remove(0);
    }
    //从数组中删除最后一个元素,返回删除元素。
    public E removeLast()
    {
        return remove(size-1);
    }
    //从数组中删除元素e
    public boolean removeElement(E e)
    {
        int index=find(e);
        if (index != -1)
        {
            remove(index);
            return true;
        }
        return false;
    }

    //可以做findALL和removeAll函数




    @Override
    public String toString() {
       StringBuilder res=new StringBuilder();
       res.append(String.format("Array: size = %d,capacity = %d \n",size,data.length));
       res.append("[");
       for (int i=0;i < size;i++)
       {
           res.append(data[i]);
           if (i != size-1)
           {
               res.append(", ");
           }

       }
        res.append("]");
       return res.toString();
    }

泛型就是用来处理数组中元素类型不同的问题的,使用泛型可以让我们自定义数据类型。如下是自定义的数据类型对象:

/**
 * Created by hongyonghan
 */
public class Student {
    private String name;
    private int score;

    public Student() {
    }

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return String.format("Student(name:%s, score: %d)",name,score);
    }

    public static void main(String[]args){

        Array<Student> array=new Array<>();
        array.addLast(new Student("Alice",100));
        array.addLast(new Student("Bob",66));
        array.addLast(new Student("Hahan",88));
        System.out.println(array);
    }

}

动态数组

数组原数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


    //在第index个位置插入元素e
    public void add(int index,E e)
    {

        if(index <0 || index > size )
        {
            throw new IllegalArgumentException("failed;index  >= 0 and  index <=size");
        }
        if (size==data.length)
        {
            //动态数组添加
            resize(2*data.length);
        }
        for (int i = size-1;i >= index; i--)
        {
            data[i+1]=data[i];
        }
        data[index]=e;
        size++;
    }

   private void resize(int newCapacity)
    {
        //新建一个泛型数组,将之前的数组复制到新的数组当中。
        E[] newData= (E[]) new Object[newCapacity];
        for (int i=0;i<size;i++)
        {
            newData[i]=data[i];
        }
        data=newData;

    }

}



  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值