1 switch-case 语句
区别于 C 语言中的 switch
只支持整型数据不同,Java 共支持 10 种参数类型:
- byte, short, int, char
- String
- Byte, Short, Integer, Character
default 语句的位置:
public class SwitchDefault {
public static void main(String args[]) {
int i = 1;
switch(i) {
case 1:
System.out.println(1);
default:
System.out.println("default");
case 2:
System.out.println(2); break;
}
}
}
// 运行结果
// 1
// default
// 2
Java7 及其后续版本中,switch 开始支持 String,这一点很关键!
2 foreach
这个跟 C++11 标准中的 foreach
完全一致
public class ForeachExample {
public static void main(String args[]) {
String[] books = {"Java", "C", "C++", "C#", "asp"};
for (String book : books) {
System.out.println(book);
}
}
}
// 运行结果
// Java
// C
// C++
// C#
// asp
上例中的
book
实际上就是每个具体 String 对象的引用,这一点跟 C++ 中的值复制是不一样的。
3 数组
3.1 数组声明
int []a = new int[3];
char b[] = new char[4], c[] = new char[5];
方括号可以写在后面,也可以写在前面。唯一的区别就是,写在前面则后面所有的变量都是数组,而写在后面则只有当前被修饰的变量是数组。
使用数组之前必须要 new
,给数组变量分配存储空间。
Java 语言中生命数组时,不能指定其长度(数组中元素的个数),例如 int a[5];
就是非法的!
本质上数组是引用类型,上例中
a
只是一个引用,不能说从a
这个变量的地址开始有 5 个元素,而是a
指向的地址处连续存放了 5 个元素。
3.2 数组初始化
静态初始化:
int []a = {3, 9, 8};
int []a = new int[] {3, 9, 8}; // 这两种写法等价
MyDate[] dates = {
new MyDate(22, 7, 1964),
new MyDate(1, 1, 2000),
new MyDate(22, 12, 1964),
}
默认初始化:数组一经分配空间,其中的每个元素都会被隐式初始化:数值类型初始化为 0,引用类型为 null
int []a = new int[5]; // 所有的元素都被初始化为 0
String []s = new String[3]; // 所有的元素都被初始化为 null
3.3 数组元素的引用
每一个数组都有一个属性 length
:
int []ages = new int[10];
for (int i = 0; i < ages.length; ++i) {
System.out.println(ages[i]);
}
3.4 数组的复制
System.arraycopy()
提供了数组元素复制的功能:
int[] source = {1, 2, 3, 4, 5, 6};
int[] dest = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
System.arraycopy(source, 0, dest, 0, source.length);
关于数组元素拷贝的效率问题:
System.arraycopy()
效率最高Arrays.copyOf()
效率次之Object.clone()
效率次于前两种for
循环的效率最低