• 2
  • 1
分享
  • 一篇文章带你搞定JAVA数组
  • 千里 2018-10-31 13:41:55 字数 8690 阅读 2773 收藏 1

java数组

Java数组在学习Java过程中属于比较重要的一个章节也是比较难的一个章节,作业带领大家讲解Java数组的一些相关操作。

数组的概念

 数组就是一组数据,我们定义变量会比较多,如果使用传统的方式,会出现的问题是变量很多,代码也很多,而且使用起来不方便。

int t0 = 0 ;int t1 = 1 ;int t2 = 2 ;int t3 = 3 ;int t4 = 4 ;int t5 = 5 ;int t6 = 6 ;int t7 = 7 ;int t8 = 8 ;int t9 = 9 ;

 以上代码是通过传统方式定义了10个整数变量,如果使用数组,在定义上可以更为简单。

int t[] = {0,1,2,3,4,5,6,7,8,9}

 从变量的操作上,变量的操作一般有:声明、赋值、修改值、输出、变量的处理

数组的声明

 传统的变量声明:

int t0,t1,t2,t3,t4,t5,t6,t7,t8,t9 ;

 数组的声明:

int t[] = new int[10] ; //是通过new int[10]来生成了10个“变量”

 这个数组生成的变量为:

t[0]、t[1]、t[2]、t[3]、t[4]、t[5]、t[6]、t[7]、t[8]、t[9]

数组的赋值

 传统的变量赋值需要分个赋值,数组的赋值也可以分个赋值,也可以一次性进行赋值,但是如果是一次性赋值需要在声明的时候同时赋值。

• 以下为分个赋值:

//变量的赋值t0 = 0 ;//数组的赋值t[0] = 0 ;

• 数组可以实现一次性全部赋值

int t[] = {0,1,2,3,4,5,6,7,8,9} ; //它只能够在声明的时候进行全部赋值

• 我现在要将以上数组t[]中的10个元素全部值修改为0

 我们可以发现数组有一个规律,就是下标是连续的,如果我使用for语句就可以通过循环方式进行有规律的赋值了,这个是普通变量所做不到的地方

 for(int i=0 ;i<9 ;i++){    t[i] = 0 ;}

数组赋值小练习

声明一个包含10个元素的整数数组

使用随机整数对这10个元素进行赋值

输出数组的元素

 我们不能够使用 System.out.println(array) ;,假设array是数组。这个输出结果有值,但不是我们想要的。

 输出数组元素的方法有两种:

• 方法一:

//array.length是获取数组的长度,数组的最后一个元素的下标是数组的长度-1for(int i=0; i<array.length;i++){    System.out.println(array[i]) ;}

• 方法二:

 我们可以使用foreach增加型for循环来实现将数组的元素进行输出,我们经常会处理数组,所以for循环专门给我们设计一个输出数组元素的方法。

for(int num:array){    System.out.print(num+"\t") ;}

 在for循环中,我们要输出的值为num,所以我们定义了一个num变量来依次接收数组的每一个元素。而这个数组元素数据类型是int型的,所以我们就使用int来作为num的数据类型。后面跟的是冒号,数组名称。

数组的初始值

 我们可以声明一个数组,但是不赋初始值,这个数组的每一个元素是存在初始值的。

int int_array[] = new int[5] ; //初始值为:0float f_array[] = new float[5] ; //初始值为:0.0char c_array[] = new char[5] ; //初始值为:ASCII的第一个值\u0000 空boolean b_array[] = new boolean[5] ; //初始值为:falseString s_array[] = new String[] ; //初始值为:null

数组的操作

 我们可以对数组的元素进行操作,也可以对整个数组进行操作。操作主要是对数组的下标和数组元素及值进行操作,也是通过我们之前所学习的if、for循环进行操作的。

我们可以将所有元素的值相加

//我们以前做过1-100,有100个数依次相加 //这回是我们有下标0-99的100个元素依次相加int sum = 0;//以前是数字0累加到数字100for(int i=0;i<=100;i++){    sum = sum+i ;}//现在是元素0累加到元素100for(int i=0;i<100;i++){    sum = sum + array[i] ;}//求元素的平均值int avg = sum / array.length ;

2.通过下标获取元素,通过元素可以做四则运算,比较

//获取元素中的最大值,最小值//将一个临时变量,对每一个元素进行比较,如果元素的值更大,则将元素的值赋值给到临时变量就可以得到这个数组的最大值。相反就可以得到最小值int max=array[0],min=array[0] ;for(int i=0;i<array.length;i++){    if(max<array[i]){        max = array[i] ;    }    if(min>array[i]){        min = array[i] ;    }}

3.无序数组的排序(冒泡排序)

