1、数组★
概念:[一组] [类型相同的] [连续的] 存储空间的表示
优点: 缺点:
一个存储单位存多个值 长度固定
空间连续(遍历) 类型固定
下标(索引 )定位 插入和删除
语法:
四步骤:
1、声明:数据类型[] 数组名称; String[] names; String[] nameArray;
2、初始化:数组名称 = new 数据类型[长度];
names = new String[30];
下标取值范围:0~names.length-1
如果下标越界会爆异常:ArrayIndexOutOfBoundsException
3、赋值:数组名称[下标] = 值;
names[0] = "zs";
names[1] = "ls";
....
names[29] ="wz";
4、使用
System.out.println(names[0],names[1]);
其他方式:
1、数据类型[] 数组名称 = {值1,...,值n};
2、数据类型[] 数组名称;
数组名称 = new 数据类型[]{值1,...,值n};
注意:数组初始化后所有的元素都有默认的(无效)初值
String :null
char:(char)0
增强型for
for(数据类型 变量:数组名称){
依次从下标0开始,默认提取所有元素,支持continue和break;
System.out.println(数量);
}
练习
生成20个不重复的1~1000之间的随机数
public static void main(String[] args) {
int[] arr = new int[20];
Random random = new Random();
arr[0] = 1+random.nextInt(1000);
//下标
for (int i = 1; i <arr.length ;) {
arr[i] = 1 + random.nextInt(1000); // 1
//证明是否会唯一
boolean unique = true;
for (int j = 0; j <i ; j++) { //i之前的元素
if (arr[i]==arr[j]){
unique = false;
break; //break重复之后回到1处重新生成新随机数,再进来比较
}
}
if (unique){ //重复不进来,i不变继续赋值
i++;
}
}
for (int i:arr) {
System.out.println(i);
}
}
数组的删除
输入一个值,如果在数组中存在,则删除,否则给出不存在提示
public static void main(String[] args) {
int[] arr = {25,13,11,5,9,3,29,33,8};
System.out.println("删除前");
for (int i:arr) {
System.out.print(i+"\t");
}
Scanner input = new Scanner(System.in);
System.out.print("请输入一个数值");
int num = input.nextInt();
//找到num在arr的下标
int i = 0;
while (i<arr.length){
if (arr[i]==num){
break;
}
i++;
}
if (i==arr.length){
System.out.println(num+"不存在");
}else {
//从找到的i开始 因为最后一个下标为arr.length-1,后面没了再无法覆盖了,for条件不能到此
for (int j = i; j < arr.length-1 ; j++) { //倒数第二个数字用倒数第一个去覆盖
arr[j] = arr[j+1]; //右覆盖左
}
arr[arr.length-1] = 0; //最后一个覆盖掉了前面的,它原本位置还存在,所以要置为0
for (int t:arr) {
System.out.print(t+"\t");
}
}
}
数组的插入
public static void main(String[] args) {
int[] arr = {25,13,11,5,9,3,29,33,8,0};
for (int t:arr) {
System.out.print(t+"\t");
}
Scanner input = new Scanner(System.in);
System.out.print("请输入下标");
int index = input.nextInt();
System.out.println("请输入数值:");
int num = input.nextInt();
if(index<0 || index>=arr.length){
System.err.println("下标越界"+index);
}else if (num<=0){
System.err.println("输入无效数值"+num);
}else{//用左边的去覆盖右边的 -1相当于左
for (int i = arr.length-1; i >index ; i--) {
arr[i] = arr[i-1]; //i = 0 i-1 = -1数组下标越界 所以i不能>=0
}
arr[index] = num;
for (int t:arr) {
System.out.print(t+"\t");
}
}
}
求1万以内的质数
public static void main(String[] args) {
//用小于等于其平方根的质数验证即可
int[] primeNums = new int[10000];
int size = 0,count = 0;
primeNums[size++] = 2;
for (int i = 3; i <=10000 ; i++,count++) { //i+=2性能更高,因为偶数一定不是质数,只有奇数才有可能
boolean is = true ;
for (int j = 0;primeNums[j] <= Math.sqrt(i); j++,count++) {
if (i % primeNums[j] ==0 ){
is = false;
break;
}
}
if (is){
primeNums[size++] = i;
}
}
System.out.println("there are "+size+" prime numbers from 1 to 10000 within "+count+" times circulation");
for (int i = 0; i < size; i++) {
System.out.println(primeNums[i]);
}
}
求第n个不存在的数
public static void main(String[] args) {
int[] arr = {1,4,7};
int nth = 3;
int i = 1,count = 0;
for (; i < Integer.MAX_VALUE;i++) {
boolean no = true;
for (int j : arr) {
if(i==j){
no = false;
break;
}
}
if(no && ++count>=nth){ //no等于true表示不存在,此时才去验证
break; //i=1,存在不执行if i=2,不存在的数,执行++count值为1并不大于等于3
//不break,继续循环i=3,不存在的数,执行++count值为2并不>=3,继续i=4,存在不行继续i=5,不存在的数,执行++count值为2满足
//>=3,break出来,输出i为5,急第三个不存在的数为5
}
}
System.out.println("第"+nth+"个不存在的数值为"+i);
}