数组

作者: 雪上霜 | 来源:发表于2020-04-28 21:46 被阅读0次
    image.png
    image.png
    package com.Hanjiangxue.javase.array;
    
    
    //Java中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object。
    //数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合)
    //数组字面就是一组数据
    //数组可以存储基本数据类型数据,也可以存储引用数据类型的数据
    //数组因为是引用数据类型,所以数组对象在堆内存中。
    //对于数组中如果存储的是Java对象的话,实际上存储的是对象的引用(内存地址)
    //数组一旦创建,在Java中,数组长度不可变。
    //数组分类:一维数组,二维数组,三维数组。。。。多维数组。
    //所以的数组对象都有length属性,(Java自带的)。用来获取数组中元素个数。
    //Java中的数组要求数组中元素类型统一,比如,int类型数组,只能存储int类型,Person类型数组只能存储Person类型。
    //数组中存储的元素类型统一。
    //数组在内存方面存储的时候,数组中的元素内存地址是连续的,存储的每一个元素都是有规则排列的,数组是一种简单的数据结构。
    //所有的数组都是拿第一个小方框的内存地址作为整个数组的首地址。
    //数组中每个元素都是有下标的,从0开始到length-1。通过下标对其存取。
    //数组的优点:查询、查找、检索某个下标的元素效率高,
    //为什么效率高?1、每一个元素的内存地址在空间存储上是连续的;2、每一个元素类型相同,所以占用空间大小一样;
    //3、知道第一个元素内存地址,知道每一个元素占用空间大小,又知道下标,所以通过一个数字表达式就可以计算出某个下标上元素的内存地址,直接通过内存地址定位元素,所以数组的检索效率最高。
    
    //数组中存储100个元素或存储100万个,效率相同的,因为数组是通过公式算出来的。
    
    //缺点:1、由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或向后位移的操作。
    //2、数组不能存储大数据量,为什么?因为很难在内存空间上找到一块特别大的连续的内存空间。
    
    //注意:对于数组中最后一个元素的增删是没有影响的。
    //声明、定义一个一维数组:int[] array1; double[] array2; boolean[] array3; String[] array4;Object[] array5;
    //怎么初始化一个一维数组:包括静态初始化一维数组、动态初始化一维数组。
    //静态初始化语法格式:int[] array = {100,2100,300,55};
    //动态初始化语法格式:int[] array = new int[5];//这里的5表示数组的元素个数,初始化一个5个长度的int类型数组,每个元素默认值为0;
    // String[] names = new String[6];//初始化6个长度的String类型数字,每个元素默认值为null。
    public class ArrayTest01 {
        public static void main(String[] args){
            //使用静态初始化的方式,初始化int类型数组。
            int[] a1 = {1,100,20,40,99};
    
            //所有数组对象都有length属性。
            System.out.println("数组中元素个数"+a1.length);
    
            System.out.println("第一个元素="+a1[0]);
            System.out.println("最后一个元素="+a1[a1.length-1]);
    
            a1[0] = 11;
            a1[a1.length - 1] = 11;
            System.out.println("第一个元素="+a1[0]);
            System.out.println("最后一个元素="+a1[a1.length-1]);
    
            for(int i = 0;i < a1.length;i++){
                System.out.println(a1[i]);
            }
            //a[6] ;//ArrayIndexOutOfBoundsException,数组越界异常
    
            for(int i = a1.length-1;i >= 0;i--){
                System.out.println(a1[i]);
            }
    
            //声明定义一个数组,采用动态方式初始化方式创建。
            int[] a = new int[4];   //创建长度为4的int数组,每个元素默认为0
    
            for(int i = 0;i < a.length;i++){
                System.out.println(a[i]);
            }
    
    
            //初始化一个Object类型数组
            Object[] obj = new Object[3];
    
            for(int i = 0;i < obj.length;i++){
                System.out.println(obj[i]);
            }
    
            String[] s = new String[4];
    
            for(int i = 0;i < s.length;i++){
                System.out.println(s[i]);
            }
    
            String[] str2 = {"abc","af","fjs"};
    
            Object o1 = new Object();
            Object o2 = new Object();
            Object o3 = new Object();
            Object[] objects = {o1,o2,o3};
    
            for(int i = 0;i < objects.length;i++){
                System.out.println(objects[i]);
            }
    
            Object[] objs = {new Object(),new Object(),new Object()};
    
            //什么时候采用静态初始化,动态初始化。
            //当确定数组中存储哪些数据时,采用静态初始化方式。
            //当不确定数组中存储的哪些数据时,采用动态初始化方式。
    
    
        }
    }
    
    image.png
    package com.Hanjiangxue.javase.array;
    
    public class ArrayTest02 {
        public static void main(String[] args) {
            int[] a1 = {1,2,3};
            int a2[] = {3,4,5};
    
            for(int i = 0;i < a1.length;i++){
                System.out.println(a1[i]);
                System.out.println(a2[i]);
            }
    
            int[] x= {1,2,3,4};
            printArray(x);
    
            String[] sar = {"agfa","gjae"};
            printArray(sar);
        }
    
        public static void printArray(int[] array){
            for(int i = 0;i < array.length;i++){
                System.out.println(array[i]);
            }
        }
    
        public static void printArray(String[] array){
            for(int i = 0;i < array.length;i++){
                System.out.println(array[i]);
            }
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    public class ArrayTest03 {
        public static void main(String[] args) {
            int[] a= {1,2,3};
            printArray(a);
    
            int[] a2 = new int[4];
            printArray(a2);
    
            //直接传递静态数组这样写。
            printArray(new int[]{2,3,4});
        }
    
        //用static不用new对象。
        public static void printArray(int[] array){
            for(int i = 0;i < array.length;i++){
                System.out.println(array[i]);
            }
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    //JVM调用main方法的时候,会自动传一个String数组过来。
    public class ArrayTest04 {
        public static void main(String[] args) {
            //JVM传递过来的数组对象长度默认为0.
            System.out.println(args.length);
    
            String[] strs = new String[0];
            //String[] str = {};//静态初始化数组。
            printLength(strs);
    
            //这个数组什么时候有值,用户可以在控制台输入参数,自动转换为String[] args。
            //java ArrayTest04  ajgnl f
            //JVM通过空格的方式分离,把ajgnl f转换成{“ajgnl”,“f”};传递给args。
        }
    
        public static void printLength(String[] args){
            System.out.println(args.length);
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    public class ArrayTest05 {
        public static void main(String[] args) {
            if(args.length != 2){
                System.out.println("使用程序系统时,请输入用户名和密码信息");
                return;
            }
    
            String username = args[0];
            String password = args[1];
    
            //这样不会出现空指针异常。
            //if("admin".equals(username) && "123".equals(password))
            if(username.equals("admin") && password.equals("123")){
                System.out.println("欢迎"+username+"回来");
                System.out.println("欢迎继续使用系统");
            }
    
    
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    //一维数组的深入,数组中存储的类型为:引用数据类型
    public class ArrayTest06 {
        public static void main(String[] args){
    
            int[] array = {1,2,3};
            for(int i = 0;i < array.length;i++){
                int tmp = array[i];
                System.out.println(tmp);
            }
    
            Animal a1 = new Animal();
            Animal a2 = new Animal();
    
            Animal[] animals = {a1,a2};
    
            for(int i = 0;i < animals.length;i++){
                Animal a = animals[i];
                a.move();
                //animals[i].move();
            }
    
            //动态初始化一个长度为2的Animal类型数组。
            Animal[] ans = new Animal[2];
            ans[1] = new Cat(); //Animal 可以存放一个Cat的对象,因为Cat是Animal的子类。
    
            //创建一个Animal类型的数组,数组中存放Cat和Bird
            Animal[] anis = {new Cat(),new Bird()};
    
            for(int i = 0;i < anis.length;i++){
                if(anis[i] instanceof Cat){
                    Cat cat = (Cat)anis[i];
                    cat.move();
                }else if(anis[i] instanceof Bird){
                    Bird bird = (Bird)anis[i];
                    bird.move();
                }
            }
        }
    }
    
    class Animal{
        public void move(){
            System.out.println("Animal");
        }
    }
    
    
    class Cat extends Animal{
        public void move(){
            System.out.println("Cat");
        }
    }
    
    class Bird extends Animal{
        public void move(){
            System.out.println("Bird");
        }
    }
    
    package com.Hanjiangxue.javase.array;
    
    //数组满了,数组扩容,先创建一个大容量的数组,再将数组的数据拷贝过去。
    //数组扩容效率较低,因为涉及到拷贝的问题,所以在以后开发中尽量少的进行数组的拷贝。
    
    public class ArrayTest08 {
    
        public static void main(String[] args) {
            //Java中数组拷贝方法
            //System.arraycopy(src,spos,dest,dpos,length);
            int[] src = {1,11,22,3,4};
    
            int[] dest = new int[20];
    
    //        System.arraycopy(src,1,dest,3,2);
    //        for(int i =0;i < 20;i++){
    //            System.out.println(dest[i]);
    //        }
    
            System.arraycopy(src,0,dest,0,src.length);
            for(int i =0;i < 20;i++){
                System.out.println(dest[i]);
            }
    
            //数组中存储的是引用数据类型可以拷贝
    
            String[] strs = {"hello","whfonw","hofs"};
            String[] newStrs = new String[20];
            System.arraycopy(strs,0,newStrs,0, strs.length);
            for(int i =0;i < 20;i++){
                System.out.println(newStrs[i]);
            }
    
            Object[] objs = {new Object(),new Object()};
            Object[] newObjs = new Object[10];
    
            //拷贝的是内存地址。
            System.arraycopy(objs,0,newObjs,0,objs.length);
            for(int i =0;i < 10;i++){
                System.out.println(newObjs[i]);
            }
    
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    
    //二维数组是一个特殊的一维数组,特殊在这个一维数组当中每个元素是一个一维数组。
    //三维数组:是一个特殊的二维数组,特殊在这个二维数组中每一个元素是一个一维数组。
    //实际开发中使用最多的就是一维数组,二维数组很少使用,三维数组几乎不用。
    //二维数组初始化 int[][] array = {{1,1,1},{2,3,4},{4,5,4}}
    public class ArrayTest09 {
        public static void main(String[] args) {
            //一维数组
            int[] array = {100,200,300};
            System.out.println(array.length);//3
    
            //二维数组
            //以下代码中里面是5个一维数组
            int[][] a= {
                    {100,200,300},
                    {40,30,409,0,4},
                    {3,49,39,30},
                    {0},
                    {2,4,4,3}
            };
            System.out.println(a.length);//5
            System.out.println(a[0].length);//3
            System.out.println(a[1].length);//5
            System.out.println(a[3].length);//1
    
    
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    //关于二维数组中元素的读和改。
    public class ArrayTest10 {
        public static void main(String[] args) {
            //二维数组
            int[][] a = {
                    {34,4,65},
                    {100,200,300,444},
                    {0}
            };
    
            //请取出以上二维数组中的第一个一维数组
            int[] a0 = a[0];
            int a00 = a0[0];
            System.out.println(a[0][0]);
            System.out.println(a[1][2]);//第二个一维数组中的第三个元素。
    
            a[0][2] = 1;
            System.out.println(a[0][2]);//注意别越界。
    
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    public class ArrayTest11 {
        public static void main(String[] args) {
            String[][] array = {
                    {"java","oracle","c++"},
                    {"张三","李四","王五"},
                    {"lucy","jack","rose"}
            };
    
            //遍历
            for(int i = 0;i < array.length;i++){
                for(int j = 0;j < array[i].length;j++){
                    System.out.println(array[i][j]);
                }
            }
        }
    }
    
    
    
    package com.Hanjiangxue.javase.array;
    
    //动态初始化二维数组
    public class ArrayTest12 {
        public static void main(String[] args) {
            //3行4列
            //3个一维数组,每一个一维数组当中4个元素。
    //        int[][] array = new int[3][4];
    //
    //        for(int i = 0;i < array.length;i++){
    //            for(int j = 0;j < array[i].length;j++){
    //                System.out.println(array[i][j]);
    //            }
    //        }
    
            int[][] a = {
                    {1,2,3,4},
                    {4,4,5,3},
                    {3,4,3,3},
                    {3,4,2,5}
            };
            printArray(a);
    
            //记住new
            printArray(new int[][]{{1,3,4},{3,4,5},{3,4}});
    
        }
    
        public static void  printArray(int[][] array){
            for(int i = 0;i < array.length;i++){
                for(int j = 0;j < array[i].length;j++){
                    System.out.println(array[i][j]);
                }
            }
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    import java.util.Arrays;
    
    public class ArraysTest01 {
        public static void main(String[] args) {
            int[] arr = {11,2,44,24,65,1};
    
            Arrays.sort(arr);
    
            for(int i = 0;i < arr.length;i++){
                System.out.println(arr[i]);
            }
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    public class BubbleSort {
        public static void main(String[] args) {
            int[] arr = {13,23,55,73,16,5,3,7,755,22,5};
    
            //冒泡排序,相邻的两个数值进行比较。前面数值如果大则交换,否则继续向后遍历。
            for(int i = 0;i < arr.length;i++){
                for(int j = 0;j < arr.length-i-1;j++){
                    if(arr[j] > arr[j+1]){
                        int tmp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = tmp;
                    }
                }
            }
    
            for(int i = 0;i < arr.length;i++){
                System.out.println(arr[i]);
            }
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    public class SelectSort {
        public static void main(String[] args) {
            int[] arr = {13,23,55,73,16,5,3,7,755,22,5};
    
            //选择排序,每次选择最小的与最前面的数据交换,min为最小值的下标。
            for(int i = 0;i < arr.length-1;i++){
                int min = i;
                for(int j = i+1;j < arr.length;j++){
                    if(arr[min] >  arr[j]){
                        min = j;
                    }
                }
                if(min != i){
                    int tmp = arr[i];
                    arr[i] = arr[min];
                    arr[min] = tmp;
                }
            }
    
            for(int i = 0;i < arr.length;i++){
                System.out.println(arr[i]);
            }
        }
    }
    
    
    package com.Hanjiangxue.javase.array;
    
    public class ArrayBinSearch {
        public static void main(String[] args) {
            int[] arr = {13,23,55,73,16,5,3,7,755,22,5};
    
            //顺序查找
            for(int i = 0;i < arr.length;i++){
                if(arr[i] == 755){
                    System.out.println("下标为"+i);
                    break;
                }
            }
    
            //选择排序
            for(int i = 0;i < arr.length-1;i++){
                int min = i;
                for(int j = i+1;j < arr.length;j++){
                    if(arr[min] >  arr[j]){
                        min = j;
                    }
                }
                if(min != i){
                    int tmp = arr[i];
                    arr[i] = arr[min];
                    arr[min] = tmp;
                }
            }
    
            //二分查找
            int index = binSearch(arr,1);
            System.out.printf(index == -1 ? "不存在" : "下标"+index);
        }
    
        public static int binSearch(int[] arr,int n){
    
    
            int l = 0;
            int r = arr.length-1;
            while(l <= r){
                int mid = (l+r)/2;
                if(arr[mid] == n){
                    return mid;
                }else if(arr[mid] < n){
                    l = mid + 1;
                }else{
                    r = mid - 1;
                }
            }
            return -1;
        }
    }
    
    
    
    import java.util.Arrays;
    
    public class ArraysTest02 {
        public static void main(String[] args) {
            //java.util.Arrays:工具类中哪些方法。
            //所有方法都是静态的,主要使用类名调用。
            int[] arr = {13,23,55,73,16,5,3,7,755,22,5};
    
            Arrays.sort(arr);
    
            int index = Arrays.binarySearch(arr,5);
            System.out.println(index);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:数组

          本文链接:https://www.haomeiwen.com/subject/aequwhtx.html