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值。一般都被重写,江湖上的不成文规定是返回属性+值。