//定义一个数组,包含若干个元素。为了效果的明显,元素的值为:int array[] = {9,8,7,6,5,4,3,2,1} ;int temp ;for(int circle=0;circle<array.length;circle++){    for(int count=0;count<array.length-circle-1;count++){        if(array[count]>array[count+1]){            temp = array[count] ;            array[count] = array[count+1] ;            array[count+1] = temp ;        }    }}

4.二分查找法又叫折半查找法

 在一个有序数组中,找到一个我要元素的,看它在哪个位置。

int array[] = {1,2,3,4,5,6,7,8,9} ;int find = 8 ;for(int i=0;i<array.length;i++){    if(find==array[i]){        System.out.println("这个元素的下标为:"+i);    }}

 二分查找法解析:

先要定义开始位置和结束位置,默认的开始位置就是array[0],结束位置是array[array.length-1]

再将要查找的内容与正中间那个元素进行比较array[(start+end)/2]

如果要查找的数小于正中间那个元素,就将end=置为正中间。反之,就将开始位置调到正中间。

一直到查找到我要的数据为止(循环)

int array[] = {1,2,3,4,5,6,7,8,9} ;int find = 8 ;int start = 0,end = array.length-1 ;int middle ; //作为中间数while(true){    middle = (start+end)/2 ;    if(find==array[middle]){        System.out.println("要查找的数据下标为:"+middle);        break ;    }else if(find > array[middle]){        start = middle ;    }else if(find < array[middle]){        end = middle ;    }}

java数组函数

 java提供了一些关于数组的函数,像java的排序和java数组中查找数据,只需要使用一个函数就能够实现了,已经可以不知道写这样的代码了。

 在java api中提供了Arrays类可以直接操作java数组。例如要使用二分查找法来查找一个数所在数组的位置:

