数组
一.数据存储:
数组:数组是同一种数据类型的集合容器。
- 为了能更复杂的存储数据,我们需要用到数组!
- 在内存中是一连串的内存空间表示,它是有序的。
数组有一维数组和多维数组:
一维数组:
int[] arr = new int[10]; 创建一个长度为10的一维数组
多维数组:
int[][] arr = new int[10][10]; 创建一个一层长度为10,二层各长度为10的二维数组
二. 数组的定义
变量的三要素:变量的数据类型 变量名 变量值
数组有四要素。
- 数组元素的数据类型
相同数据类型的数据。
数值类型:byte short int long float double
非数值类型:char boolean String - 数组名(标识符)
和变量名的规范一致。 - 数组的元素
数组中存储的一个个变量。 - 数组的下标(索引)
数组是有序的,每一个元素都有一个固定的数组下标(序号)。 下标也是从0开始的。
编程中的序号:大多数场景下,都是从0开始计数
三、数组的基本使用
1.先声明->分配空间->赋值
double[] scores;
scores = new double[5];
scores[0] = 12;
2.声明并分配空间
String[] names = new String[3];
names[0] = "xxx";
3.(前期比较常用)声明并直接赋值
char[] alpha = {‘a','b','c'};
boolean[] flags = new boolean[]{trun,false,false};
数组的注意事项
1.数组只能存储相同数据类型的数据。
char默认空格 String默认null
2.数组的长度一经制定无法改变。
3.数组的元素有默认值。
不同类型的数组元素有不同的默认值:
byte short int long默认值:0
float double 默认值:0.0
boolean 默认值:false
char 默认值:\u0000 空格
String(引用数据类型)默认值:null 便是空 表示没有引用的值。
四、数组的常用操作
数组的遍历:将某个内容的所有值元素全部取出来的过程。
遍历方式1:将循环变量i作为数组的下标志,可以通过此致来获取对应的元素。
// 使用普通循环来遍历 一般是用for
for(int i = 0; i < 数组的长度; i++){
数组名[i]
}
遍历方式2:增强for循环(foreach)
一维数组遍历
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
二维数组遍历
for (int i = 0; i < arr.length; i++) {
for (int j = 0; i < arr[i].length; j++) {
System.out.print(arr[i][j]);
}
一维数组增强for遍历
for(double score : scores){
System.out.print(score);
}
二维数组增强for遍历:
for(double score : scores){
for(double score1 : score)
System.out.print(score1);
}
五.引用数据类型初识
-
Java的程序在运行的时候,数据是按照不同的场景进行不同区域的存储的。
-
Java栈(stack)一般用于存放基本数据类型值,成员变量,还有函数的存放。
-
Java堆(heap)一般用于存放引用数据类型,对象一般是在这里创建内存。
栈内存的特点:栈内存存储的都是局部变量,变量一旦出了自己的作用域,那么马上会从内存中消失,释放内存空间。
局部变量:如果声明一个变量是在一个方法(函数)的内部声明的,那么该变量就是一个局部变量。
成员变量:就是定义在方法之外,类之内的。
堆内存的特点:堆内存存储的都是对象数据,对象一旦被使用完,并不会马上从内存中消失,而是等待垃圾回收器不定时的把垃圾回收,这时候该对象才会消失,释放内存。
-
对象如果没有变量引用了,那么该对象就是一个垃圾对象。
-
凡事以new关键字创建的对象,jvm都会在堆内存中开辟一个新的空间,创建一个新的对象。
数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值、角标、下标),索引值范围是从0开始。
Arrays包工具类的使用
copyOf(数组,长度) 复制一个数组
Arrays.sort(变量名);[排序]
String info = Arrays.toString(arr);(输出数组)
Arrary.binarySearch();二分查找法
public static int halfSearch(int[] arr, int target){ //二分查找法原理
// 定义三个变量分别为最大、中间、最小的查找范围
int max = arr.length-1;
int min = 0;
int mid = (max + min)/2; // 变量为索引值
// 查找循环
while(true){
if(target < arr[mid]){
max = mid-1;
}else if(target > arr[mid]){
min = mid+1;
}else{
return mid; // 找到了元素
}
if(max < min){
return -1;
}
mid = (max + min)/2;
}
}
冒泡排序:冒泡排序就是定义一个条件,使相邻的两元素挨个比较一次,符合条件交换位置。
创建数组……
for(int j = 0 ; j < arr.length-1 ; j++){ //控制轮数
for(int i = 0 ; i<arr.length-1-j ; i++){ // 找出一个最大值
//相邻的元素比较
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
找出最大值
int max = arr[0];
for(int i = 0 ; i < arr.length ; i++){ // 遍历数组
if(arr[i] > max) // 最大值条件
max = arr[i]; // 找出数组中比最大值大的数,并赋值给max
}