数组
在我们的main方法里,public static void main(String[] args)里,有一个参数,String[] args,我们知道String是一个字符串类,那这个中括号[]表示什么?这表示一个数组,这个数组是一个String类型的数组,我们从下面的例子来看
public class OfferServer{
public static void main(String[] args){
if(args!=null){
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
}
}
在这个例子中,我们在执行java OfferServer命令时再后面加上了两个参数,Helloworld和nihao,然后再代码中把它打印出来了。
数组,顾名思义,就是一串数的组合,当然在Java中,我们可以是其他对象的组合,不仅仅限于数值本身了。
数组的声明很简单
数组的类型[] 标识符;
比如我们声明一个字符串数组 String[] strs;
一个int类型的数组 int[] scores;
一个double类型的数组 double[] weights;
一个SportStar类型的数组SportStar[] stars;
创建数组,我们也使用new关键字
new 数组的类型[数组的长度];
比如:String[] strs = new String[5];创建一个长度为5的String数组
int[] scores = new int[6]; 创建一个长度为6的int类型数组
double[] weights = new double[3];
SportStar[] stars = new SportStar[5];
我们创建了数组后,系统默认对其做了初始化,按照各种基本类型的默认初始化值,以及引用类型的默认值null进行了初始化。
public class OfferServer{
public static void main(String[] args){
int[] i = new int[6];
System.out.println(i[0]);
SportStar[] stars = new SportStar[5];
System.out.println(stars[0]);
}
}
我们还可以使用以下方式来创建数组
数组的类型[] 标识符 = {类型1,类型2,...类型N};
例如: String[] strs = {“abc”,“hello”,“good”,“pass”};
int[] score = {59,73,66,85,101};
double[] weight = {45.0,53.6,75.3}
SportStar[] stars = {new SportStar(),new SportStar("张继科"),null};
这样定义数组,在创建数组数确定了数组的长度为后面的元素个数,也设置了数组中每个元素的值
数组的引用
标识符[下标]的方式访问,下标即元素的位置,比如我们要访问第二个元素
String[] strs = {"abc","hello","good","pass"};
strs[1] = "helloworld";
System.out.println(strs[1]);
注意:数组的下标是从0开始的,也就是说我们要访问它的第一个元素,是使用strs[0]而不是strs[1],我们这个strs数组长度为4,如果要访问它的最后一位,是用strs[3]来访问,如果使用strs[4]来访问,会由于超过数组长度而抛出数组越界异常ArrayIndexOutOfBoundsException。
另外,数组的长度可以使用length来得知,比如这个strs.length为4,我们看下面的例子
public class OfferServer{
public static void main(String[] args){
String[] strs = {"abc","hello","good","pass"};
System.out.println(strs.length);
for(int i=0;i<strs.length;i++){
System.out.println(strs[i]);
}
}
}
在例子中,我们使用了数组长度作为限制条件,通过一个for循环把数组中的元素全部输出了。
foreach循环
在之前介绍循环的时,我们知道有for循环、while循环和do...while循环,在jdk1.5之后,JAVA引入了一个增强型for循环,我们称之为foreach循环,其语法为:
for(声明语句:表达式){
循环执行的语句
}
例如上面的例子中,我们依次输出了数组中的所有元素,通过foreach我们可以这样写
public class OfferServer{
public static void main(String[] args){
String[] strs = {"abc","hello","good","pass"};
System.out.println(strs.length);
for(String str : strs){
System.out.println(str);
}
}
}
我们声明了一个标识符str,用于从数组strs获取元素输出。在foreach中,表达式可以是数组,也可以是返回数组的方法,但声明语句必须是和表达式相同的数据类型.
public class OfferServer{
public String[] getArray(){
String[] strs = {"abc","hello","good","pass"};
return strs;
}
public static void main(String[] args){
OfferServer server = new OfferServer();
for(String str : server .getArray()){
System.out.println(str);
}
}
}
除了数组,我们还可以对集合使用foreach循环,在后面我们讲到集合以后会进行举例.
多维数组
多维数组,可以理解为数组的数组。比如二维数组,就一个每个元素都是一维数组的一维数组。听起来有些绕,比如我们定义一个二位数组,String[][] stars = new String[2][3],那么它实际上可以看成一个两行三列的数组,我们的前下标表示行数,后下标表示列数,比如
行数\列数 | 1 | 2 | 3 |
1 | 姚明 stars[0][0] | 林丹 stars[0][1] | 马龙 stars[0][2] |
2 | 霍建华 star[1][0] | 黄子华 stars[1][1] | 刘德华 stars[1][2] |
我们通过不同维度的下标组合来访问数组中的元素。如上面的stars[1][2]。
在创建二维数组时,我们甚至可以创建不规则的二维数组,比如
String[][] stars = new String[2][];
stars[0] = new String[3];
stars[1] = new String[5];
这样我们就创建了一个不规则的二维数组。
考虑一下,怎么用 * 输出一个正方形?
public class OfferServer{
public static void main(String[] args){
String[][] stars = new String[5][5];
for(int i=0;i<stars.length;i++){
if(i==0||i==(stars.length-1)){
for(int j=0;j<stars[i].length;j++){
stars[i][j] = "*";
}
}else{
for(int j=0;j<stars[i].length;j++){
if(j==0||j==(stars[i].length-1)){
stars[i][j] = "*";
}else{
stars[i][j] = " ";
}
}
}
}
for(int i=0;i<stars.length;i++){
for(int j=0;j<stars[i].length;j++){
System.out.print(stars[i][j]);
}
System.out.println();
}
}
}
首先我肯定不是要你直接用System.out.print("*****")这样的方式来输出,其次,由于行间距和列间距的问题,我们输出的这个看起来是个长方形了,不过从形状上我们还是可以知道这是一个5X5的正方形。那么怎么输出一个菱形呢?
简单的人机交互
截止到目前为止,我们和系统一直是没有互动的,我们写好程序,让系统来执行,它就输出一些我们期望的结果。那么怎么和系统进行简单的人机交互呢?我们需要使用到一个java类,Scanner类。创建Scanner对象的基本语法是:
Scanner scan = new Scanner(System.in);
Scanner类的实例提供了一些获取键盘输入的方法
next() 用于获取从键盘输入的字符串
hasNext() 用于判断是否还有输入的数据
nextLine() 用于获取从键盘输入的字符串
hasNextLine() 用于判断是否还有输入的数据
nextInt() 用于获取从键盘输入的整数
hasNextInt() 用于判断是否还有要输入的整数
nextDouble() 用于获取从键盘输入的double型数
hasNextDouble() 用于判断是否还有要输入的double型数
通常,我们只需要获取字符串、int和double就够用了。
import java.util.Scanner;
public class OfferServer{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String s = scan.next();
System.out.println(s);
}
}
}
执行上面的程序我们发现,如果你输入空格,系统不会有什么反映,如果你输入带空格的句子,系统会直接给你分成好几段。在上面的例子中我们希望能一直从键盘获取输入,所以我们用了一个while循环,只要能获取到下一个输入,就不会退出,这导致我们无法正常的从程序上结束它,所以我们可以事先约定一个表示结束的字符串,比如“over”,下面我们用nextLine()来展示
import java.util.Scanner;
public class OfferServer{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String closeword = "over";
while(scan.hasNextLine()){
String s = scan.nextLine();
System.out.println(s);
if("over".equals(s)) break;
}
}
}
使用nextLine()我们发现,我们可以在里面输入带空格句子,除非我们按下回车,不然系统会一直等着我们的输入。请注意我们在判断输入是不是字符串"over"时,我们使用了 "over".equals(s),而不是 s=="over",这是因为,当比较双方是基本数据类型时,==的比较对值的比较,而比较双方是引用变量时,==比较的是两个引用变量的地址。而equals的比较是比较两个引用变量所对应对象的内容是否相等。
那为什么我们写成"over".equals(s)而不写成 s.equals("over"),这是因为s是一个不确定的值,我们并不知道它会是什么内容,它有可能是null,而我们之前说过,对于null的调用很可能引来NullPointerException,但是"over"是一个很明确的值,它绝对不是null,所以写成"over".equals(s)绝对不会出现空指针异常。
请注意,==和equals的区别,以及 "".equals(s)和s.equals("")的区别这两个问题都是面试中经常会出现的问题!!
import java.util.Scanner;
public class OfferServer{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int time = 0;
int sum = 0;
while(scan.hasNextInt()){
int i = scan.nextInt();
time++;
sum += i;
}
System.out.println("你输入了"+time+"个数,它们的和是"+sum);
}
}
上面的例子中,我们发现如果我们输入非数字内容,它就会自动结束跳出循环,所以我们不必要像输入字符串一样定义一个结束符号。nextDouble和nextInt用法类似,这里就不再举例介绍了。