数组的基本用法
基本用法
动态开辟:数组类型 [ ] 数组名称 = new 数据类型 [ ] {初始化数据}
含义:定义数组的同时进行初始化。
eg:int [ ] array = new int [ ] {1,2,3,4,5};
静态开辟:数据类型 [ ] 数组名称 = {初始化数据};
注意:静态初始化时,数组元素个数和初始化数据的格式是一致的。
eg:int [ ] array = {1,2,3,4,5};
其他:
eg:int [ ] arr = new int [10];
含义:定义数组但是未初始化,默认数组里的值为0.
使用方法
获取数组长度:array.length(数组的一个属性)
System.out.println(array[0]); //打印下标为0的数组元素
打印数组的三种方式
1.使用for遍历
for(i = 0;i < array.length;i++){
System.out.println(array[i]);
};
2.使用foreach遍历(foreach中不能使用下标)
for(int x : array){ //x是数组中的元素,array是要打印的数组名
System.out.println(x);
}
3.将数组以字符串形式打印
import java . util . Arrays
System.out.println(Array.toString(array));
引用类型
引用与c语言中的指针类似,先看下面一个代码:
public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
输出结果为a[0] = 10
arr[0] = 10
创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址,在上面代码中数组名 arr 是一个 "引用" . 当传参的时候, 是按照引用传参。
System.out.println(array[0]); //输出的是数组的地址,实际上是地址的哈希值(地址是唯一的,哈希码也是唯一的)
初识JVM
程序计数器 | 虚拟机栈 | 本地方法栈 | 堆 | 方法区 |
---|
1.程序计数器:保存下一条执行的指令的地址,非常小。
2.虚拟机栈:就是常说的栈,用来存储局部变量表;
3.本地方法栈:用来调用native方法,保存native方法的局部变量。native方法:是有C/C++实现的方法,一般体现在源码中。
4.堆:JVM所管理的最大内存区域,一般用来存放对象,使用new创建的对象都是在堆上保存的。
5.方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,方法编译出的字节码就是保存在这个区域(class对象)
6.运行时常量池:存放字符串常量,JDK1.7以前常量池存放在方法区,JDK1.7以后就在堆区。上图就是JDK1.7,常量池存放在方法区。
在上面的图中, 程序计数器, 虚拟机栈, 本地方法栈被很多个 名叫 Thread(线程) 的方框圈起来了,并且存在很多份. 而 堆, 方法区, 运行时常量池, 只有一份.
二维数组
本质上是一维数组。
二维数组的几种定义方法:
int [][] array = {{1,2,3} , {4,5,6}};
int [][] array2 = new int [][]{ {1,2,3} , {4,5,6} };
int [][] array3 = new int [2][3] ; 定义了一个二维数组,但未初始化,默认为全0。
不规则数组
1. int [][] array4 = new int[2][];{
for(i=0;i<array.length;i++){
for(j=0;j<array[i].length;j++)} //注意遍历列的范围
}
2.完整打印该不规则数组
import java.util.Arrays
int[][] array5 = {{1,2},{4,5,6}};{
array[0] = new int[3];
array[1] = new int[5];
System.out.println(Arrays.toString(array))
}
操作数组的常用类:
import java.util.+工具类
eg :import java.util.Arrays Arrays为java中操作数组的工具类
拷贝
4种拷贝方式: 对于数组当中如果是简单类型就是深拷贝; 数组当中如果是引用类型用以下类型进行拷贝就是浅拷贝; 对引用类型进行深拷贝时,代码的写法要改变
1.for
2.arraycopy
(Object src,int srcPos,Object dest,int destPos,Int length)
src代表源数组
srcPos:从源数组的pos位置开始拷贝
dest:目的地数组
desPos:目的地数组的位置
length:拷贝的长度
3.copyof
copyof(int[] original(源数组),int newLength(拷贝长度))
Arrars.copyOf:底层调用的是System.Arrsys.copyOf
4.array.clone(数组名.clone)
数组名为要拷贝的数组。clone是Object的方法,返回一个副本
学习array中的方法
Arrays.toString //以字符串形式打印数组
Array.copyOf //拷贝
Array.binarySearch //二分查找
Array.copyOfRange(array,from,to) //拷贝部分数组
Arrays.equal //判断数组是否相同
Arrays.fill(array,2,6,9) //把数组的内容 [2,6) 填充为9
Arrays.sort //排序
几种代码
可变参数编程
public class TestDemo1{
public static void main(String[] args){
System.out.println(Sum(1,2,3,4,5));
System.out.println(Sum(1,2,3));
}
public static int Sum(int... array){ //注意:三个点
int ret = 0;
for(int x:array){
ret += x;
}return ret;
}
}
匿名数组
public class TestDemo1{
public static void main(String[] args){
System.out.println(Sum(new int[]{1,2,3,4,5,6}));//这里创建了一个匿名数组
}
public static int Sum(int... array){
int ret = 0;
for(int x:array){
ret += x;
}return ret;
}
}
1、匿名数组没有名字
2、匿名数组与普通的数组创建完数组后不会存储在任何一个变量上。
3、使用匿名数组只是创建、初始化、应用,因为没有名字因此没法重用它。