这是我个人写的第一个博客吧。分享下我的学习java路程。
先介绍下java数组的概念:
数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
1.数组可以装一组数,必须类型相同
2.数组按线性顺序,一个跟一个
3.数组也是一种数据类型
4.数组new之后,数组中的每个元素都有一个默认值
整数:0 浮点数:0.0 boolean:false
1)数组的定义:
int[] arr = new int[4]; //每个数都是0
2)数组的初始化
int[] arr; //声明数组
arr = new int[4]; //初始化
int[] arr = {1,5,8,3}; //只能声明同时初始化
int[] arr = new int[]{1,5,8,3};
int[] arr;
arr = {1,5,8,3}; //错误
3)数组的访问:通过下标
下标从0开始
int[] arr = new int[4];
System.out.println(arr.length);//数组的长度4
arr[0] = 55;//给arr中的第1个数赋值为55
arr[4] = 99; //错误,数组越界,最大到3
System.out.println(arr[2]);//输出第3个数
4)数组的遍历
//遍历数组
int[] arr = {1,8,5,3};
for(int i=0;i<arr.length;i++){ //正序
System.out.println(arr[i]);
}
for(int i=arr.length-1;i>=0;i--){ //倒序
System.out.println(arr[i]);
}
数组的内存分配机:
//让books数组变晕、 strArr数组变量指向names所引用的数组books e names;
books = names;
strArr = names;
System.out.println( ”-----------…”);
”
System.out.println( ”books数组的长度3 + books. length);
System.out.println( ”strArr数组的*度: " + strArr.length);
//改变books数组变量所引用的数组的第2个元素值。
books[ll = ”唐僧” ;
System. out. println ( ” names数缝的第2个元素是z ” +books(l]);
上面程序中粗体字代码将让books 数组变量、strArr 数组变量都指向nam臼数组变量所引用
的数组,这样做的结果就是books、strArr、nam由这3 个变量引用同一个数组对象。当访问books 数组、strArr 数组的长度时, 将看到输出3。这很容易造成一个假想: books数组的长度从4 变成了3. 实际上, 数组对象本身的长度并没有发生改变, 变的是books 数组变量. books 数组变量原本指向堆内存下面的数组, 当执行了booksnam白,语句之后, books 数组将改为指向堆内存中间的数组,而原来books 变量所引用的数组的长度依然是4.当然,从图中还可以看出, 原来books 变盘所引用的数组长度然是4, 但不再有任何引用变量引用该数组,因此它将会变成垃圾, 等着垃圾回收机制来回收。此时, 程序使用books 、name部和strArr 这3 个变量时,将会访问同一个数组对象,因此把books 数组的第2 个元素赋值为“唐僧” 时, nam臼数组的第2 个元素的值也会随之改变。
PS:使用Java数组之前必须先 初始化数组,也就是为数组元素分配内存空间,并指定初始值。实际上,如果真正掌握了Java数 组在内存中分配机制,那么完全可以换一个方式来初始化数组,或者说,数组无需经过初始化。
始终记住:Java的数组变量是引用类型的变量,它并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中即可使用该数组变量。
下面是我自己根据一些资料来写的一个猜字母小游戏。
import java.util.Scanner;
public class Guessing {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int level;
do {
System.out.println("请输入您选择的游戏等级:5、7、9");
level =scan.nextInt();
}while(level!=5 && level !=7 && level !=9);
char [] chs = generate();//获取随机数组
System.out.println(chs);
int count = 0;
while (true) {
System.out.println("请猜题");
String str = scan.next().toUpperCase();//不区分大小写,总动转换大小写字母
if(str.equals("exit")) {//如果用户刚开始游戏就想退出的话,输入exit即可退出
System.out.println("下次再来玩吧!");
break;
}
char [] input = str.toCharArray();//讲用户输入的字符串转换成字符数组
int [] result =check(chs,input);
if(result[0]== chs.length) {//猜对了
int score =chs.length*100-10*count;
System.out.println("恭喜你,猜对了,得分为"+score);
break;
}else {
count++;
System.out.println("猜对的字符个数"+result[1]+"猜对的位置个数"+result[0]);
}
}
}
//随机生成字符组;
public static char [] generate(){//这里呢用了一种间接方法,利用创建随机数字来对应26字母,char数组的下标
char [] chs =new char [5];//随机字符数组;
char [] letters = {'A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
boolean[] flags = new boolean[letters.length];//开关数组,默认为false
for(int i =0;i<chs.length;i++) {
int index;//随机下标
do {
index = (int)(Math.random()*26);
}while (flags[index]==true);
chs [i] = letters[index];
flags[index] = true;//修改下标,为true
}
return chs;
}
//对比:随机数组与用户输入数组作对比
public static int[] check(char[] chs,char[] input) {
int[] result = new int[2];//对比结果result
for(int i =0;i<chs.length;i++) {//遍历随机数组
for(int j = 0;j<input.length;j++) {//遍历用户输入数组
if(chs[i] == input [j]) {//字符对
result [1]++;//字符对个数+1
if(i == j) {//位置对
result[0]++;//位置对个数+1
}
break;//与input匹配后,不再和input剩下字符比较
}
}
}
return result;
}
}