目录
前言
Hi~ 你好!
欢迎点击我的博客 : )
这是我的学习总结,希望也能帮助到你
我的博客地址:hi~,我在这里~,欢迎关注哦,
三连不迷路,优质内容持续更新!
一.数组的基本概念
1.什么是数组
数组就是相同类型元素的一个集合
在内存中是一段连续的空间
2.数组的创建和初始化
2.1 数组的创建
元素类型 []数组名 = new 元素类型[数组长度]
例如:
int []arr1 = new int[5]; //创建一个可以容纳5个整数类型的数组
double []arr2 = new double[3];//创建一个可以容纳3个双精度浮点数类型的数组
String []arr3 = new String[4];//创建一个可以容纳4个字符串类型的数组
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
System.out.println(Arrays.toString(arr3));
结果如下:
[0, 0, 0, 0, 0]
[0.0, 0.0, 0.0]
[null, null, null, null]
2.2 数组的初始化
2.2.1 动态初始化
在创建数组时,直接指定数组中元素的个数
int[]array = new int[5];
2.2.2 静态初始化
在创建数组时,直接指定具体的数据内容
int []arr1 = new int[]{1,2,3,4,5};
double []arr2 = new double[]{1.1,1.2,1.3};
String []arr3 = new String[]{"Q","w","E","R"};
注意事项
1.静态初始化没指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度
2.{}中数据类型必须与[]前数据类型一致
3.可以简写,省去后面的new 元素类型[]
4.如果没有对数组进行初始化,数组中元素有其默认值,引用类型默认值为null
数组中元素类型的默认值
类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | /u0000 |
boolean | false |
3.数组的使用
3.1 数组中元素的访问
数组在内存中是一段连续的空间,空间的编号都是从0开始的,
依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素
int []arr1 = new int[]{1,2,3,4,5};
double []arr2 = new double[]{1.1,1.2,1.3};
String []arr3 = new String[]{"Q","w","E","R"};
System.out.println(arr1[0]);
System.out.println(arr2[1]);
System.out.println(arr3[3]);
结果如下:
1
1.2
R
1. 因为数组是一段连续的内存空间,所以支持随机访问,通过下标快速访问数组中的元素
2.下标从 0 开始到N( 不包含 N) , N 为元素个数,不能越界,否则会报出下标越界异
3.2 遍历数组
"遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作
在数组中可以通过 数组对象.length 来获取数组的长度
String []arr3 = new String[]{"Q","w","E","R"};
System.out.println(arr3.length);
结果为:4
for循环遍历:
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i]);
}
Q
w
E
R
for-each遍历
for (String x:arr3) {
System.out.println(x);
}
二. 数组是引用类型
1 初始JVM的内存分布
1.程序计数器 : 保存下一条执行的指令的地址(空间小)
2.虚拟机栈 : 每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他信息,保存的都是与方法执行时相关的信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
3.本地方法栈 :与虚拟机栈类似 . 保存的内容是 本地方法的局 部变量 在有些版本的 JVM 实现中 ( 例如 HotSpot), 本地方法栈和虚拟机栈是一起的4. 堆 : JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存,随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销 毁5.方法区 : 用于 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据 . 方法编译出的的字节码就是保存在这个区域
2. 基本类型变量与引用类型变量的区别
1.基本数据类型创建的变量,叫做基本变量,变量空间直接存放对应的值
2.引用数据类型创建的变量,称为对象的引用,空间中存的是对象所在空间的地址值
引用变量并不直接存储对象本身,可以理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象
null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用, null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操
作 . 一旦尝试读写 , 就会抛出 NullPointerException(空指针异常)
三.数组的应用场景
1.保存数据
String []arr3 = new String[]{"Q","w","E","R"};
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i]);
}
2.作为函数的参数
public static int[] myCopyOf(int[]arr){
int []newArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
newArr[i]=arr[i];
}
return newArr;
}
" 引用 " 本质上只是存了一个地址 .Java 将数组设定成引用类型 , 后续进行数组参数传参 , 其实只是将数组的地址传入到函数形参中 . 这样可以避免对整个数组的拷贝 ( 数组可能比较长 , 那么拷贝开销就会很大 )
3.作为函数的返回值
public static int jumpFloor(int n) { //动态规划
if (n <= 2) {
return n;
}
int[] arr = new int[n + 1];
arr[1] = 1;
arr[2] = 2;
for (int i = 3; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
四.数组练习题
1.数组转字符串
public static void main(String[] args) {
int []arr ={1,2,3,4,5};
System.out.println(Arrays.toString(arr));
}
2,数组的拷贝
public static void main(String[] args) {
int []arr ={1,2,3,4,5};
int []newArr = arr;
newArr[0]=9;
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(newArr));
[9, 2, 3, 4, 5]//引用的是相同的地址
[9, 2, 3, 4, 5]
int[] newArr = Arrays.copyOf(arr, arr.length);
arr[0]=9;
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(newArr));
[9, 2, 3, 4, 5] //拷贝到了newArr,对Arr的操作不影响newArr
[1, 2, 3, 4, 5]
int[] ints = Arrays.copyOfRange(arr, 2, 5);
System.out.println(Arrays.toString(ints));//拷贝某个范围
}
[3, 4, 5]
3,求数组中元素的平均值
给定一个整型数组 , 求平均值
public static void main(String[] args) {
int []arr ={1,2,3,4,5,6,7,8,9,10};
System.out.println(avg(arr));
}
public static double avg(int []arr){
double sum = 0.0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum/arr.length;
}
4.查找数组中指定元素(顺序查找)
给定一个数组 , 再给定一个元素 , 找出该元素在数组中的位置 .
public static void main(String[] args) {
int []arr ={1,2,3,4,5,6,7,8,9,10};
// System.out.println(avg(arr));
System.out.println(findNumberIndex(arr, 10));
}
public static int findNumberIndex(int []arr,int number){
for (int i = 0; i < arr.length; i++) {
if (number==arr[i]){
return i;
}
}
return -1;
}
5.查找数组中指定元素(二分查找)
public static int binarySearch(int arr[], int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (left < right && arr[mid] < target ){
left = mid+1;
}else if (left < right &&arr[mid]> target){
right = mid-1;
}else {
return mid;
}
}
return -1;
}
6. 数组排序(冒泡排序)
给定一个数组 , 让数组升序 ( 降序 ) 排序
public static void main(String[] args) {
int []arr = {4,1,5,3,8,2,9};
//
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 8, 9]
}
public static void bubbleSort(int []arr){
for (int i = 0; i < arr.length-1; i++) {
boolean flag = false;
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]<arr[j+1]){
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag = true;
}
}
if(flag==false){
return;
}
}
}
7.数组逆序
给定一个数组 , 将里面的元素逆序排列
public static void revers(int[] arr) {
int left = 0;
int right = arr.length - 1;
for (int i = 0; i < arr.length; i++) {
if (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
五. 二维数组
二维数组本质上也就是一维数组 , 只不过每个元素又是一个一维数组
public static void main(String[] args) {
int [][]arr = {{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
1 2 3
4 5 6
7 8 9
后记
看到这里,希望能帮到你~
您的点赞 ,收藏 ,关注 是我创作的最大动力!
同时也欢迎在评论区进行交流,共同进步~