import java.util.Arrays;public class Search1 {    public static void main(String[] args) {        int array[] = new int[500] ;        int find = 400 ;        for(int i=0;i<array.length;i++){            array[i] = i+5 ;        }        int result = Arrays.binarySearch(array,find) ; //核心代码        System.out.println(result);    }}

 数组中也提供了,对数组进行排序的功能,也可以直接使用Arrays类的排序方法进行排序。其操作为:Arrays.sort(数组名),提供了对数组进行排序,但没有提供反向排序,不过可以通过程序对数组实现反序排序。其代码为:

int array[] = {1,2,3,4,5,6,7,8,9} ;for(int i=0;i<(0+array.length)/2;i++){    int temp = array[i] ;    array[i] = array[array.length-1-i] ;    array[array.length-1-i] = temp ;}

关于main(String args[])

 我们知道在java main方法中有一个String args[]也是一个数组,那么它是怎么使用的呢?我们先看一段程序:

public class Search1 {    public static void main(String args[]) {        System.out.println(args[0]);    }}

 它的执行结果为:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

 出现数组越界异常,我们如果让它不越界,那么就需要给这个数组赋值让其用起来。

二维数组

 在Java中,二维数组用得并不是很多。在C语言会涉及到二维数组,因为在C语言中没有字符串的概念,所以用到字符串必须是字符数组,然后要使用到字符串数组,这时候在C语言中就成了二维数组。其实二维数组就是数组中包含数组,相当于一栋大楼包含若干个单元,每个单元包含若干个房间,每个房间若干个柜子,每个柜子包含若干个抽屉。

 二维数组的表示:

char array[][] = {{'a','b'},{'c'},{'d','e','f'}} ;

 就是一个大的数组array[]中包含了三个小的数组,其中array[0]元素又是一个数组,包含两个数据;array[1]元素也是一个数组,包含1个数据;array[3]也是一个数组包含3个数据。如果要表示'a'这个数据,则是:array[0][0]来表示 ,表示第0个数组中的第0号元素。如果要表示'e'这个元素,则是:array[2][1]表示第2个数组中的第1号元素。

 二维数据也可以使用for循环来操作它,操作的也是下标。也可以使用增强型foreach循环来查看元素。

char array[][] = {{'a','b'},{'c'},{'d','e','f'}} ;//外层数组for(char out[]:array){    //内层数组    for(char in:out[]){        System.out.println(in) ;    }}

 以下是使用双重for循环来输出二维数组的所有元素

public class ArrayTest {    public static void main(String args[]) {        char array[][] = {{'a','b'},{'c'},{'d','e','f'}} ;        //外层数组,得到3个数组,分别为:array[0],array[1],array[2]        for(int i=0;i<array.length;i++){            //内层数组,是针对于每一个里面的数组而言的            //这个for循环跟一维数组的操作是一样的            for(int in=0;in<array[i].length;in++){                System.out.print(array[i][in]+"\t");            }            System.out.println();        }    }}

java api文档的使用

 首先要确定我们的操作对象是属于哪个类的,这个类提供了三大内容:属性、构造方法、方法。属性是本身所拥有的内容,可以直接使用。例如:数组提供了一个叫做length的属性,构造方法是用来构造一个对象的,例如:Date d = new Date(),这个Date()就是一个构造方法,通过new关键字来完成构造,把构造的结果保存到对象d中,这个对象d是Date类型的。

 方法的使用的:直接用对象名.方法名即可,例如:d1.getTime(),在这里getTime()就是方法名,在api文档中,会告诉我们使用这个方法会返回一个什么类型,我们就可以使用对应类型的变量来存储它的操作结果,如果是void则不需要使用变量来存储它的操作结果。在api结果列中,有时候还会出现static关键字,说明这个方法不需要构造对象,使用类名称.方法名称可以直接使用。例如:Arrays.binarySearch(array, 400)

• 附:

    交换两个变量的值,一般我们都会通过设置临时变量temp来存储要交换的值,其实也可以不用临时变量,可以通过其他方式来实现。

//有两个变量a和b,分别设置了不同的值。//通过以下三行代码,可以实现两个值的交换int a=10,b=20 ;a = a+b ;b = a-b ;a = a-b ;

String类的使用

 String不是一种基本数据类型,在C语言是没有String类型的,所以在Java中String的首字母是大写的,基本数据类型的首字母是小写的。

 正是因为String数据是大写的,所以它是一种类,就具有对应的对象,使用其构造方法和方法。

String类可以通过构造方法生成对象:

String str = new String("hello world") ; //这种写法是可行的,这种方式会生成一个新的字符串

 当然,也可以通过String str = "hello world" ;来生成一个字符串对象。

问题:

 上述提供了两种方法,到底哪种比较好。

String str1 = "hello world" ;String str2 = "hello world" ;String str3 = new String("hello world") ;String str4 = new String("hello world") ;//以下是用来判断是否为同一个数据,变量是在内存中,是否为同一块内存数据System.out.println(str1==str2) ; //?System.out.println(str3==str4) ; //?System.out.println(str2==str3) ; //?

 答案是:true、false、false,这说明str1和str2是同一块内存数据,也就是说定义str1的时候因为没有"hello world"在内存中存在,所以会开辟一块空间存储"hello world"。但是在定义str2的时候,因为系统已经有了"hello world",所以系统不再开辟空间,让其直接指向str1所在内存空间,节约了内存。而str3因为使用了new强行开辟一块内存空间,所以这时候系统必须开辟一块内存空间,造成了两个都包含"hello world"的数据内容。str4也是因为使用new关键字,强行开辟了一块空间。

 我们还发现一个问题,虽然str1、str2和str3以及str4的值都是"hello world",但是它们并不相等(==)。所以我们用等于去判断两个值是不是一样,是不可行的。那么String提供了一个方法equals()来判断值是否相等。

String类的常见方法

将数组转化为字符串new String(char[] arr),注意这是一个构造方法,所以代码实现为:

char array[] = {'1','2','3','4','5','6','7','8','9'} ;String charArray = new String(array) ; //构造方法的使用System.out.println(charArray);

将字符串转化为数组,对应的方法为:toCharArray() ,其得到的结果为:char[]数组

例如:有一个字符串,Hello world 123,统计大写,小写,数字各有多少个

String str = "Hello world 123" ;//将str打散为普通的字符数组,因为只有打散成为了普通数组才有办法对每一个字符分别进行比较char temp[] = str.toCharArray() ;//得到了数组之后,就可以通过for循环从第0个元素到最后一个元素进行遍历//遍历元素的时候,进行if判断,进行大写判断,小写判断,数字判断

查看某个位置的字符,charAt(int index)

例如:通过身份证查看性别,我们知道是身份证的第17位,如果是双数则为女,单数为男

String idCard = "430121198801022345" ;char s = idCard.charAt(16) ;if(s%2==0){    System.out.println("该身份证为女");}else{    System.out.println("该身份证为男");}

比较两个字符串的值是否相等:equals()

boolean result = str2.equals(str3) ; //equals是str2的方法,所以带点。equals()括号包含要比较的内容boolean result = str2.equals("hello world") ;

转字符串转化为byte[]数组,以后在java文件读写中有用到

byte something[] = str1.getByte() ;byte anything[] = "hello world".getByte() ;

字符串第一次出现某字符的位置,结果为索引地址

//因为str字符串中没有'a',所以index的结果为-1String str = "hello world" ;int index = str.indexOf('a') ;System.out.println(index);

求字符串的长度,是length()方法,所以有括号。需要与数组区分开来。

得到字符串的一部分substring(int start,int end),例如求身份证的出生日期

忽略字符串的前后空格trim(),这个在开发中用得非常多。一般在输入框中获取用户输入内容,都需要进行trim()处理

String newstr = oldstr.trim() ;

 附:在测试的时候,不用分别使用前面有空格,后面有空格 ,前后都有空格的数据进行测试。

其他基本数据类型转为字符串,使用valueOf(数据),因为是static方法,所以使用valueOf()方法的时候,是直接使用String.valueOf(数据)来实现

String str = String.valueOf(3.14) ; //这时候3.14就成了一个字符串了

然而有时候,我们遇到了是字符串型的数字,要转化为普通数字,又该如何处理?这时候要使用到基本数据类型所包装的类方法来解决。

String num = "3.14" ;double pi = Double.parseDouble(num) ; //如果要将String对象转为整数,则用:int a = Integer.parseInt(num) ;

前面讲到了基本数据类型的包装类,通过包装类我们可以获取他们对应的最大值,最小值

System.out.println(Integer.MAX_VALUE) ;System.out.println(Byte.MAX_VALUE) ;System.out.println(Byte.SIZE) ;

 

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 互联网行业发展的十多年,对软件的使用要求越来越高,所以企业对招聘测试人也从当初的功能测试上升到自动化测试,那么要成为一名合格的测试工程师需要具备哪些技能。不光是符合企业需求,也能提高个人价值,说白了就是提高自己的收入那么从事软件测试行业需要学习哪些技能?接下来小编就来给大家讲讲软件测试工程师需要学习哪些技能。测试用例这是每个工程师必备的技能,也是你进入测试行业的基础门槛。测试用例可以参考我之前写的文章。测试用例的方法流程分析法、状态迁移、正交试验、因果图、等价类、边界值、边界值应用场景,判定表等都是测试用例的相关方法,也只有账务了相关的方法,才能写覆盖率高的测试用例。缺陷管理工具缺陷管理工具是...
            0 0 1145
            分享
          •   尽管他的 Twitter-X 平台屡屡出现问题,埃隆-马斯克(Elon Musk)还是频频瞄准新的对手。据马斯克称,维基百科要求用户提供了过多的资金。埃隆-马斯克上周末发布了一系列关于维基百科的推文,质疑维基媒体基金会为何要求"这么多钱"。这个美国非营利组织由吉米-威尔士(Jimmy"Jimbo"Wales)于 2003 年成立,负责托管和管理维基百科及其他维基相关项目。该基金会经常向用户募捐,马斯克似乎对这种经常性的要求感到不满。  马斯克认为,维基百科"绝对"不需要那么多钱来维持在线。马斯克在Twitter上说,用户甚至可以在...
            0 0 691
            分享
          • 9 月 9 日消息,Google Fi 今天推出了三项更新,重点关注 MVNO 在旅行时的国际体验,首先是针对 iPhone 用户的 Wi-Fi 呼叫功能。这也意味着,在多年只支持 Android 手机业务后,Google Fi 终于也支持了苹果 iPhone 机型的 Wi-Fi 通话功能。如果 Wi-Fi 和移动数据都可用,谷歌表示它将“将您的呼叫转移到为您提供最佳连接的任何一个”。此外,Google FI 还带来了灵活和无限 Plus 计划,iPhone 现已支持国际热点网络共享功能。随着新功能的上线,Google FI 对 iOS 设备的支持越来越好,虽然它仍然不提供美国本土的 5G 服...
            0 0 1308
            分享
          • 这篇将介绍 Cypress 如何生成测试报告Cypress 可以生成 XML 和 JSON 的测试报告文件,需要我们再生成可视化的报告在这里就介绍一下简单且好看的测试报告 mochawesome现在让我们来安装它吧``` npm install --save-dev mocha mochawesome mochawesome-merge mochawesome-report-generator ```接下里让我们做一下配置,我们在 cypress.json 配置报告生成器reportDir: 配置生成的 测试结果 JSON 文件目录o...
            0 0 3311
            分享
          •  一、平摊分析简介平摊分析是算法研究中的一种常用思想。平摊分析中,执行一系列数据结构的操作所需要的时间是通过对执行的所有操作求平均而得出的。平摊分析可以用来证明在一系列操作中,通过对所有操作求平均之后,即使其中单一的操作具有较大的代价,但是其平摊代价还是很小的。平摊分析有三种常用技术,分别是聚集分析、记账方法和势能方法。以上是平摊分析的学术介绍,也许看起来不够直观,不能瞬间秒懂,但是二进制计数器想必大家都有接触,今天就通过二进制计数器来学习平摊分析思想。现在有一个数组A来实现二进制计数器的功能,数组A有K位,A[0]为最低位,A[k-1]是最高位,每一位取值可以为1或0,A可以用来表...
            0 1 5021
            分享
      • 51testing软件测试圈微信