文档章节

【java集合总结】-- 数组总结+自己封装数组类

o
 osc_two9vbkq
发布于 2019/05/05 15:59
字数 1198
阅读 5
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

一、前言

   本篇文章总结目前学习的有关数组方面的知识,首先总结一下数组相关的核心概念,然后在封装一个自己的泛型动态数组类(ava已经封装的有现成的,自己封装只是为了加深理解),最后再学习解析下ArrayList源码。

  本文应用:慕课网《玩转数据结构 从入门到进阶》课程,https://www.cnblogs.com/zhangyinhua/p/7687377.html

二、数组核心概念

  1、数组就是将数据码成一排进行存放

  

  2、因为数据是物理上连续排列的,那就可以给数据排序,添加索引,这样就可以通过索引快速访问数据。(如何通过索引快速访问呢?首个元素的地址+每个元素所占的地址宽度*索引值)

  3、java声明数组的方式

  int[] arr=new int[10];

  4、Java中数组中存放的类型是固定的。在另外的一些语言,数组中是可以存放不同的数据类型的。

  5、数组最大优点:快速查询。

  6、索引最好有语义。

    索引可以有语义,也可以无语义。

    数组最好应用于“索引有语义”的情况,无语义一般适合其他的数据类型。但并非所有有语义的索引都适合于数组,例如以身份证号为索引。

  7、数组一旦被定义,它的容量就不会在改变

    因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。

  8、java中允许将一个数组变量拷贝给另一个数组变量,两个变量将引用同一个数组

  9、二维数组的两种存储方式:列序存储和行序存储(了解即可)

 三、封装一个自己的数组类

  java实际上已经为我们封装了一个Arrays类,但是为了加深了理解我们自己来封装一个数组类。

3.1、成员变量和基本方法

   private E[] data;
    private int size;

    // 构造函数,传入数组的容量capacity构造Array
    public Array(int capacity){
        data = (E[])new Object[capacity];
        size = 0;
    }

    // 无参数的构造函数,默认数组的容量capacity=10
    public Array(){
        this(10);
    }

    // 获取数组的容量
    public int getCapacity(){
        return data.length;
    }

    // 获取数组中的元素个数
    public int getSize(){
        return size;
    }

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

3.2、扩容方法

  为了解决数组类初始化后固定容量的局限性,我们通过本方法实现动态扩容,原理其实非常简单。

// 将数组空间的容量变成newCapacity大小
    private void resize(int newCapacity){

        E[] newData = (E[])new Object[newCapacity];
        for(int i = 0 ; i < size ; i ++)
            newData[i] = data[i];
        data = newData;
    }

3.3、add方法

  注意在add方法中使用了resize方法实现动态扩容,默认为两倍原来容量。

// 在index索引的位置插入一个新元素e
    public void add(int index, E e){

        if(index < 0 || index > size)
            throw new IllegalArgumentException("Add failed. Require 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);
    }

3.4、查找方法

  很简单就不多做解释了

    // 获取index索引位置的元素
    public E get(int index){
        if(index < 0 || index >= size)
            throw new IllegalArgumentException("Get failed. Index is illegal.");
        return data[index];
    }// 查找数组中是否有元素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;
    }

3.5、删除方法

  注意remove方法中使用resize方法实现减容。

    // 从数组中删除index位置的元素, 返回删除的元素
    public E remove(int index){
        if(index < 0 || index >= size)
            throw new IllegalArgumentException("Remove failed. Index is illegal.");

        E ret = data[index];
        for(int i = index + 1 ; i < size ; i ++)
            data[i - 1] = data[i];
        size --;
        data[size] = null; // 方便GC

        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 void removeElement(E e){
        int index = find(e);
        if(index != -1)
            remove(index);
    }

四、结尾

  本文的内容还是很简单的,本来想一起把ArrayList源码解析一起写完的,但是发现这样篇幅太长了,所以放到下一篇文章:【java集合总结】-- ArrayList源码解析

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
619
1
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
【opencv】图形的绘制

1.矩形图像的绘制: 原函数:void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8,int shift=0) img就是需要绘制的图像 pt1 and pt......

其实我是兔子
2014/10/08
1.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
32分钟前
15
0
Dubbo

泛化调用 在提供端,比起常规的dubbo调用,泛化调用会多经过一个 GenericFilter,即判断是泛化方法才会经过该Filter进行处理。主要以下几个处理步骤: 1.首先根据方法签名,通过Java反射获取...

KafkaPlus
33分钟前
0
0
ThingJS 3D开发新体验,iframe元素提升网页加载性能

谷歌浏览器率先支持iframe元素,延迟加载有助于减少内存使用量、提升页面其它部分的加载速度并保存数据。ThingJS 3D开发有了新的体验。 在使用ThingJS制作物联网可视化项目时,需要使用Thing...

森友鹿锘
46分钟前
0
0
什么是TypeScript?为什么我要用它代替JavaScript? [关闭]

问题: Closed . 已关闭 。 This question needs to be more focused . 这个问题需要更加集中 。 It is not currently accepting answers. 它当前不接受答案。 Want to improve this questio......

法国红酒甜
56分钟前
27
0
键盘输入限制

// 用户输入的时候替换:nativeOnInput 替换负数setInputValue(e, row, prop) { if(e.target.value.includes('-')) { e.target.value = '-'+e.target.value.replace(/-/g, ......

赤月三号
59分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部