目录
一维数组
含义
含义 :一组数据的容器(存放多个数据的容器)
注意:
1.数组是引用数据类型
2.数组中的数据,叫做元素
3.每个元素都是编号,叫做下标/索引
4.索引从0开始
5.数组在内存中开辟的空间是连续的
6.数组一旦初始化后,长度不可改变(意味着数组不可以添加和删除)
数组的声明:数据类型[] 数组名;
静态初始化
静态初始化:由程序员指定数据,系统自动分配空间
静态初始化1:
String[] names = new String[]{"小张1","小张2","小张3","小张4","小张5"};
静态初始化2:先声明,再初始化
String[] names;
names = new String[]{{"小张1","小张2","小张3","小张4","小张5"};
静态初始化3:简化静态初始化1的写法
String[] names = {{"小张1","小张2","小张3","小张4",小张5"};
通过下标设置元素:
names[2] = "牛牛";
通过下标获取元素:
String str = names[2];
获取数组中元素的个数:
int len = names.length;
遍历数组1 -- for循环:
for(int i = 0;i<names.length;i++){
System.out.println(names[i]);
}
遍历数组2 -- foreach/增强for循环
for(String element : names){//依次遍历数组中的元素并赋值给element
System.out.println(element);
}
for循环 vs foreach循环:
遍历时使用到下标,就使用for循环
遍历时没有使用到下标,就使用foreach
需求:声明5个int值的数组,求最大值
注意:int是基本数据类型
int[]是引用数据类型(说白了,只要是数组都是引用数据类型)
int[] is = {45,23,18,81,66};
//假设第0个下标的位置是最大值
int max = is[0];
for(int i = 1;i<is.length;i++){
if(max < is[i]){
max = is[i];
}
}
System.out.println("最大值为:" + max);
//ArrayIndexOutOfBoundsException - 数组下标越界异常
//System.out.println(is[1000]);
动态初始化
数组的初始化:
静态初始化:由程序员指定数据,系统自动分配空间
动态初始化:由程序员指定长度,系统自动分配数据
默认值: 整数类型:0
浮点类型:0.0
字符类型:' '
布尔类型:false
引用类型:null(空)
静态初始化 vs 动态初始化:
一开始就知道数据,就使用静态初始化
一开始只知道长度,就使用动态初始化
动态初始化1:
String[] names = new String[5];//开辟5个连续的空间,用于存放元素
动态初始化2:先声明,再初始化
String[] names;
names = new String[5];//开辟5个连续的空间,用于存放元素
通过下标设置元素:
names[0] = "小张1";
names[1] = "小张2";
names[2] = "小张3";
names[3] = "小张4";
names[4] = "小张5";
数组的排序 -- 冒泡排序
口诀: N个数字来排序
两两相比小靠前
外层循环N-1
内层循环N-1-i
int[] is = {81,56,42,18,23};
//冒泡排序
for(int i = 0;i<is.length-1;i++){
for(int j = 0;j<is.length-1-i;j++){
if(is[j]>is[j+1]){
int temp = is[j];
is[j] = is[j+1];
is[j+1] = temp;
}
}
}
数组的查找
顺序查找
int[] is = {81,56,42,18,23};
int num = 81;//要查找的数据
for(int i = 0;i<is.length;i++){
if(is[i] == num){
System.out.println("找到元素了,下标为:" + i);
break;
}
}
二分法查找
思路:先排序,再将数组一分为二的循环查找
int[] is = {81,56,42,18,23};
//排序 18,23,42,56,81
Arrays.sort(is);
int num = 81;//要查找的数据
int start = 0;
int end = is.length-1;
while(start <= end){
int mid = (start+end)/2;
if(num > is[mid]){
start = mid+1;
}else if(num < is[mid]){
end = mid-1;
}else{
System.out.println("找到元素了,下标为:" + mid);
break;
}
}
数组的复制
数组的复制1
缺点:改动原数组,新数组中的数据会随之改变
//原数组
String[] names = {"小张1","小张2","小张3","小张4"};
//新数组
String[] newNames = names;
//改变原数组的数据
names[2] = "牛牛";
数组的复制2
//原数组
String[] names = {"小张1","小张2","小张3","小张4"};
//新数组
String[] newNames = new String[names.length];
//遍历原数组,将原数组中的元素复制到新数组中
for(int i = 0;i<names.length;i++){
newNames[i] = names[i];
}
//改变原数组的数据
names[2] = "牛牛";
数组的扩容
//原数组
String[] names = {"小张1","小张2","小张3","小张4"};
//计算新长度
int oldCapacity = names.length;
int newCapacity = oldCapacity + (oldCapacity>>1);
//新数组
String[] newNames = new String[newCapacity];
//将原数组中的元素复制到新数组中
for(int i = 0;i<names.length;i++){
newNames[i] = names[i];
}
//将新数组的引用赋值给原数组
names = newNames;
数组的删除
数组的删除1
缺点:数组是存放数据的容器,以这种方式去删除数据,会让容器越来越小
//原数组
String[] names = {"小张1","小张2","小张3","小张4"};
//新数组
String[] newNames = new String[names.length-1];
//将原数组的元素(除了"小张2")复制到新数组中
int index = 0;
for(String element : names){
if(!element.equals("小张2")){
newNames[index++] = element;
}
}
//将新数组的地址赋值给原数组
names = newNames;
数组的删除2
//原数组
String[] names = {"小张1","小张2","小张3","小张4"};
//数据的迁移
for(int i = 1;i<names.length-1;i++){
names[i] = names[i+1];
}
names[names.length-1] = null;
数组作为方法的参数和返回值
需求:设计一个方法,传入int类型的数组,返回最大值和最小值
public static void main(String[] args){
int[] is = {81,56,42,18,23};
int[] maxAndMin = getMaxAndMin(is);
System.out.println("最大值:" + maxAndMin[0]);
System.out.println("最小值:" + maxAndMin[1]);
public static int[] getMaxAndMin(int[] is){
int max = is[0];//假设下标为0的位置的元素为最大值
int min = is[0];//假设下标为0的位置的元素为最小值
for(int i = 1;i<is.length;i++){
if(max < is[i]){
max = is[i];
}
if(min > is[i]){
min = is[i];
}
}
return new int[]{max,min};
}
可变参数
需求:设计一个方法,传入15个int值,求和
public static void main(String[] args){
//传入的数据作为元素压入到数组中
int sum = add(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
System.out.println(sum);
}
//int... is可变参数,本质意义上就是数组
public static int add(int... is){
int sum = 0;
for(int num : is){
sum += num;
}
return sum;
注意:可变参数后面不允许声明其他参数
main方法的参数理解:
javac Test11.java
java Test11 小红 小绿 小黑 -- 将小红、小绿、小黑作为参数传入到main中
public static void main(String[] args){
for(String str : args){
System.out.println(str);
}
}
二维数组
概念:二维数组中包含了多个一维数组
数组的声明:数据类型 [] []数组名;
注意:
1.数组是引用数据类型
2.数组中的数据,叫做元素
3.每个元素都是编号,叫做下标/索引
4.索引从0开始
5.数组在内存中开辟的空间是连续的
6.数组一旦初始化后,长度不可改变(意味着数组不可以添加和删除)
静态初始化
静态初始化:由程序员指定数据,系统自动分配空间
静态初始化1
String[][] names = new String[][]{{"小张1","小张2","小张3"},{"小张4","小张5","小张5,"小张6"}};
静态初始化2:先声明,再初始
String[][] names;
names = new String[][]{{"小张1","小张2","小张3"},{"小张4","小张5","小张5,"小张6"}};;
静态初始化3:
String[][] names = {{"小张1","小张2","小张3"},{"小张4","小张5","小张5,"小张6"}};;
设置指定下标上的元素:
names[1][1] = "牛牛";
获取指定下标上的元素
String str = names[1][1];
获取长度
System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//4
遍历思路:循环获取二维数组中的一维数组,再循环遍历一维数组中的元素
遍历1:for循环
for (int i = 0; i < names.length; i++) {
for (int j = 0; j < names[i].length; j++) {
System.out.println(names[i][j]);
}
}
遍历2:foreach循环
for (String[] ss : names) {
for (String element : ss) {
System.out.println(element);
}
}
动态初始化
动态初始化:由程序员指定长度,系统自动分配数据
数组的初始化默认值:
整数类型:0
浮点类型:0.0
字符类型:' '
布尔类型:false
引用类型:null
动态初始化1
String[][] names = new String[2][3];//创建二维数组,其中有两个一维数组,每个一维数组中有3个元素
动态初始化2:先声明,再初始化
String[][] names;
names = new String[2][3];//创建二维数组,其中有两个一维数组,每个一维数组中有3个元素
设置指定下标上的元素
names[0][0] = "小张1";
names[0][1] = "小张2";
names[0][2] = "小张3";
names[1][0] = "小张4";
names[1][1] = "小张5";
names[1][2] = "小张6";
获取指定下标上的元素
String str = names[1][1];
获取长度
System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//3
遍历思路:循环获取二维数组中的一维数组,再循环遍历一维数组中的元素
遍历:for循环
for (int i = 0; i < names.length; i++) {
for (int j = 0; j < names[i].length; j++) {
System.out.println(names[i][j]);
}
}
遍历:foreach循环
for (String[] ss : names) {
for (String element : ss) {
System.out.println(element);
}
}