数组
一、 小练习和数组定义
a b c 写程序,将它们按从大到小的顺序排列public static void main(String[] args) {
int a = 90;
int b = 10;
int c = 20;
int temp = 0;
if (a > b) {
temp = a;
a = b;
b = temp;
}
if (a > c) {
temp = a;
a = c;
c = temp;
}
if (b > c) {
temp = b;
b = c;
c = temp;
}
System.out.println("排完序以后:");
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
// 面试题:如何不用第三个临时变量,把两个 int型变量的值互换
数组: 就是一个容器中,存的全是同一类元素, 对其中的每一个元素可以使用下标进行访问,下标是从0开始的可以进行方便的查询,排序等操作public static void main(String[] args) {
int a = 10;
int b = 222;
a = a + b;
b = a - b;
a = a - b;
System.out.println(a);
System.out.println(b);
}
数组的定义:
元素类型 [] 数组名称 =new 元素类型 [元素个数]
int [] x =new int [10] ; //ok
x 是什么类型? 引用类型中的数组类型
//例子 ,用下标访问数组中的元素
int [] x=new int [3]; //创建一个数组,长度是3
数组的下标是从0开始的
System.out.println(x[0]); //int型默认的初始值是0
System.out.println(x[1]);
System.out.println(x[2]);
int [] x =new int [] {2,4,5} //ok定义数组的时候直接初始化 注意后面的[] 里不要加数字
int [] x =new int [3] {2,4,5} //错误
int [] x={2,4,6} //ok
下面的写法不可以
int [] x=new int[3];
x={2,3,4} //错误,只能在定义的同时初始化
下面的写法不正确
int [3] x =new int [3] ; (等号左边的[] 里不能有值)
二、数组的特性
1) 堆栈内存int [] a={1,5,9};
int [] b=a;2) 脚标越界异常
a[1]=555; //改的是a的第2个元素, 和b 好象没有一毛钱关系,但是,它会影响到数组b
//输入数组a
System.out.println("这是数组a:");
for (int i = 0; i <3; i++) {
System.out.println(a[i]);
}
//输出数组b
System.out.println("这是数组b:");
for (int i = 0; i <3; i++) {
System.out.println(b[i]);
}
// 这两个操作完成后,堆内存中的 {1,5,9} 将变成垃圾
b= null;
a= null;
访问的数组中不存在的下标,将引发异常
int [] a={1,5,9,10,20};
for (int i = 0; i < a.length; i++) {3) 空指针异常
System.out.println(a[i]); //遍历 java.lang.ArrayIndexOutOfBoundsException 数组脚标越界异常
}
访问一个值为null的对象的方法或属性,或值为null的数组的元素或属性,将引发
java.lang.NullPointerExceptionint [] a={1,5,9,10,20}; a=null;
a=null;
int length=a.length; //访问值为null数组的属性
int value= a [2]; //对值为null的数组,访问它的脚标
三、堆内存和栈内存
java程序在运行的时候,要分配内存空间,为了提升效率,java对内存进行了分类管理
== 栈内存
用来存储局部变量,变量用完,内存回收
java中的函数,在运行的时候,会在内存中申请到一块内存空间,然后,这个函数中声明的局部变量,就会从之
块空间中分配空间,函数运行结束,这个函数申请到的这块空间就会回收,这个函数中所有的变量也就消失了
它们占的内存当然也会释放
== 堆内存
数组和对象,用new关键字创建出来实体,都放在堆内存上
每一个实体,都有一个能被引用的内存地址值
实体中的变量,都会有默认的初始值
当实体不再被引用的时候,会在某个不确定的时刻,被垃圾回收器回收
四、数组的小练习
//例一,打印数组中所有的元素String[] nameList = new String[] { "赵明明", "高瑞", "王明", "张三" };//例二,把数组中的元素求合
for (int i = 0; i < nameList.length; i++) {
System.out.println(nameList[i]);
}
System.out.println("-------------倒序输出--------------");
for(int i=nameList.length-1;i>=0;i--){
System.out.println(nameList[i]);
}
float [] array ={3.14f, 24, 25.5f, 66.89f};//例三 把数组中的元素,拼成字符串返回
float sum=0;
for(int i=0;i<array.length;i++){
sum+=array[i];
}
System.out.println(sum); //119.53
附: int [] x={1,3,'A'}; //ok 能编译通过
public static void main(String[] args) {//例四 取数组中的最大元素
int [] x={1,5,7,9,10};
String str="";
for(int i=0;i<x.length;i++){
//如果没到最后,就要每个都加上","
if(i!=x.length-1) {
str+=x[i]+"-";
} else{ //如果到最后了,就不要加","
str+=x[i];
}
}
System.out.println(str); //1-5-7-9-10
}
public class Test {
public static void main(String[] args) {
int [] a={-4,-5,-1,-101,-8,-33,-99,-22};
int result= getMax(a);
System.out.println("数组中最大的是:"+result); //-1
}
static int getMax(int [] x){
int max=x[0];
for(int i=0;i<x.length;i++){
if(max<x[i]){
max=x[i];
}
}
return max;
}
}
五、数组的排序
冒泡int [] a={2,5,7,1,6,3,9,5,11,7};//例子 把排序方法,封装成函数
for(int i=0;i<a.length-1;i++){ //外循环 length-1
for(int j=0;j<a.length-1-i;j++) //内循环 length-1-i{
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ,");
}
public static void main(String[] args) {//例子,使用jdk提供的方法对数组进行排序
int [] a={2,5,7,1,6,3,9,5,11,7};
sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ,");
}
}
static void sort(int [] a) { //这个参数是引用类型
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
java.util.Arrays.sort(a); //正序排的
六、数组的copy
1) 用循环复制略
2) 用jdk提供的类
== java.uitl.Arrays.copyOf(); //注意:它有一个数组类型的返回值
//例子
int [] x ={3,5,6,6,9,10} ;
int [] y=java.util.Arrays.copyOf(x, x.length); //这是一个新数组
对新数组中元素的改变,不会影响原来的数组
== System.arraycopy()
public static void arraycopy(Object src, //源数组
int srcPos, //从目标数组中第几个开始
Object dest, //目标数组
int destPos, //从目标数组中第几个元素开始放
int length) //要复制几个元素
//例子
int [] x ={3,5,6,6,9,10} ;
int [] y=new int[x.length]; //要把上面的数组复制到这个数组中
System.arraycopy(x, 0, y, 0, x.length);
七、一维数组练习
1 声明一个长度为 10的整型数组,里面存10个随机数,然后对这些数求合
public static void main(String[] args) {
//声明一个数组
int x[] =new int [10];
//用随机数初始化
initArray(x);
showArray(x);
//求合
int result=sumArray(x);
System.out.println("合是"+result);
}
//用随机数初始化
static void initArray(int [] x){
for (int i = 0; i < x.length; i++) {
x[i]=(int)(Math.random()*10);
}
}
//求合
static int sumArray(int [] x){
int s=0;
for (int i = 0; i < x.length; i++) {
s+=x[i];
}
return s;
}
//输出数组中的内容
static void showArray(int [] x){
for (int i = 0; i < x.length; i++) {
System.out.print(x[i]+" ");
}}
八、二维数组
String [] x= {"aaa","bbb","3",null }; //数组中存放的都是同一类元素
int [] x={1,2,0,null} ; //不行 基本数据类型的变量,没有null这个取值
int x=null;
char x=null;
boolean x=null; //这几个都错
int [] x ={2,5};
int [] y ={5,8};
int [] z={2,6,7,9} ;
{x,y,z} //每个元素都是数组类型
java中的二维数组,就是数组的数组
int [] [] array =new int [3][] ; //ok 定义一个二维数组, 这个二维数组中有3个元素,每个元素多长不确定
int [] [] array =new int [3][5]; //ok 有三个元素,每个元素是一个长度为5的数组
int [2] [] array =new int [2][] ; //错,不管一维还是二维数组,只要等号左边出现值就是错的
int [] [2] array =new int [2][] ;
int [] [] array =new int [][]; //错
int [] [] array =new int [][3] ; //错
int [] [] array =new int [][]{{2,3},{6,9},{8,3,9}}; //ok 在声明的时候,直接初始化
array[0][0]=100; //给第一个无素赋值
array[2][2]=900; //给最后一个元素赋值
array[array.length-1][array[array.length-1].length-1] ;
//二维数组怎么遍历
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
System.out.print(array[i][j] +"\t");
}
System.out.println();
}
//例一
把一个二维数组中的内容求合
public class Test {
public static void main(String[] args) {
int [] [] array =new int [][]{{2,3},{6,9},{8,3,999}};
int s= sum(array);
System.out.println("合是:"+s);
}
static int sum(int [] [] array ){
int s=0;
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
s+=array[i][j];
}
}
return s;
}
}