1、Java数组介绍

  在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型(Object类型数组除外)。

  ①、数组的声明

  第一种方式:

1

数据类型 []  数组名称 = new 数据类型[数组长度];

  这里 [] 可以放在数组名称的前面,也可以放在数组名称的后面,我们推荐放在数组名称的前面,这样看上去 数据类型 [] 表示的很明显是一个数组类型,而放在数组名称后面,则不是那么直观。

  第二种方式:

1

数据类型 [] 数组名称 = {数组元素1,数组元素2,......}

  这种方式声明数组的同时直接给定了数组的元素,数组的大小由给定的数组元素个数决定。

//声明数组1,声明一个长度为3,只能存放int类型的数据
int [] myArray = new int[3];
//声明数组2,声明一个数组元素为 1,2,3的int类型数组
int [] myArray2 = {1,2,3};

  ②、访问数组元素以及给数组元素赋值

  数组是存在下标索引的,通过下标可以获取指定位置的元素,数组小标是从0开始的,也就是说下标0对应的就是数组中第1个元素,可以很方便的对数组中的元素进行存取操作。

  前面数组的声明第二种方式,我们在声明数组的同时,也进行了初始化赋值。

//声明数组,声明一个长度为3,只能存放int类型的数据int [] myArray = new int[3];//给myArray第一个元素赋值1myArray[0] = 1;//访问myArray的第一个元素System.out.println(myArray[0]);

  上面的myArray 数组,我们只能赋值三个元素,也就是下标从0到2,如果你访问 myArray[3] ,那么会报数组下标越界异常。

  ③、数组遍历

  数组有个 length 属性,是记录数组的长度的,我们可以利用length属性来遍历数组。

//声明数组2,声明一个数组元素为 1,2,3的int类型数组int [] myArray2 = {1,2,3};for(int i = 0 ; i < myArray2.length ; i++){System.out.println(myArray2[i]);}

2、用类封装数组实现数据结构

  上一篇博客我们介绍了一个数据结构必须具有以下基本功能:

  ①、如何插入一条新的数据项

  ②、如何寻找某一特定的数据项

  ③、如何删除某一特定的数据项

  ④、如何迭代的访问各个数据项,以便进行显示或其他操作

  而我们知道了数组的简单用法,现在用类的思想封装一个数组,实现上面的四个基本功能:

  ps:假设操作人是不会添加重复元素的,这里没有考虑重复元素,如果添加重复元素了,后面的查找,删除,修改等操作只会对第一次出现的元素有效。

