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 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 ;}
我们知道在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(); } }}
首先要确定我们的操作对象是属于哪个类的,这个类提供了三大内容:属性、构造方法、方法。属性是本身所拥有的内容,可以直接使用。例如:数组提供了一个叫做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不是一种基本数据类型,在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()来判断值是否相等。
将数组转化为字符串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) ;