(二)Java数据结构和算法——数组
一、数组的实现
- 上一篇博客我们介绍了一个数据结构必须具有以下基本功能:
 
①、如何插入一条新的数据项
②、如何寻找某一特定的数据项
③、如何删除某一特定的数据项
④、如何迭代的访问各个数据项,以便进行显示或其他操作
package arrays;
import java.util.Arrays;
public class MyArray {
    private int[] intArray;
    private int elems;
    private int length;
    /**
     * 默认创建一个长度为50的素组
     */
    public MyArray(){
        elems = 0;
        length = 50 ;
        intArray = new int[length];
    }
    /**
     * 自定义数组长度
     * @param length
     */
    public MyArray(int length){
        elems = 0;
        this.length = length;
        intArray = new int[length];
    }
    public int getSize(){
        return elems;
    }
    /**
     * 遍历数组
     */
    public void display(){
        for(int i=0;i<elems;i++){
            System.out.println(intArray[i]);
        }
    }
    /**
     * 添加元素,
     * 添加成功返回true,添加的元素超过范围了返回false
     * @param value
     * @return
     */
    public boolean add(int value){
        if(elems == length){
            return false;
        }
        intArray[elems] = value;
        elems++;
        return  true;
    }
    /**
     * 根据下标获取元素
     *
     * @param index
     * @return
     */
    public int get(int index)  {
        if(index<0 || index>elems){
            System.out.println("数组元素越界");
        }
        return intArray[index];
    }
    /**
     * 查找元素
     *
     * @return 如果找到则返回元素下标,如果不存在则返回-1
     */
    public int search(int value){
        for(int i=0;i<elems;i++){
            if(intArray[i] == value){
                return i;
            }
        }
        return -1;
    }
    /**
     * 删除元素
     * @param value
     * @return 删除成功返回true,删除的值不存在返回false
     */
    public boolean delete(int value){
      int index =   search(value);
      if(index != -1){
        if(index == elems-1){
            //刚好是最后一个元素
            elems--;
        }else{
            //将目标元素索引之后的元素全部往前移一位
            for(int i=index;i<elems;i++){
                intArray[i] = intArray[i+1];
            }
            elems--;
        }
        return true;
      }else{
          System.out.println("该值不存在");
          return false;
      }
    }
    /**
     * 修改值
     * @param oldValue
     * @param newValue
     * @return 修改成功返回true,失败返回false
     */
    public boolean modify(int oldValue ,int newValue){
       int index =  search(oldValue);
       if(index == -1){
           System.out.println("修改失败:该值不存在");
           return false;
       }else{
            intArray[index] =  newValue;
            return true;
       }
    }
}
测试:
  public static void main(String[] args) {
        MyArray myArray = new MyArray(7);
        myArray.add(1);
        myArray.add(10);
        myArray.add(15);
        myArray.add(20);
        myArray.add(25);
        myArray.display();
        System.out.println("第0个元素为="+myArray.get(0));
        myArray.delete(1);
        System.out.println("删除后的数组为");
        myArray.display();
        myArray.modify(15,1555);
        System.out.println("修改后的数组为");
        myArray.display();
    }
结果:

二、数组的优缺点
数组的局限性分析:
①、插入快,对于无序数组,上面我们实现的数组就是无序的,即元素没有按照从大到小或者某个特定的顺序排列,只是按照插入的顺序排列。无序数组增加一个元素很简单,只需要在数组末尾添加元素即可,但是有序数组却不一定了,它需要在指定的位置插入。
②、查找慢,当然如果根据下标来查找是很快的。但是通常我们都是根据元素值来查找,给定一个元素值,对于无序数组,我们需要从数组第一个元素开始遍历,直到找到那个元素。有序数组通过特定的算法查找的速度会比无需数组快,后面我们会讲各种排序算法。
③、删除慢,根据元素值删除,我们要先找到该元素所处的位置,然后将元素后面的值整体向前面移动一个位置。也需要比较多的时间。
④、数组一旦创建后,大小就固定了,不能动态扩展数组的元素个数。如果初始化你给一个很大的数组大小,那会白白浪费内存空间,如果给小了,后面数据个数增加了又添加不进去了。
很显然,数组虽然插入快,但是查找和删除都比较慢,而且扩展性差,所以我们一般不会用数组来存储数据,那有没有什么数据结构插入、查找、删除都很快,而且还能动态扩展存储个数大小呢,答案是有的,但是这是建立在很复杂的算法基础上,后面我们也会详细讲解。
(二)Java数据结构和算法——数组的更多相关文章
- Java数据结构和算法 - 数组
		
Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...
 - 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
		
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
 - Java数据结构和算法(二)--队列
		
上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...
 - Java数据结构和算法(六)——前缀、中缀、后缀表达式
		
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
 - Java数据结构和算法(十四)——堆
		
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
 - Java数据结构和算法(九)——高级排序
		
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
 - Java数据结构和算法 - 堆
		
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
 - Java数据结构和算法 - 二叉树
		
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
 - Java数据结构和算法 - 栈和队列
		
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
 
随机推荐
- 关于PID控制的一点资料搜集
			
CMU做的控制教程 <动态系统的反馈控制> MATLAB&Simulink的PID控制(官方)
 - 闲谈关于discuz内核缓存机制
			
Discuz! 缓存 Discuz! X2.5 的 config_global.php 中有这样一行代码 $_config['cache']['type'] = 'sql'; 这就是 Discuz! ...
 - 【Redis】远程访问不了
			
Windows安装后,启动的服务配置文件是redis.windows-service.conf "D:\Program Files\Redis\redis-server.exe" ...
 - wordpress去掉自定义菜单的外层div
			
wordpress调用自定义菜单时自动会在外层加一个<div class="menu-nav-container">,如下图所示,nav是后台定义的菜单名称,如果想把这 ...
 - sqoop2相关实例:hdfs和mysql互相导入(转)
			
原文地址:http://blog.csdn.net/dream_an/article/details/74936066 超详细讲解Sqoop2应用与实践 2017年07月10日 20:06:57 阅读 ...
 - typename T::SubType * ptr;
			
#include <iostream> using namespace std; template<class T> class MyClass{ public: typena ...
 - 关于ArrayList
			
List概述 List是一个列表结构抽象定义,有序的,可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素.包括函数的有:添加元素,删除元素,判断是否包含元素等等重要函数. ...
 - day003-python初识
			
基本的写代码流程:1.创建 xxx.py文件 注意:文件不要保存在中文的路径下,和文件名不要以中文命名. 2.写代码 a.注意两行文件头 #! /usr/bin/env python # -*- c ...
 - GoCN每日新闻(2019-10-31)
			
GoCN每日新闻(2019-10-31) GoCN每日新闻(2019-10-31) 1. Go语言继承的其他语言的优秀之处 https://spf13.com/presentation/the-leg ...
 - shell 编写进度条
			
test.sh #!/bin/bash i= bar='' label=("|" "/" "-" "\\") ] do ...