package com.ys.array;public class MyArray {//定义一个数组private int [] intArray;//定义数组的实际有效长度private int elems;//定义数组的最大长度private int length;//默认构造一个长度为50的数组public MyArray(){elems = 0;length = 50;intArray = new int[length];}//构造函数,初始化一个长度为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.print(intArray[i]+" ");}System.out.println();}/*** 添加元素* @param value,假设操作人是不会添加重复元素的,如果有重复元素对于后面的操作都会有影响。* @return添加成功返回true,添加的元素超过范围了返回false*/public boolean add(int value){if(elems == length){return false;}else{intArray[elems] = value;elems++;}return true;}/*** 根据下标获取元素* @param i* @return查找下标值在数组下标有效范围内,返回下标所表示的元素* 查找下标超出数组下标有效值,提示访问下标越界*/public int get(int i){if(i<0 || i>elems){System.out.println("访问下标越界");}return intArray[i];}/*** 查找元素* @param searchValue* @return查找的元素如果存在则返回下标值,如果不存在,返回 -1*/public int find(int searchValue){int i ;for(i = 0 ; i < elems ;i++){if(intArray[i] == searchValue){break;}}if(i == elems){return -1;}return i;}/*** 删除元素* @param value* @return如果要删除的值不存在,直接返回 false;否则返回true,删除成功*/public boolean delete(int value){int k = find(value);if(k == -1){return false;}else{if(k == elems-1){elems--;}else{for(int i = k; i< elems-1 ; i++){intArray[i] = intArray[i+1];}elems--;}return true;}}/*** 修改数据* @param oldValue原值* @param newValue新值* @return修改成功返回true,修改失败返回false*/public boolean modify(int oldValue,int newValue){int i = find(oldValue);if(i == -1){System.out.println("需要修改的数据不存在");return false;}else{intArray[i] = newValue;return true;}}}

  测试:

package com.ys.test;import com.ys.array.MyArray;public class MyArrayTest {public static void main(String[] args) {//创建自定义封装数组结构,数组大小为4MyArray array = new MyArray(4);//添加4个元素分别是1,2,3,4array.add(1);array.add(2);array.add(3);array.add(4);//显示数组元素array.display();//根据下标为0的元素int i = array.get(0);System.out.println(i);//删除4的元素array.delete(4);//将元素3修改为33array.modify(3, 33);array.display();}}

  打印结果为:

  

3、分析数组的局限性

  通过上面的代码,我们发现数组是能完成一个数据结构所有的功能的,而且实现起来也不难,那数据既然能完成所有的工作,我们实际应用中为啥不用它来进行所有的数据存储呢?那肯定是有原因呢。

  数组的局限性分析:

  ①、插入快,对于无序数组,上面我们实现的数组就是无序的,即元素没有按照从大到小或者某个特定的顺序排列,只是按照插入的顺序排列。无序数组增加一个元素很简单,只需要在数组末尾添加元素即可,但是有序数组却不一定了,它需要在指定的位置插入。

  ②、查找慢,当然如果根据下标来查找是很快的。但是通常我们都是根据元素值来查找,给定一个元素值,对于无序数组,我们需要从数组第一个元素开始遍历,直到找到那个元素。有序数组通过特定的算法查找的速度会比无需数组快,后面我们会讲各种排序算法。

  ③、删除慢,根据元素值删除,我们要先找到该元素所处的位置,然后将元素后面的值整体向前面移动一个位置。也需要比较多的时间。

  ④、数组一旦创建后,大小就固定了,不能动态扩展数组的元素个数。如果初始化你给一个很大的数组大小,那会白白浪费内存空间,如果给小了,后面数据个数增加了又添加不进去了。

  很显然,数组虽然插入快,但是查找和删除都比较慢,而且扩展性差,所以我们一般不会用数组来存储数据,那有没有什么数据结构插入、查找、删除都很快,而且还能动态扩展存储个数大小呢,答案是有的,但是这是建立在很复杂的算法基础上,后面我们也会详细讲解。

Java数据结构和算法-----数组相关推荐

  1. 用数组实现环形队列(尚硅谷Java数据结构与算法)

    整个代码在文章最后面,gitee地址:java数据结构与算法: 自己学习与练习数据结构的仓库https://gitee.com/ALi_L/javaDataStructurs.git 环形队列的难点如 ...

  2. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  3. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  4. Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...

  5. JAVA数据结构与算法【简单介绍】

    前几天去面一个大厂,面试官特别好,面试官说到,我们的学习不能本末倒置,数据结构和算法是程序的基础,如果数据结构你没有学好,你真正意义上不算会写代码.你的代码是各处粘贴,杂乱无章的. 由于现在大多用JA ...

  6. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  7. 【笔记】Java数据结构与算法

    [笔记]Java数据结构与算法 文章目录 [笔记]Java数据结构与算法 1.八大排序应用场景 2.未完待续-- 1.八大排序应用场景 冒泡排序:优化后的冒泡排序可用于当数据已经基本有序,且数据量较小 ...

  8. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  9. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

最新文章

  1. JAVA基础13-Java抽象方法、抽象类、抽象之模板方法模式
  2. AVP 6目GoPro全景拼接
  3. Vue2.x-02根据条件动态设置下拉框、时间选择器、文本框是否可编辑
  4. Java Character 类
  5. 【干货】硅谷创业教父:如何获得创业idea
  6. JAVA方法调用中的解析与分派
  7. linux删除软件包git的命令,linux系统安装git及git常用命令
  8. 02 | Spring Data Common 之 Repository 如何全面掌握?
  9. Faster-RCNN训练时遇到的问题
  10. tdd干扰波形_LTE常见干扰排查(中国移动)
  11. Stream流终结操作方法
  12. linux 读取文件夹命令,Linux系统编程_1_文件夹读取(实现简单ls命令)
  13. 将MongoDB.NET驱动程序与.NET Core WebAPI一起使用
  14. python标准库os_Python标准库 os
  15. Linux中的Ext2、ext3、ext4文件系统如何对磁盘中的文件进行存储和管理
  16. BT601 BT656 BT709 BT1120 解析
  17. 国内地图服务对比分析
  18. Vue多个元素的过渡
  19. Wireshark文档阅读笔记-TCP Flags
  20. HDU 1847 ——Good Luck in CET-4 Everybody!

热门文章

  1. 偏最小二乘回归数学原理推导
  2. Doocker ubuntu 16.04 学习总结(二)-使用docker搭建web服务器
  3. 通过结构计算矩形的面积
  4. 薅羊毛之讯飞输入法助我生成字幕文件
  5. 《HelloGitHub》第 85 期
  6. springboot 整合 oshi-core 监控 JVM及操作系统
  7. jsp mysql主机_云主机或服务器如何布署ASP/NET/PHP/JSP/MYSQL/MYSQL这类的运行环境?...
  8. Deep Poincare Map for Robost Medical Image Segmentation 论文阅读
  9. kubernetes下externalIP的使用
  10. mysql服务器无法连接10055错误解决示例