Java中数组的定义与使用(详解)

1、数组:是引用数据类型。
1)数组赋值:int[] a={1,2,3,4};
2)数组动态初始化(声明并开辟数组):eg:int[]a=new int[5];//若这个数组元素没有数组化,这个数组中默认值为0(根据元素类型来选择 例如 double类型就是0.0 int类型就是0)
数组的访问通过索引完成。如果访问超过索引访问,那么产生⽣"java.lang.ArrayIndexOutOfBoundsException"异常信息。
3)数组属于引用类型 因此在使用之前一定要开辟空间(实例化)
数组存放在堆内存中 数组属性存放在栈内存中
引用变量(存放在哪里不确定):
形参 栈
局部变量 栈
属性 堆
静态属性 方法区
java内存中有三个区域:栈去 堆区 方法区 (引用有可能在栈区 有可能在堆区)
以后使⽤静态⽅式定义数组的时候,请使⽤完整格式。
2、引用传递(java都是值传递,所有形参的改变都不会影响实参):引用的方法调用也是值传递 形参的改变不会影响实参
引用是用来找到实际对象的线索​
1)引用类型是个线索,用来找到堆中真正的数据
2)引用类型也是值传递,形参的改变不会影响实参
关于数组的练习(理解引用传递

public static void method(int[]a){
    a=new int[]{10,11,,12,13,14};
}
public static void method2(int []b){
      b[0]=19;
}
public static void main (String[]args){
        int[]a={4.5.6.7.8};
        method(a); 结果a数组还是原来的值 []a={4,5,6,7};
        int[] b={1,2,3,4,5};
        method(b); 结果[]b={10,2,3,4,5};
}

3.练习数组练习题:
(1).二分查找

//方法1:[left,right)
public static int binarySearch(int[]a,int v){
        int left=0;
        int right=a.length;
        while(left<right){
        int mid=(right+left)/2;
        if(a[mid]==v){
            retrun mid;
           }
       else if(v>a[mid]){
            left=mid+1;
          } else{
           right=mid;
           }      
   }
return -1;
}
//方法二:[left,right]
public static int binarySearch2(int[]a,int v){
        int left=0;
        int right=a.length-1;
        while(left<=right){
        int mid=(right+left)/2;
        if(a[mid]==v){
            retrun mid;
           }
       else if(v>a[mid]){
            left=mid+1;;
          } else{
           right=mid-1;
           }      
         } 
        return -1;
}

(2)、冒泡排序

//基础版本:
pubic static int bubbleSort(int[]a){
    for(int i=0;i<a.length;i++){
        for(int j=1;j<a.length-i;j++){
                 if(a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
            }
      }
   }
}
//优化版本:(节省时间,若数组有序就不需要再一次的进行判断)
public static void bubbleSort(int[]a){
    for(int i=0;i<a.length;i++){
        boolean sorted=true;//假设数组是有序地 
        for(int j=1;j<a.length-i;j++){
                 if(a[j-1]>a[j]){
                    int temp=a[j-1];
                    a[j-1]=a[j];
                    a[j]=temp;
                    sorted=false;
            }    
      }
      if(sorted==true){
                return;
            }
   }

(3)、求取数组中除去最大值与最小值的平均值

public static double average(int[] a){
 int sum=0;
 int max=Integer.MIN_VALUE; //Integer类包装一个对象中的原始类型int的值。
// 类型为Integer的对象包含一个单一字段,其类型为int 。
 int min=Integer.MAX_VALUE;
for(v:a){
sum+=v;
if(v>max){
max=v;
}
if(v<min){
min=v;
}
}
return (double)(sum-max-min)/(a.length-2);
}

(4)、将数组中的值向右旋转k位

/*System.arraycopy(源数组引用,源下标,目标数组引用,目标下标,长度(即要复制的数组元素的个数));将指定源数组中的数组从指定位置复制到目标数组的指定位置
Arrays.copyOf(int[] a,int newLength);
Arrays.copyOfRange(int[] a,int from,int to);//a[from,to)
eg:int[] nums={1,2,3,4,5};
k=3   ->  {3,4,5,1,2}
k=8    ->{ 3,4,5,1,2}*/
public static int[] rotate(int[] nums,int k){
    k=k%nums.length;
   int[] rightPart=Arrays.copyOfRange(nums,nums.length-k,nums.length);
   //拷贝右边数组的部分 数组元素数个数为K个
   System.arraycopy(nums,0,nums,k,nums.length-k);
   //拷贝左边数组部分 拷贝到nums数组中,数组中元素个数为nums.length-k个
   System.arraycopy(rightPart,0,nums,0,k);
   return nums;
}
public static void main(String[]args){
    System.out.println(Arrays.toString(rotate(new int[]{1,2,3,4,5},3)));
}

(5)、将数组中的偶数放在奇数的前面

/*方法一:分别设定两个数 一个begin指向数组中的第一个元素,
另一个end指向数组中的最后一个元素,两个数分别向中间移动,若begin指向
了奇数,end指向了偶数,则将这两个数所指向的数组元素进行交换*/
import java.util.Arrays;
public static void swap(int[] a,int i,int j){
    int t=a[i];
    a[i]=a[j];
    a[j]=t;
}
​public static int[] partition1(int[] nums){
    int begin=0;
    int end=nums.length-1;
//从【begin,end】区间内的数是未判断的数
        //[0,begin) 偶数
        //【end,nums.length)奇数
     while(begin<end){
            while(begin<end&&nums[begin]%2==0){
                    begin++;
                }
            while(begin<end&&nums[end]%2!=0){
                    end--;
                    swap(nums,begin,end); 
         }
     }
return nums;
}
public static void main(String[]args){
System.out.println(Arrays.toString(partition1(new int[]{1,4,2,3,7,8,6})));
}
/*方法二:设定两个数i,b都指向数组的第一个元素,让其中一个元素i向后移动 遍历整个数组
 在遍历的过程中,若i所指向的数为偶数,b所指向的数为奇数,则交换他们所指向的数,
否则b,i向后移动。*/​​
public static int[] partition2(int[] nums){
int b=0;
for(int i=0;i<nums.length;i++){
    if(nums[i]%2==0){
        swap(nums,i,b);
        b++;
  }
}
return nums;
}

4.数组的操作:
1)根据下标访问对应的元素a[index] 0<=index<length
遇到的异常有:NullPointerException/ArrayIndexOutOfBounds
2)获取数组的长度 a.length
遇到的异常 当a.length为空时 异常为:NullPointerException
5、数组的遍历
int []a={1,2,3,4,5};
for(int i=0;i<a.length;i++){
a[i];
}

for(int element:a){ //foreach 形式
element
}
其中有什么不对的地方,还请大家多多指教。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值