数组的定义应用,内存结构

数组:可以存储多个相同数据类型元素的容器

定义数组的格式(可以分成声明和初始化两个过程)

  1.数据类型[ ] 数组名=new 数据类型 [ 数组元素的个数/数组的长度 ]

例:

int[] arr=new int[2]; //定义了一个长度为2的整型数组arr

 

  2..数据类型[ ] 数组名=new 数据类型 [ ] {元素值1,元素值2} ————–给定元素值,长度就确定了

例:

int[] arr=new int[]{1,2,… };

//声明变量: int[] arr; -----------------存储的是堆的地址

//初始化 arr=new int[]{1,2,… };

  3.数据类型[ ] 数组名={1,2,3} —-------------------常用写法

[ I @ 2a139a55

  System.out.println(arr);

  [ :对象类型,代表对象是数组

  I :这块区域,代表对象的元素类型

  @ :代表后面是地址值

  2a139a55 :哈希码值的十六进制表现形式

  [I@2a139a55 :表明数据的地址池

  java会默认对数组里的元素进行编号,这个编号从0开始,通过地址值编号(下标)共同确定唯一的元素

 

new:用于在内存中开辟空间

内存

  计算机内存:CPU处理的速度很快,硬盘很慢,所以开辟了内存空间,CPU从内存中获取数据

  java内存分为五类:栈,堆,方法区(面向对向讲),本地方法栈(不讲),寄存器(不讲)

栈:存储变量(暂时),系统默认不赋初始值

  存储的内容不再使用的时候,立即清除

堆:存储对象(new),系统默认赋初始值

  存储的对象如果不在使用,就会在某个时间进行回收

 

时间复杂度:核心代码的次数

  二分查找:n/2^x=1 2^x=n x=log2n —– O(log2n)

  冒泡排序:n(n-1)------n2 ———-O(n2)

  Arrays.sort()———— O(nlogn)

空间复杂度:程序执行中额外开辟的内存

  二分查找:O(1) —– 常数为1

  冒泡排序:O(1)

  选择排序:O(1)

系统默认初始值

堆里的空间系统默认初始值

  byte ,short, int-------0

  char-------------------’\u0000‘ \u:以u16进行编码

  long---------------------0L

  float----------------------0.0F

  double-------------------0.0

  boolean——————false

  引用变量-----------------------null

public class Test {
    public static void main(String[] args) {
        int[] arr1;         //声明变量,存储在栈中
        arr1=new int[2];        //进行初始化,存储在堆中
        int[] arr2 = arr1;          //将arr1的堆地址,赋值给arr2,共享堆中的存储空间
    }
}

数组的应用(遍历,最值,逆序,查找,排序,扩容)

  1.遍历(依次输出数组元素)
/*
 * 数组遍历
 * */
//方法一
public class Test {
    public static void main(String[] args) {
        int[] arr ={1,5,6,9,7};
        //操作循环
        //arr.length---数组的长度
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
        
    }
}
​
//方法二
public class Test {
    public static void main(String[] args) {
        int[] arr ={1,5,6,9,7};
        //增强for循环,只能做遍历,不能做增删操作
        //数组元素类型 变量名:要进行遍历的数组名
        for(int i:arr){         //将数组堆中的值依次拷贝到变量i中,对堆中的值没有影响
            System.err.println(i);
        }
}
/* * 数组转成字符串输出 * */ public class Test { public static void main(String[] args) { int[] arr ={1,5,6,9,7}; System.out.println(Arrays.toString(arr)); } }

 

  2.最值
/*
 * 数组的最值
 * */
public class Test {
    public static void main(String[] args) {
        //定义数组
        int[] arr ={1,5,6,9,7};
        //参照物
        int max=arr[0];
        //操作循环
        for(int i=1;i<arr.length;i++){
            //进行比较
            if(max<arr[i]){
                max=arr[i];
            }
        }
        System.out.println(max);
    }
}
​

 

  3.逆序------[1,2,3,4]—>[4,3,2,1]
/*
 *数组逆序
 * */
//方法一
public class Test {
    public static void main(String[] args) {
        //原数组
        int[] arr ={1,5,6,9,7};
        //新数组
        int[] arr2=new int[arr.length];
        
        for(int i=0;i<arr.length;i++){
            arr2[i]=arr[arr.length-i-1];
        }
        //改变arr的堆地址空间
        arr=arr2;
        //转成字符串输出
        System.out.println(Arrays.toString(arr2));
    }
}
​
​
//方法二
import java.util.Arrays;
​
/*
 *数组逆序
 * */
public class Test {
    public static void main(String[] args) {
        //数组
        int[] arr ={1,5,6,9,7};
        for(int i=0;i<arr.length/2;i++){
            //两个整数交换
            int temp;
            temp = arr[i];
            arr[i]=arr[arr.length-1-i];
            arr[arr.length-i-1]=temp;
        }
        System.out.println(Arrays.toString(arr));
    }
}

 

  4.查找(普通,二分(折半):数组要有序)-------------给定一个目标值,找出与数组中对应值的相应下标
/*
 *数组二分查找(折半查找)
 * */
public class Test {
    public static void main(String[] args) {
        //数组
        int[] arr ={1,5,6,4,9,7};
        int n=4;
        //定义变量
        //最小下标
        int min=0;
        //最大值下标
        int max=arr.length-1;
        //中间下标
        int mid=(max+min)/2;
        //标志位
        boolean flag = true;
        
        while(arr[mid] != n){
            //中间下标大于目标值
            if(arr[mid]>n){
                max=mid-1;
            }

            //中间下标小于目标值
            if(arr[mid]<n){
                min=mid+1;
            }            
            //判断目标数不在范围之内
            if(min>max){
                flag = false;
                System.out.println("查无此数");
                break;
            }
            //重新计算新的下标
            mid=(max+min)/2;
        }
        
        if(flag){
            System.out.println(mid);    
        }

    }
}
  5.排序----对数组元素进行排列顺序(冒泡 选择)
/*
 * 冒泡排序
 * */
public class Test {
    public static void main(String[] args) {
        
        int[] arr ={2,3,2,1,3};
        
        //控制轮数
        for(int i=1;i<arr.length-1;i++){
            //参与比较元素的范围
            for(int j=1;j<=arr.length-i;j++){
                //两两比较
                if(arr[j-1]>arr[j]){
                    int temp=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

/*
 * 选择排序
 * */
public class Test {
    public static void main(String[] args) {
        
        int[] arr ={2,6,4,1,3};
        
        //控制轮数
        for(int i=1;i<arr.length;i++){
            //控制参与比较元素的范围
            for(int j=i;j<arr.length;j++){
                if(arr[i-1]>arr[j]){
                    int temp=arr[j];
                    arr[j]=arr[i-1];
                    arr[i-1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}
​/*
 *排序
 * */
public class Test {
    public static void main(String[] args) {
        
        int[] arr ={2,6,4,1,3};
        
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}


  6.扩容(数组定义完成之后长度不变-------数组的复制)
/*
 *数组的扩容(扩大)
 * */
public class Test {
    public static void main(String[] args) {
        //原数组
        int[] arr ={2,6,4,1,3};
        //新数组
        int arr2[] = new int[2*arr.length];
        
        //数组的复制
        //(原数组,起始下标,新数组,开始复制的起始下标,元素个数  )
        System.arraycopy(arr, 0, arr2,0, arr.length);
        
        //数组值赋值
        arr = arr2;
        System.out.println(Arrays.toString(arr));
    }
}/*
 *数组的扩容(扩小)
 * */
public class Test {
    public static void main(String[] args) {
        //原数组
        int[] arr ={2,6,4,1,3};
        //新数组
        int arr2[] = new int[arr.length/2];
        
        //数组的复制
        //(原数组,起始下标,新数组,开始复制的起始下标,元素个数  )
        System.arraycopy(arr, 0, arr2,0, arr.length/2);
        
        //数组值赋值
        arr = arr2;
        System.out.println(Arrays.toString(arr));
    }
}
​
//简化版public class Test {
    public static void main(String[] args) {
        //原数组
        int[] arr ={2,6,4,1,3};
        arr=Arrays.copyOf(arr, 2*arr.length);//扩容
        System.out.println(Arrays.toString(arr));
    }
}

 

二维数组

  存储的元素,是一维数组的数组

  定义格式

数据类型[][] 数组名 = new int[有几个一维数组] [ 每个一维数组的元素个数];  // 第一种
数据类型[][] 数组名 = new 数组类型[][];  // 第二种

例如:

int[][] arr = new int[2][2];

 

初始化

int arr = new int[2] []; //声明了两个一维数组,未开辟内存空间

arr[0]=new int[4];

arr[1]=new int[]{2,3,4};

arr[0]={1,2,3}//不可以

 

 

最常用:

  3.数据类型[ ] [ ] 数组名 = {{元素值1,元素值2,…},{元素值1,元素值2,…},…};

  4.int [ ]x,y[ ]----------int[ ] x ,int y [ ] [ ]

如果【】在数据类型后面,随着数据类型修饰的变量一起去修饰,如果【】在变量后面,就只能修饰这个变量。

二维数组地址值:

[[I@2a139a55
二维数组 整型 后面是地址 地址
/*
 *数组的扩容(扩小)
 * */
public class Test {
    public static void main(String[] args) {
​
        int[][] arr = new int[2][2];
        
        //一维数组地址值
        System.out.println(arr[0]);
        //一维数组元素
        System.out.println(arr[0][0]);
    }
}

应用(遍历)

/*
 *遍历二维数组
 * */
//方法一:普通for
public class Test {
    public static void main(String[] args) {
​
        int[][] arr = {{1,2},{1,5,6},{8,7}};
        
        //遍历二维数组
        //有几个一维数组
        for(int i=0;i<arr.length;i++){
            //每个数组有多少个元素
            for(int j=0;j<arr[i].length;j++){
                System.out.println(arr[i][j]);
            }
        }
        
    }
}
/*
 *遍历二维数组
 * */
//曾强for循环
public class Test {
    public static void main(String[] args) {
​
        int[][] arr = {{1,2},{1,5,6},{8,7}};
        
        //遍历二维数组
        //有几个一维数组
        for(int[] i : arr ){
            //每个数组有多少个元素
            for(int j:i){
                System.out.println(j);
            }
        }
    }
}

 

数据类型[ ] [ ] 数组名 = new 数组类型 [ 有几个一维数组 ] [ ];

posted @ 2020-08-18 17:08  minnersun  阅读(189)  评论(0编辑  收藏  举报