数组使用注意事项和细节
1.数组是多个相同类型数据的组合,实现对这些数据的统一管理
2.数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。3.数组创建后,如果没有赋值,有默认值
int 0,short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000,boolean false, String null
4.使用数组的步骤1.声明数组并开辟空间2给数组各个元素赋值3使用数组5.数组的下标是尽0开始的。
6.数组下标必须在指定范围内使用,否则报:下标越界异常,比如
int [arr=new int[5];则有效下标为0-4
7.数组属引用类型,数组型数据是对象(object)
二维数组的静态初始化和动态初始化
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//静态初始化
int[]array={1,2,3,4,5,6,7,8};
//动态初始化
double [] arr =new double[5];
//循环输入
Scanner sc=new Scanner(System.in);
for (int i=0;i<arr.length;i++){
System.out.println("请输入第"+(i+1)+"个元素");
arr[i] = sc.nextDouble();
}
//循环输出
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
for (int j=0;j<array.length;j++){
System.out.println(array[j]);
}
}
}
数组应用案例
1.创建一个char类型的26个元素的数组,分别放置'A'-'Z‘。使用for循环访问
所有元素并打印出来。提示:char类型数据运算‘A'+1 ->'B‘ A'+2 ->'C
public class Test {
public static void main(String[] args) {
char[]c=new char[26];
for (int i=0;i< c.length;i++){
c[i]= (char) ('A'+i);
System.out.println(c[i]);
}
}
}
2.请求出一个数组int[]的最大值{4,-1,9,10,23},并得到对应的下标。
public class Test {
public static void main(String[] args) {
int []array={4,-1,9,10,23};
int max=array[0];
int maxIndex=0;
for (int i=0;i< array.length;i++){
if (max<array[i]){
max=array[i];
maxIndex=i;
}
}
System.out.println("数组中的最大值是:"+max+"对应的索引为:"+maxIndex);
}
}
3.请求出一个数组的和和平均值。(养鸡场)
public class Test {
public static void main(String[] args) {
int []array={10,20,30,40,50,60};
int sum=0;
for (int i=0;i< array.length;i++){
sum+=array[i];
}
int avg=sum/array.length;
System.out.println("数组中所有元素的和是:"+sum+"平均值为:"+avg);
}
}
4.数组反转
方法1
public class Test {
public static void main(String[] args) {
//定义一个数组
int []array={10,20,30,40,50,60};
int temp=0;
int len=array.length;//计算数组的长度
for (int i=0;i< array.length/2;i++){
temp=array[array.length-1-i];
array[array.length-1-i]=array[i];
array[i]=temp;
}
System.out.print("[");
for (int i=0;i< array.length;i++){
if (i==array.length-1){
System.out.print(array[i]);
}else {
System.out.print(array[i] + ",");
}
}
System.out.print("]");
}
}
方法2
public class Test {
public static void main(String[] args) {
//定义一个数组
int []array={10,20,30,40,50,60};
//定义两个索引变量 判断条件是初始索引小于等于结束索引
for (int start=0,end=array.length-1;start<=end;start++,end--){
//变量交换
int temp=array[start];
array[start]=array[end];
array[end]=temp;
}
//遍历数组
System.out.print("[");
for (int i=0;i< array.length;i++){
if (i==array.length-1){
System.out.print(array[i]);
}else {
System.out.print(array[i] + ",");
}
}
System.out.print("]");
}
}
方法3
public class Test {
public static void main(String[] args) {
//定义一个数组
int []arr={10,20,30,40,50,60};
int []arr2=new int[arr.length];
System.out.print("[");
//逆序遍历
for (int i=arr.length-1,j=0;i>=0;i--,j++){
//重新赋值
arr2[j]=arr[i];
if (j==arr2.length-1) {
System.out.print(arr[i] );
}else {
System.out.print(arr[i]+",");
}
}
System.out.print("]");
}
}
数组添加
要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java1)原始数组使用静态分配int[] arr = {10, 20, 30,40,50,60}
2)增加的元素,直接放在数组的最后arr2 = {10,20,30,40,50,60,70}
public class Test {
public static void main(String[] args) {
//数组扩容
int []arr={10,20,30,40,50,60};
//新数组的长度+1
int []arr2=new int[arr.length+1];
//拷贝数组元素
for (int i=0;i<arr.length;i++) {
arr2[i] = arr[i];
}
//新数组中添加最后一个元素
arr2[arr2.length - 1] = 70;
//新数组的地址重新赋值给旧数组
arr = arr2;
//重新遍历扩容后的数组
System.out.print("[");
for (int i=0;i<arr.length;i++) {
if (i==arr[i]){
System.out.print(arr[i]);
}else {
System.out.print(arr[i]+",");
}
}
System.out.println("]");
}
}
3)用户可以通过如下方法来决定是否继续添加,添加成功,是否继续? y/n
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//数组扩容
int []arr={10,20,30,40,50,60};
do {
//新数组的长度+1
int []arr2=new int[arr.length+1];
//拷贝数组元素
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
//新数组中添加最后一个元素
System.out.println("请输入你要添加的元素");
arr2[arr2.length - 1] = sc.nextInt();
//新数组的地址重新赋值给旧数组
arr = arr2;
//重新遍历扩容后的数组
System.out.println("扩容后的数组");
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr[i]) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ",");
}
}
System.out.println("]");
System.out.println("是否确认继续添加y/n");
char c = sc.next().charAt(0);
if (c=='n'){
break;
}
}while (true);
System.out.println("已退出程序");
}
}
练习题
有一个数组{10, 20, 30,40,50,60}可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后那个元素。当只剩下最后一个元素,提示,不能再缩减。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//数组缩减
int []arr={10,20,30,40,50,60};
do {
//新数组的长度-1
int []arr2=new int[arr.length-1];
//拷贝数组元素
for (int i = 0; i < arr.length-1; i++) {
arr2[i] = arr[i];
}
arr = arr2;
//重新遍历缩减后的数组
System.out.println("缩减后的数组");
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr[i]) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ",");
}
}
System.out.println("]");
System.out.println("是否确认继续缩减y/n");
char c = sc.next().charAt(0);
if (c=='n'){
break;
}
if (arr[0]==arr[arr.length-1]){
System.out.println("你的数组中就剩一个元素了,无法继续缩减");
break;
}
}while (true);
System.out.println("已退出程序");
}
}
冒泡排序法案例:BubbleSort
下面我们举一个具体的案例来说明冒泡法。我们将五个无序:24,69,80,57,13使用冒泡排序法将其排成一个从小到大的有序数列。
public class Test {
public static void main(String[] args) {
int temp=0;
int []arr={24,69,80,57,13};
for (int j=0;j<arr.length-1;j++) {
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
System.out.println("第"+(j+1)+"轮排序后的数组");
System.out.print("[");
for (int i=0;i<arr.length;i++) {
if (arr[i]==arr[arr.length-1]){
System.out.print(arr[i]);
}else {
System.out.print(arr[i]+",");
}
}
System.out.println("]");
}
}
}
查找
介绍:
在java中,我们常用的查找有两种:1.顺序查找 2.二分查找
●案例演示:
1.有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:从键盘
中任意输入一个名称,判断数列中是否包含此名称【顺序查找】要求:如果找到了,就提示找到,并给出下标值。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
String []arr={"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个名称:");
String s = sc.nextLine();
int index=-1;
for (int i=0;i<arr.length;i++){
//equals 用于比较字符串数据
if (s.equals(arr[i])){
System.out.println("恭喜你找到"+s+"该数据的下标为:"+i);
index=i;
break;
}
}
if (index==-1){//没有找到
System.out.println("没有找到该数据"+s);
}
}
}
二维数组的使用
快速入门案例:TwoDimensionalArray
请用二维数组输出如下图形
public class Test {
public static void main(String[] args) {
int[][]arr={{0,0,0,0,0,0},{0,0,1,0,0,0,},{0,2,0,3,0,0},{0,0,0,0,0,0}};
//遍历二维数组的每个元素
for (int i=0;i< arr.length;i++){
//遍历二维数组中的每个元素(数组)
//arr[i] 表示二维数组中的每个元素 arr[0]表示二维数组中的第一个元素
// arr[i].length:得到每个一维数组的长度
//第三个一维数组的第四个值arr[2][3]
for (int j=0;j< arr[i].length;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println(" ");
}
}
}
二维数组的使用
使用方式1:动态初始化
1)语法:类型[][]数组名=new类型[大小][大小]比如: int a[][]=new int[2][3]
2)使用演示
public class Test {
public static void main(String[] args) {
int[][]arr=new int[2][3];
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("");
}
}
}
3)二维数组在内存的存在形式
使用方式2:动态初始化
1)先声明:类型数组名;再定义(开辟空间)数组名= new类型[大小][大小]
2)赋值(有默认值,比如int类型的就是0)
3)使用演示
public class Test {
public static void main(String[] args) {
//先声明 再新建
int[][]arr;
arr=new int[2][3];
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("");
}
}
}
·使用方式3:动态初始化-列数不确定
1)看一个需求:动态创建下面二维数组,并输出。
public class Test {
public static void main(String[] args) {
//创建了一个二维数组,一共有三个一维数组 每一个数组的元素不一样
int[][]arr=new int[3][];
//遍历每一个数组
for (int i=0;i< arr.length;i++){
//给每一个数组开空间
//如果没有给一维数组new 那么arr[i]就是null
arr[i]=new int[i+1];
//遍历一维数组并给一维数组的每一个元素赋值
for (int j=0;j<arr[i].length;j++){
arr[i][j]=i+1;
System.out.print(arr[i][j]+" ");
}
System.out.println("");
}
}
}
静态创建输出
public class Test {
public static void main(String[] args) {
int[][]arr={{1},{2,2},{3,3,3}};
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("");
}
}
}
案例:
int arr[][]={{4,6},{1,4,5,7,},{-2}};遍历该二维数组,并得到和
public class Test {
public static void main(String[] args) {
int[][]arr= {{4,6},{1,4,5,7},{-2}};
int sum=0;
for (int i=0;i< arr.length;i++){
for (int j=0;j<arr[i].length;j++){
sum+=arr[i][j];
}
}
System.out.println(sum);
}
}
案例:打印一个十行的杨辉三角
public class Test {
public static void main(String[] args) {
int[][]yangHui= new int[10][];
//遍历杨辉中的每个元素
for (int i=0;i< yangHui.length;i++){
//给每一个一维数组开空间
yangHui[i]=new int[i+1];
//给每一个一维数组赋值
for (int j=0;j<yangHui[i].length;j++){
//每一行的第一个和最后一个元素都是1
if (j==0||j== yangHui[i].length-1){
yangHui[i][j]=1;
}else {//中间的元素 上一行同一列+上一行上一列的元素
yangHui[i][j]= yangHui[i-1][j]+yangHui[i-1][j-1];
}
}
}
//输出杨辉三角
for (int i=0;i<yangHui.length;i++){
for (int j=0;j< yangHui[i].length;j++){
System.out.print(yangHui[i][j]+" ");
}
System.out.println("");
}
}
}
案例.已知有一个升序的数组,要求插入一个元素之后还是升序,比如{10,12,45,90}插入25之后{10,12,25,45,90}
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[]arr={10,12,45,90};
System.out.println("请输入你要插入的数字:");
int num= sc.nextInt();
int index=arr.length;//要插入的位置
for (int i=0;i<arr.length;i++){
//如果num<arr[i],i就是要插入的位置
if (num<arr[i]){
index=i;
break;
}
}
//判断index的值,如果为-1说明没有执行if语句
if (index==-1){
index=arr.length;
}
System.out.println("需要插入的索引位置为:"+index);
//创建一个新数组 长度+1
int[]arr2=new int[arr.length+1];
//j控制旧数组的索引 i控制新数组的索引
for (int i=0,j=0;i<arr2.length;i++){
if (i !=index){//说明可以把arr的元素拷贝arr2
arr2[i]=arr[j];
j++;
}else {
//i这个位置就是要插入的数
arr2[i]=num;
}
}
arr=arr2;
System.out.println("插入后的arr数组");
for (int j=0;j<arr.length;j++){
System.out.print(arr[j]+"\t");
}
}
}
随机生成10个整数(1_100的范围)保存到数组,并倒序打印以及求平均值、求最大(小)值和最大(小)值的下标、并查找里面是否有8
import java.util.Random;
public class Test {
public static void main(String[] args) {
int sum=0;//数组元素之和
int []arr=new int[10];
Random r=new Random();
System.out.println("遍历后的数组");
for (int i=0;i< arr.length;i++) {
arr[i]=r.nextInt(100);
System.out.print(arr[i]+"\t");
}
System.out.println("");
System.out.println("倒叙打印后的数组");
for (int i=arr.length-1;i>=0;i--){
System.out.print(arr[i]+"\t");
sum+=arr[i];
}
System.out.println("");
int max=arr[0];//数组最大值初始化
int maxIndex=0;//数组最大值索引初始化
int min=arr[0];//数组最小值初始化
int minIndex=0;//数组最小值索引初始化
int avg=sum/arr.length;
System.out.println("数组的平均值为:"+avg);
for (int i=0;i<arr.length;i++) {
if (max<arr[i]){
max=arr[i];
maxIndex=i;
}
if (min>arr[i]){
min=arr[i];
minIndex=i;
}
}
System.out.println("数组的最大值为:"+max+"对应的索引为:"+maxIndex);
System.out.println("数组的最小值为:"+min+"对应的索引为:"+minIndex);
int findNumber=8;
int findNumberIndex=-1;
for (int i=0;i< arr.length;i++){
if (arr[i]==findNumber){
findNumberIndex=i;
System.out.println("该数组里有8"+"对应的索引为:"+findNumberIndex);
break;
}
}
if (findNumberIndex==-1)
System.out.println("该数组里没有8");
}
}