• Java 数组


    1.定义数组的方式

    类/基本类型 [] 数组名 = new 类/基本类型[长度];

    例如:

    node[] a=new node[5];
    int [] b=new int[6];
    double []c=new double[6];

    缺点:长度固定,不够灵活

    定义的时候就初始化了,类数组的初始值是null,基本类型数组的初始值是0;

            for(int i=0;i<a.length;i++)
                System.out.println( "i="+i+"  "+a[i]+"  "+b[i]+"  "+c[i] );
    /*输出
    i=0  null  0  0.0
    i=1  null  0  0.0
    i=2  null  0  0.0
    i=3  null  0  0.0
    i=4  null  0  0.0
    */

    2.获取长度

    数组名.length;

    a.length;b.length;

    用于遍历,越界访问则异常

    3.内存

            int[] x = null;
            x = new int[3];
            x[0] = 10;
            x[1] = 20;
            x[2] = 30;
            x = null;   

     

    4.引用

    int[] a=new int[4];

    等号右侧:创建了一个int型数组对象
    等号左侧:变量a称为该对象的引用(Reference)
    称作:变量a指向一个对象

    int[] a=new int[4];
    int[] b=a;

    a指向一个对象,b指向 和 a指向 相同 的对象,a和b都是该对象的引用,a和b都可以操作目标对象

    int [] a={1,2,3,4};
    int [] b=a;
    a=null;//空对象

    此时a不指向任何对象,不能再访问,比如把数组第一个值改为12,a[0]=12会出错,但是b[0]=12不会出错。

    int [] a={1,2,3,4};
    System.out.println(a[0]+" "+a[1]+" "+a[2]);
    a=new int[3];
    a[0]=a[1]=a[2]=55;
    System.out.println(a[0]+" "+a[1]+" "+a[2]);
    /**输出
    1 2 3
    55 55 55
    */

    创建一个数组对象obj1,内容为1,2,3,4
    创建另一个数组对象obj2,内容为0,0,0
    obj2内容变为55,55,55
    此时obj1无人引用(失去引用的对象),会被java系统自动回收

    如果想保留obj1,应该a=new int[3];之前加一句int [] b = a;这样可以使b引用a,a另外去引用别的也没关系。

    5.匿名数组

    在栈内存中没有任何引用,只在堆内存开辟空间,存放数据

    System.out.println(new int[]{1,2,3}.length);

    和失去引用的对象一样,用一次就废了,没办法重用,会被java系统自动回收。

    6.用Arrays实现对数组的操作

    导入包:import java.util.Arrays;

    (1)排序

    语法: Arrays.sort(数组名);
    可以使用 sort() 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列),字符串则以首字母排序

    (2)将数组转换为字符串后捆绑输出

    语法: Arrays.toString(数组名);

    可以使用 toString() 方法将一个数组转换成字符串,该方法按顺序把多个数组元素连接在一起,多个元素之间使用逗号和空格隔开

    import java.util.Arrays;
    public class MyTest8 {
        public static void main(String[] args) {
            String[] hobbies = { "sports", "game", "movie" };
            int [] a= {11,33,44};
            for(int i=0;i<hobbies.length;i++)
                System.out.println(hobbies[i]);
            System.out.println(Arrays.toString(hobbies)  );
            System.out.println(Arrays.toString(a)  );
        }
    }

    输出:

    sports
    game
    movie
    [sports, game, movie]
    [11, 33, 44]

    (3)复制数组

    语法: 数据类型 [] 新的数组名 = Arrays.copyOf(需要复制的数组名,需要复制的长度);

    public class MyTest8 {
        public static void main(String[] args) {
            int [] a = {11,33,44,20,53,87};//初始化长度为6的数组
            int [] c1 = Arrays.copyOf(a,2);//复制前2个长度的数组
            int [] c2 = Arrays.copyOf(a,4);//复制前4个长度的数组
            int [] c3 = Arrays.copyOf(a,a.length);//完全复制
            System.out.println("a数组的长度"+a.length);
            System.out.println("c1数组的长度"+c1.length);
            System.out.println("c2数组的长度"+c2.length);
            System.out.println("c3数组的长度"+c3.length);
            for(int i=0;i<a.length;i++)
                System.out.print(a[i]+"  ");
            System.out.println();
            for(int i=0;i<c1.length;i++)
                System.out.print(c1[i]+"  ");
            System.out.println();
            for(int i=0;i<c2.length;i++)
                System.out.print(c2[i]+"  ");
            System.out.println();
            for(int i=0;i<c3.length;i++)
                System.out.print(c3[i]+"  ");
            System.out.println();
        }
    }

    输出:

    a数组的长度6
    c1数组的长度2
    c2数组的长度4
    c3数组的长度6
    11 33 44 20 53 87
    11 33
    11 33 44 20
    11 33 44 20 53 87

    7.作为参数传入方法

    public class MyTest8 {
        public static void main(String[] args) {
            int [] a= {11,33,44};
            MyTest8 test=new MyTest8();
            test.print(a);
            System.out.println("2  "+a[0]+" "+a[1]+" "+a[2]);
            test.print2(a);
            System.out.println("4  "+a[0]+" "+a[1]+" "+a[2]);
        }
        public void print(int []c )
        {
            System.out.println("1  "+c[0]+" "+c[1]+" "+c[2]);
            c[0]=10;c[1]=20;c[2]=30;
        }
        public void print2(int a[])//形参名可以相同,并且int [] a和int a[]效果一样
        {
            System.out.println("3  "+a[0]+" "+a[1]+" "+a[2]);
            a[0]=a[1]=a[2]=1;
        }
    }

    输出:

    1 11 33 44
    2 10 20 30
    3 10 20 30
    4 1 1 1

    理解:方法里的形参,相当于创建新的引用来 共同引用a数组,可以对a数组进行操作,进行的操作直接对堆中的数据进行修改。

    8.类数组

    类 [] 数组名 = new 类[长度];

    package my_acm;
    import java.util.Arrays;
    public class MyTest8 {
        public static void main(String[] args) {
            Student[] stu = new Student[3];
            for(int i=0;i<stu.length;i++)
                System.out.println(stu[i]);
            stu[0]=new Student(1);
            stu[1]=new Student(2,"守林鸟");
            stu[2]=new Student(3,"霸王别鸡",21);
            System.out.println(stu.length);
            for(int i=0;i<stu.length;i++)
                System.out.println(stu[i]);
            for(int i=0;i<stu.length;i++)
                System.out.println(stu[i].toString());
            stu[0].say();
        }
    }
    
    class Student{
        
        private int id;
        private String name;
        private int age;
        public Student(int id) {
            this.id=id;
        }
        public Student(int id,String name) {
            this(id);//调用一个参数的构造方法
            this.name=name;
        }
        public Student(int id,String name,int age) {
            this(id,name);//调用2个参数的构造方法
            this.age=age;
        }
        public int getId() {
            return this.id;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        public void setAge(int age) {
            this.age = age;
        }
        public void setId(int id) {
            this.id = id;
        }
        public void say() {
            System.out.println("hello");
        }
        public String toString() {//重写toString方法
            return "id="+this.id+" name="+this.name+" age="+this.age;
        }
    }

    输出:

    null
    null
    null
    3
    id=1 name=null age=0
    id=2 name=守林鸟 age=0
    id=3 name=霸王别鸡 age=21
    id=1 name=null age=0
    id=2 name=守林鸟 age=0
    id=3 name=霸王别鸡 age=21
    hello

    推测:创建对象的引用数组stu,一开始引用都是null,直到new之后堆中才开辟内存空间,分别创建3个对象,再通过stu引用,对于字符串,初始值是null,基本类型初始值则是0,直接输出对象则默认调用toString()方法,这个方法默认返回该对象实现类的类名 + @ +hashCode值。一般都被重写,江湖上的不成文规定是返回属性+值

  • 相关阅读:
    Python class static methods
    学习MySQL出现问题Not allowed to return a result set from a t
    MySQL创样例表(MySQL必知必会B.2)
    无重复字符的最长字串(C++,python实现)
    softmax详解
    为什么要使用logistic函数
    两个栈实现队列的插入和删除(C++实现)
    用数组实现队列(C++)
    C++ memset函数
    两数之和(C++实现)
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11617252.html
Copyright © 2020-2023  润新知