Java7增强后的switch语句
switch后的控制表达式只能是byte、short、char、int、枚举类型和java.lang.String类型。
char c = 'A';
switch(c){
case 'A':
System.out.println("Excellent");
break;
case 'B':
System.out.println("Pass");
break;
default:
System.out.println("Fail");
}
Break和Continue操作外层循环
public class HelloWorld{
public static void main(String[] args){
out://这个out用来标记下面的这个for循环
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(j==2){
break out;//结束out下面的那个for循环
}
System.out.println("i="+i+",j="+j);
}
}
}
}
输出:
i=1,j=1
continue有类似用法,不再赘述。
数组
定义数组
//定义数组方式一(推荐使用这种方式):
int[] a;
//定义数组方式二:
int a[];
注意:上面是在定义数组,[]里面一定不要有数字!定义数组不可指定长度。
数组初始化
数组初始化,就是为数组元素分配内存空间,并为每个元素赋初始值。
静态初始化
//先定义一个数组a
int[] a;
//静态初始化
a = new int[]{1,2,3};
上面代码可以简化为:int[] a = new int[]{1,2,3};
上面代码可以进一步简化为:int[] a = {1,2,3};
动态初始化
int[] a = new int[6];//定义和初始化简化在一起完成
数组元素类型 | 数组元素初始值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
char | ‘\u0000’ |
boolean | false |
引用类型(类、接口、数组) | null |
Java的增强for循环过程中,试图修改数组元素的值,其实并修改不了!!如下:
public class HelloWorld{
public static void main(String[] args){
String[] fruits = {"apple","pear","banana"};
//尝试在增强for循环的过程中改变fruits的元素的值
for(String fruit : fruits){
fruit = "fruit";
System.out.print(fruit+" ");
}
System.out.println();
//发现上面并没有改变fruits数组中的元素值,说明for循环过程中,
//fruit指向的仅仅是一个临时变量,并不是对fruits数组元素的引用
for(String fruit : fruits){
System.out.print(fruit+" ");
}
}
}
输出:
fruit fruit fruit
apple pear banana
数组的内存分配
数组是一种引用数据类型,数组引用变量只是一个引用,数组引用变量在栈内存中,而数组元素在堆内存里。
实例一
public class HelloWorld{
public static void main(String[] args){
int[] a = {1,2,3};
int[] b = new int[4];
for(int i=0;i<a.length;i++){
System.out.print("a["+i+"]="+a[i]+" ");
}
System.out.println();
for(int i=0;i<b.length;i++){
System.out.print("b["+i+"]="+b[i]+" ");
}
System.out.println();
b=a;
for(int i=0;i<b.length;i++){
System.out.print("b["+i+"]="+b[i]+" ");
}
}
}
输出:
a[0]=1 a[1]=2 a[2]=3
b[0]=0 b[1]=0 b[2]=0 b[3]=0
b[0]=1 b[1]=2 b[2]=3
上述程序的内存分配及变化情况:
实例二(引用类型的数组)
public class HelloWorld{
public static void main(String[] args){
//定义一个数组
Person[] students = new Person[2];
//定义一个lisi
Person lisi = new Person();
lisi.setName("lisi");
lisi.setSex("mlae");
//定义一个zhangsan
Person zhangsan = new Person();
zhangsan.setName("zhangsan");
zhangsan.setSex("female");
students[0] = lisi;
students[1] = zhangsan;
students[0].info();
lisi.info();
students[1].info();
zhangsan.info();
}
}
class Person{
private String name;
private String sex;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setSex(String sex){
this.sex = sex;
}
public String getSex(){
return this.sex;
}
public void info(){
System.out.println("My name is "+name+". And I am "+sex+".");
}
}
输出:
My name is lisi. And I am mlae.
My name is lisi. And I am mlae.
My name is zhangsan. And I am female.
My name is zhangsan. And I am female.
内存分配如下:
实例三(二维数组的真实内存情况)
二维数组本质是一维数组,数组元素是一维数组。
int[][] a = new int[3][];
a[1] = new int[2];
a[1][1] = 666;
java.util.Arrays
Java8在java.util.Arrays工具类里增强了很多用于并行的函数,这里不会看这些,仅仅关注常用的几个函数。具体看官方文档,通俗易懂。
示例:
import java.util.Arrays;
public class HelloWorld{
public static void main(String[] args){
int[] a = {4,1,3,2,6,5};
//快速排序,并输出结果
Arrays.sort(a,0,a.length);
for(int x : a){
System.out.print(x+" ");
}
System.out.println();
//二分查找6所在数组a的位置(数组下标)
System.out.println(Arrays.binarySearch(a,0,a.length,6));
//复制a[1]到a[3]给数组b,注意下面函数左闭右开
int[] b = Arrays.copyOfRange(a,1,4);
for(int x : b){
System.out.print(x+" ");
}
System.out.println();
int[] c = new int[6];
//数组c全部赋值为6
Arrays.fill(c,0,c.length,6);
for(int x : c){
System.out.print(x+" ");
}
System.out.println();
//判断数组c与数组a是否相等
System.out.println(Arrays.equals(a,c));
//把数组a也全部赋值为6,再和c比较是否相等
Arrays.fill(a,0,a.length,6);
System.out.println(Arrays.equals(a,c));
//把数组a转换为字符串输出
System.out.println(Arrays.toString(a));
}
}
输出:
1 2 3 4 5 6
5
2 3 4
6 6 6 6 6 6
false
true
[6, 6, 6, 6, 6, 6]