1.数组 Arrya
1.数组的标志[ ],作用是用于存储多个相同类型数据的集合(结构),需要连续开辟内存空间,数组定义时需要明确数组类型和长度
2.想要获取数组中的元素值,可通过脚标(下标)来获取
3.数组下标从0开始,下标的最大值等于数组的长度-1
4.数组是一个引用类型,数组名a代表数组地址,保存的是数组的地址值
5.数组只适合通过下标查询,不适合增删
1.1创建数组的方式
1)方式一:动态初始化:int[] a = new int[5]; 只定义数组长度
2)方式二:静态初始化:int [] b = new int[]{1,2,3,4,5};
或int[] c = {1,2,3,4,5}; 既给了长度又给了元素值
3)数组定义的方式两种:
1.静态创建-知道具体元素值
2.动态创建-知道长度,后续需要动态复制
1.2数组的遍历
从头到尾,依次访问数组每一组位置,获取每一个位置的元素值,
因为数组的遍历知道执行次数,所以可以使用for循环;我们通过数组的下标操作数组,所以for循环变量是数组的下标
开始:开始下标0 结束:结束下标length-1 如何变化:++
for(从下标为0的位置开始 ; 下标的取值 <= 数组的长度-1 ; 下标++){
循环体;}
注意:下标从0开始,最大下标是长度减1,若超出下标,会出现数组下标越界异常
练习1:输出每个月的天数
package cn.tedu.array;
//本类练习数组遍历
//需求:输出一年中每月的天数,例如:1月有31天
public class TestArrayExec {
public static void main(String[] args) {
//1.创建数组存12个月的天数
int[] a = {31,28,31,30,31,30,31,31,30,31,30,31};
//2.输出每个月的天数打印到控制台
//遍历数组,使用for循环--通过数组下标来操作数组中的元素
//从哪开始:0,到哪结束:a.length-1,如何变化:++
for( int i = 0;i<=a.length-1 ;i++) {
System.out.println((i+1)+"月有"+a[i]+"天");
}
}
}
练习2:遍历数组,动态赋值1到10
package cn.tedu.array;
import java.util.Arrays;
//练习向数组中动态赋值
public class TestArray2 {
public static void main(String[] args) {
//2.创建一个数组
int[] a =new int[10];//动态创建,只指定了长度为10
//3.可以通过for循环遍历数组,依次给数组的每个位置上的元素赋值
//可以通过数组的下标来操作数组中的具体元素
//从哪开始:0--a[0]表示数组中的第一个元素
//到哪结束:a.length-1-----a[9]
//如何变化:++
for(int i = 0;i <=a.length-1;i++) {
System.out.println(i);//打印下标;
System.out.println(a[i]);//打印的是具体的元素
a[i] = i + 1;//在每轮循环中给数组的具体元素赋值
}
System.out.println(a);//打印的是一个地址值
System.out.println(Arrays.toString(a));//查看数组中的具体元素值
}
}
练习3:遍历随机数组
public static void m3() {
//1.创建数组--动态
int[] a = new int[10];
//2.遍历数组,给数组中的每个元素赋值
for(int i = 0 ; i <a.length ; i++) {
//100是自定义的数据,表示生成的随机整数的范围是[0,100)
a[i] = new Random().nextInt(100);
//a[i] = new Random().nextInt(100)+1;//取值范围前后都+1-->[1,101)
}
//3.使用数组的工具类查看数组中的元素
System.out.println(Arrays.toString(a));
}
2.数组的工具类
1)Arrays.toString:查看数组
格式:System.out.println(Arrays.toString(数组名));
char类型底层做了处理,可以直接打印数组中具体的元素内容
除了char类型以外的其他类型的数组,想要查看具体的元素
都需要使用数组的工具类Arrays.toString(数组名)方法
注意:Arrays使用时需要导包:java.util.Arrays
2)Arrays.sort:数组排序
格式:Arrays.sort(数组名);
System.out.println(Arrays.toString(数组名));
对于基本类型的数组使用的是快速排序算法,效率高
对于引用类型数组,使用的是合并排序算法
3)Arrays.copyOf:把数组赋值成一个指定长度的新数组
1. 扩容:新数组的长度 大于 原数组, 相当于复制,并增加位置(长度),但新的数组没有多余数据,包含了原来数组的数据后没有数据的地方,自动填充对应数组类型的默认值,
例如:String[]的默认值是null,byte short,int默认值是0,浮点型默认值是0.0,字符默认值是\u0000,打印出来是空格,boolean类型默认值是false
2. 缩容:先创建对应长度的新数组,然后按照参数个数复制原数组中的数据,类似截取。
int[] to2 = Arrays.copyOf(from, 10);//括号内的(需要复制哪个数组,新数组的长度),输出的新数组数据从原数组下标为0的数据到长度-1的数据结束
4)Arrays.copyOfRange截取:
指定截取数组中的元素,左闭右开,含头不含尾[下标1,下标n)
括号内(原数组名,下标1,原数组长度)
截取的是下标1开始到长度减1的数据
3.冒泡排序
package cn.tedu.review;
import java.util.Arrays;
/**本类用于完成冒泡排序*/
public class DoubleSort {
public static void main(String[] args) {
//1.创建一个乱序的数组
int[] a = {27,96,73,25,21};
/**使用嵌套for循环完成排序*/
//2.外循环,控制的是比较的轮数(n个数最多比较n-1轮)
/**循环究竟执行几次,取决于循环变量i可以取到几个值*/
for(int i = 1;i<a.length;i++){
//3.内循环,控制的是每轮比较的次数
/**j代表的是数组的下标,数组下表从0开始
* a.length-i,是因为之前轮中比较出来的最大值不需要参与后面的比较*/
for(int j =0;j<a.length-i;j++){
//4.相邻比较
if(a[j]>a[j+1]){
//5.位置不对就互换位置
int t;
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
System.out.println(Arrays.toString(a));
}
}