Java数组
来源:互联网 发布:驾照金手指软件下载 编辑:程序博客网 时间:2024/06/10 11:51
无论使用哪种类型的数组,数组标识符其实只是一个引用,指向在堆上创建的一个真实对象,这个数组对象用以保存指向其它对象的引用(基本类型保存的是值)。
1、数组的初始化:
下例总结了数组的初始化的几种方式:
public class ArrayOptions { public static void main(String[] args) { BerylliumSphere[] a; // 声明,未初始化 BerylliumSphere[] b = new BerylliumSphere[5];//自动初始化 print("b: " + Arrays.toString(b));//相当于System.out.println() BerylliumSphere[] c = new BerylliumSphere[4]; for(int i = 0; i < c.length; i++) if(c[i] == null) // Can test for null reference c[i] = new BerylliumSphere(); BerylliumSphere[] d = { new BerylliumSphere(), new BerylliumSphere(), new BerylliumSphere() //初始化 }; a = new BerylliumSphere[]{ new BerylliumSphere(), new BerylliumSphere(), //初始化 }; print("a.length = " + a.length); //输出 print("b.length = " + b.length); print("c.length = " + c.length); print("d.length = " + d.length); a = d; print("a.length = " + a.length); int[] e; int[] f = new int[5]; print("f: " + Arrays.toString(f)); int[] g = new int[4]; for(int i = 0; i < g.length; i++) g[i] = i*i; int[] h = { 11, 47, 93 }; //!print("e.length = " + e.length); //e没有初始化,不能使用 print("f.length = " + f.length); print("g.length = " + g.length); print("h.length = " + h.length); e = h; print("e.length = " + e.length); e = new int[]{ 1, 2 }; print("e.length = " + e.length); }} /* Output:b: [null, null, null, null, null]a.length = 2b.length = 5c.length = 4d.length = 3a.length = 3f: [0, 0, 0, 0, 0]f.length = 5g.length = 4h.length = 3e.length = 3e.length = 2*///:~
2、返回一个数组
返回一个数组与返回任何其他对象(实际上是返回使用)没什么区别。返回类型是数组类型即可,例如String[]。
3、多维数组
java中实际上没有多维数组,只有一维数组。多维数组被解释为数组的数组。创建多维数组很方便。对于基本类型的多维数组,可以使用花括号将每个向量分开:
public class MultidimensionalPrimitiveArray { public static void main(String[] args) { int[][] a = { { 1, 2, 3, }, { 4, 5, 6, }, }; System.out.println(Arrays.deepToString(a)); }} /* 输出[[1, 2, 3], [4, 5, 6]]
数组中的构成矩阵的每个向量都可以具有任意的长度(这被称为粗糙数组):
public class RaggedArray { public static void main(String[] args) { Random rand = new Random(47); // 3-D array with varied-length vectors: int[][][] a = new int[rand.nextInt(7)][][]; for(int i = 0; i < a.length; i++) { a[i] = new int[rand.nextInt(5)][]; for(int j = 0; j < a[i].length; j++) a[i][j] = new int[rand.nextInt(5)]; } System.out.println(Arrays.deepToString(a)); }} /* Output:[[], [[0], [0], [0, 0, 0, 0]], [[], [0, 0], [0, 0]], [[0, 0, 0], [0], [0, 0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0], []], [[0], [], [0]]]*///:~
第一个new创建了数组,其中的长度由随机数决定,其他维则没有定义。位于for循环内的第二个new则会决定第二维的长度;直到碰到第三个new,第三维的长度才得以确定。
3、数组与泛型
通常数组与泛型不能很好的结合。你不能实例化具有参数化类型的数组:
Peel<Banana> peels = new Peel<Banana>[10];//不合法的
擦除会移除参数类型的信息,而数组必须知道它们所持有的确切类型,以强制保证类型安全。但是你可以参数化数组本身的类型:
class ClassParameter<T> { public T[] f(T[] arg) { return arg; }}class MethodParameter { public static <T> T[] f(T[] arg) { return arg; } //参数化数组本来的类型}public class ParameterizedArrayType { public static void main(String[] args) { Integer[] ints = { 1, 2, 3, 4, 5 }; Double[] doubles = { 1.1, 2.2, 3.3, 4.4, 5.5 }; Integer[] ints2 = new ClassParameter<Integer>().f(ints); Double[] doubles2 = new ClassParameter<Double>().f(doubles); ints2 = MethodParameter.f(ints); doubles2 = MethodParameter.f(doubles); }}
一般而言,泛型在类或者方法的边界处很有效,但是在类或者方法的内部,擦除会使得泛型变得不适用。例如不能创建泛型数组:
public class ArrayOfGenericType<T> { T[] array; // OK @SuppressWarnings("unchecked") public ArrayOfGenericType(int size) { //! array = new T[size]; // Illegal array = (T[])new Object[size]; // "unchecked" Warning 可以进行类型转化 } // Illegal: //! public <U> U[] makeArray() { return new U[10]; } 不能创建一个泛型数组}
参考《Java编程思想》
0 0
- java数组添加数组
- java数组添加数组
- Java数组-二维数组
- 【Java】数组--二维数组
- java-数组/二维数组
- Java数组、遍历数组
- java数组
- JAVA数组
- JAVA数组
- JAVA数组
- Java数组
- Java数组
- java数组
- java数组
- java数组
- Java--数组
- Java数组
- java 数组
- springMVC实现多文件的上传
- Winodws删除目录失败--查找文件句柄没有关闭
- 为什么到北上广深
- QTcpSocket使用过程中的一些问题记录
- 浅谈Dialog样式Activty
- Java数组
- iOS中关于(null)和<null>的处理
- Java优雅代码--String容错处理 NullPointerException
- sublime安装html头部补全插件安装
- 构造方法
- JQAjax
- c++学习(四)——迭代器的介绍及使用
- Activity 的显式调用与隐式调用
- BZOJ 1231 状压DP