数组
1、数组声明
/*
数组的声明
数组是一种类型,使用[]表示。
只要存在一种类型,就会存在对应的数组类型。
int -> int[]
String -> String[]
可以这样声明数组类型:
int[] a;
int a[];
推荐使用第一种方式声明数组,因为第一种方式
将变量类型与变量名进行有效的分离,而第二种
没有。
*/
public class ArrayDec {
public static void main(String[] args) {
//声明一个int类型的变量
int x;
//声明数组类型的变量
int[] a;
//也可以这样来声明数组(不建议)
int a[];
//int[] a1, a2, a3; //a1,a2,a3都是数组
//int a1[], a2, a3; //a1是数组,a2,a3是int类型。
}
}
2、数组初始化
/*
数组的初始化
数组的每个数据称为数组的元素。
数组元素的个数称为数组的长度。
可以使用三种初始化方式
int[] a = {1, 2, 3, 4 ,5};
int[] a2 = new int[] {1, 2, 3, 4, 5};
int[] a3 = new int[5];
三种初始化的区别:
第一种初始化方式,只能在声明的同时,进行赋值。
第二,三种初始化方式,既可以在声明的同时赋值,
也可以在声明之后再赋值。
数组元素的访问
通过数组名 + [下标(索引值)]
数组的索引是从0开始的。
a[0] = 100;
数据具有一个属性:length
length可以获得数组的长度(元素的个数)。
数组越界
访问数组的元素,如果提供的索引值<0,或者
>=数组的长度(length),此时,就会发生
数组越界。
一旦数组越界,在编译时没有错误,但在运行
时会产生异常(ArrayIndexOutOfBoundException)。
*/
public class ArrayInit {
public static void main(String[] args) {
int x = 1;
int[] a = {1, 2, 3, 4 ,5};
int[] a2 = new int[] {1, 2, 3, 4, 5};
int[] a3 = new int[5];
int y;
y = 1;
/*
错误
int[] a;
a = {1, 2, 3, 4, 5};
正确
int[] a2;
a2 = new int[] {1, 2, 3, 4, 5};
int[] a3;
a3 = new int[5];
*/
//System.out.println(a.length);
/*
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
System.out.println(a[3]);
System.out.println(a[4]);
*/
//遍历数组,局限:耦合性
for (int i = 0; i < 5; i++) {
//System.out.println(a[i]);
}
//改进:使用length属性
for (int i = 0; i < a.length; i++) {
//System.out.println(a[i]);
}
//数组越界
//a[-1] = 3;
//a[10] = 3;
}
}
3、变量内存分配情况
/*
变量内存分配情况
局部变量分配在栈内存当中,而对象分配在堆内存当中。
栈内存结构会随着方法的调用而创建,随着方法的结束
而销毁。每个方法都有自己的栈内存结构,彼此之间
不受干扰。
堆内存结构是长期存在的。对象存放在堆内存当中,当
没有任何引用指向一个对象时,该对象就会成为垃圾回收
器回收的目标,垃圾回收器会在下次启动时将其回收。
对于基本数据类型,该值直接存放在变量当中,对于引用类型,
变量没有存放真正的对象(真正的对象存放在堆内存中),
变量存放的是该对象的起始地址。
引用类型变量不存放对象,而存放对象起始地址的原因:
1 栈是一个频繁创建而销毁的结构,意味着栈的空间非常
有限(否则浪费资源,降低性能),而对象占用的空间
较大。
2 栈会随着方法调用结束而销毁,此时栈中所有的变量都将
不复存在,如果对象分配在栈内存当中,我们就不能在方法
调用结束后继续使用该对象。
*/
public class Room {
public static void main(String[] args) {
}
}
4、增强型for循环
/*
增强型for循环
优势:
对于操作数组与集合,增强型for循环具有一定的方便性。
局限性:
1 逆序遍历数组
2 访问数组的部分元素
3 在循环中改变数组元素的值
*/
public class ForEach {
public static void main(String[] args) {
int[] x = {1, 2, 3, 4, 5};
//传统for循环
for (int i = 0; i < x.length; i++) {
//System.out.println(x[i]);
}
//增强for循环
//意思:数组x里面的每一个元素会依次赋值给i一次,
//然后执行一次循环体。
for (int i : x) {
//System.out.println(i);
}
//逆序遍历数组
for (int i = x.length -1; i >= 0; i--) {
//System.out.println(x[i]);
}
//访问数组的部分元素
for (int i = 2; i < x.length - 1; i++) {
}
//在循环中改变数组元素的值
for (int i = 0; i < x.length - 1; i++) {
//x[i] = i + 100;
}
for (int i : x) {
i = 100;
}
//不能通过i改变数组元素的值。
for (int i : x) {
System.out.println(i);
}
}
}
5、多维数组
/*
多维数组
Java中实际上不存在多维数组,所谓的多维数组,在Java中
就是数组的数组。即数组的每一个元素还是数组。
int[] x; => 每一个元素为int类型。
String[] x; => 每一个元素为String类型。
T[] x; => 每一个元素为T类型。
当T是int[]的一维数组时,
=》 (int[])[] => int[][]
n维数组里面每一个元素是n-1维数组类型。(2 <= n <= 255)
二维数组初始化的三种方式,与一维数组相同。
二维数组三种初始化区别与一维数组是相同的。
在Java中,多维数组不要求是矩阵数组,即每个低维数组
的长度不要求相同。
*/
public class MultiArray {
public static void main(String[] args) {
//二维数组的初始化
int[][] x = {{1, 2}, {3, 4}, {5, 6}};
int[][] x2 = new int[][] {
{1, 2}, {3, 4}, {5, 6}
};
int[][] x3 = new int[3][2];
x[1][0] = 3;
//非矩阵数组
int[][] y = {{1}, {2, 3}};
//可以先分配高维,再分配低维
int[][] y2 = new int[2][];
y2[0] = new int[3];
y2[1] = new int[2];
//二维数组的遍历
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x[i].length; j++) {
System.out.println(x[i][j]);
}
}
for (int[] i : x) {
for (int j : i) {
System.out.println(j);
}
}
}
}
6、对数组进行复制
/*
对数组进行复制
System.arraycopy
src 源数组
srcPos 源数组开始复制的位置
dest 目标数组
descPos 目标数组开始复制的位置
length 复制的长度
数组的clone方法
*/
public class Copy {
public static void main(String[] args) {
int[] x = {1, 2, 3, 4, 5};
int[] y = new int[x.length];
System.arraycopy(x, 0, y, 0, x.length);
for (int i : y) {
//System.out.print(i + " ");
}
int[] z = x.clone();
for (int i : z) {
System.out.print(i + " ");
}
}
}
7、Arrays类的使用
/*
Arrays类的使用。
Arrays中声明了很多对数组操作的方法。
Arrays类声明在java.util包中。
*/
import java.util.Arrays;
public class ArraysTest {
public static void main(String[] args) {
int[] x = {5, 4, 3, 2, 1};
//对进组进行排序
//Arrays.sort(x);
for (int i : x) {
//System.out.print(i + " ");
}
//对数组进行排序(并行排序),在对CPU,多核心
//环境下,性能可能会得到提升。
//Arrays.parallelSort(x);
for (int i : x) {
//System.out.print(i + " ");
}
//对数组的指定区间进行排序
//第1个参数为待排序的数组,第2个参数执行开始
//区间(包括),第3个参数指定结束区间(不包括)。
//Arrays.sort(x, 1, 4);
//Arrays.parallelSort(x, 1, 4);
for (int i : x) {
//System.out.print(i + " ");
}
//对指定的关键字进行查找。要求数组
//元素必须是升序排列的,否则返回的结果是不确定的。
//如果找到,会返回数组元素的索引。
//如果未找到,返回负值。(-插入点-1)
//插入点就是我们要查找关键字放在数组当中的索引。
//Arrays.sort(x);
//System.out.println(Arrays.binarySearch(x, 4));
x = new int[] {1, 3, 5, 7, 9};
//System.out.println(Arrays.binarySearch(x, 6));
int[] y = new int[] {1, 3, 5, 7, 9, 11};
//判断两个数组是否相等(原则:长度相应,对应的元素
//也相等),如果相等,返回true,否则返回false。
//System.out.println(Arrays.equals(x, y));
int[] z = new int[5];
//对数组使用指定的值进行填充
//Arrays.fill(z, 100);
//对数组指定的区间,使用指定的值进行填充。
//第1个参数:待填充的数组
//第2个参数:填充的开始点(索引),包含。
//第3个参数:填充的结束点(索引),不包含
//第4个参数:填充的值
Arrays.fill(z, 2, 4, 100);
for (int i : z) {
//System.out.print(i + " ");
}
//对数组进行复制,返回复制后的数组。
//第1个参数:源数组
//第2个参数:复制的长度。如果长度小于
//源数组的长度,则源数组被截断。如果长度
//大于源数组的长度,则多余的元素取默认值。
int[] w = {1, 2, 3, 4, 5};
//int[] wCopy = Arrays.copyOf(w, w.length);
//int[] wCopy = Arrays.copyOf(w, w.length - 2);
int[] wCopy = Arrays.copyOf(w, w.length + 2);
for (int i : wCopy) {
//System.out.print(i + " ");
}
//对数组指定区间进行复制。返回复制的数组。
//参数1:源数组
//参数2:开始点,包含
//参数3:结束点,不包含。该值可以大于源数组的
//长度,此时,多余的元素取默认值。
int[] k = new int[]{1, 2, 3, 4, 5};
//int[] kCopy = Arrays.copyOfRange(k, 1, 4);
int[] kCopy = Arrays.copyOfRange(k, 1, 10);
for (int i : kCopy) {
//System.out.print(i + " ");
}
//将数组转换成String。(将数组的每个元素进行拼接,
//使用,进行分隔。)
String s = Arrays.toString(k);
System.out.println(s);
}
}
8、命令行参数
/*
命令行参数
我们在java运行程序时,可以在后面传递相应的参数,
参数会依次称为args数组的元素。
参数使用空格进行分隔,如果参数本身含有空格,
那么可以使用""进行引用。
如果参数本身还有",可以使用\"进行转义。
*/
public class Args {
public static void main(String[] args) {
//System.out.println(args.length);
for (String s : args) {
//System.out.println(s);
}
//int limit = 100;
//int limit = (int)args[0];
int limit = Integer.parseInt(args[0]);
int sum = 0;
for (int i = 1; i <= limit; i++) {
//sum = sum + i;
sum += i;
}
System.out.println(sum);
}
}

浙公网安备 33010602011771号