Java数组(个人笔记八)

数组

  一、 小练习和数组定义

    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型变量的值互换

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);

}

   数组: 就是一个容器中,存的全是同一类元素, 对其中的每一个元素可以使用下标进行访问,下标是从0开始的可以进行方便的查询,排序等操作     
   数组的定义:
    元素类型 [] 数组名称 =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; 
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;   
2) 脚标越界异常 
   访问的数组中不存在的下标,将引发异常 
   int [] a={1,5,9,10,20}; 
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);   //遍历  java.lang.ArrayIndexOutOfBoundsException 数组脚标越界异常
}
3) 空指针异常 
访问一个值为null的对象的方法或属性,或值为null的数组的元素或属性,将引发
java.lang.NullPointerException

int [] 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) {  
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;
}
}
}
}
//例子,使用jdk提供的方法对数组进行排序
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;
}
}



猜你喜欢

转载自blog.csdn.net/weixin_41205479/article/details/79887682
今日推荐