@liayun
2016-06-24T15:11:35.000000Z
字数 2908
阅读 1465
java基础加强
静态导入用于简化程序对类静态属性和方法的调用。
import static 包名.类名.静态属性|静态方法|*
例,求两个数的最大值和相减结果的绝对值。
解:
import static java.lang.Math.*;
public class StaticImport {
public static void main(String[] args) {
System.out.println(max(3, 6));
System.out.println(abs(3 - 6));
}
}
注意:若将javac无意改为1.4了,结果静态导入等jdk1.5的新特性都将报告错误。
当一个方法接受的参数个数不固定时,如add(2, 3)
和add(2, 3, 5)
,就可以使用可变参数,否则就要使用函数重载,这就引出了一个面试题:overload(重载) vs override(重写)的区别。
使用可变参数如下:
public class VariableParameter {
public static void main(String[] args) {
System.out.println(add(2, 3));
System.out.println(add(2, 3, 5));
}
public static int add(int x, int... args) {
int sum = x;
for(int arg : args) {
sum += arg;
}
return sum;
}
}
可变参数的特点:
...
位于变量类型和变量名之间,前后有无空格都可以。引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!因此JDK5中定义了一种新的语法——增强for循环,以简化此类操作。
语法
for (type 变量名:集合变量名) { … }
可查看java语言规范,了解增强for循环的语法。
注意事项:
()
中定义!使用增强for需要注意的问题:增强for只适合取数据,要修改数组或集合中的数据,要使用传统方式。
观察以下两段程序的输出结果:
public void test() {
int arr[] = {1, 2, 3};
for(int i : arr) {
i = 10;
}
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
输出:
1
2
3
若要修改数组或集合中的数据,要使用传统方式:
public void test() {
int arr[] = {1, 2, 3};
for(int i=0; i<arr.length; i++) {
arr[i] = 10;
}
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
public void test() {
List list = new ArrayList();
list.add("1");
for(Object obj : list) {
obj = "10";
}
System.out.println(list.get(0));
}
输出:
1
举例
public static int add(int x,int ...args) {
int sum = x;
for(int arg:args) {
sum += arg;
}
return sum;
}
增强for循环取map的第二种方式,此方式也是最常用的。
public void test() {
Map map = new HashMap();
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");
map.put("4", "ddd");
// 增强for取map的第2种方式
for(Object obj : map.entrySet()) {
Map.Entry entry = (Entry) obj;
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println(key + "=" + value);
}
}
由打印结果可知,存进去的顺序与取出来的顺序不同,这是因为HashMap
底层是哈希表数据结构,所以此时需要使用的类是LinkedHashMap
——LinkedHashMap
底层保存数据是采用的线性链表,其保存数据时是有顺序的,LinkedHashMap
非常重要。
public void test() {
Map map = new LinkedHashMap(); // LinkedHashMap底层保存数据是采用的线性链表,其保存数据时是有顺序的,非常重要
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");
map.put("4", "ddd");
// 增强for取map的第2种方式
for(Object obj : map.entrySet()) {
Map.Entry entry = (Entry) obj;
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println(key + "=" + value);
}
}
自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类。
Integer iObj = 3;
自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型。
System.out.println(iObj /*iObj.intValue()*/ + 12); // iObj进行了自动拆箱,变成了int类型,再和12进行加法运算
基本数据类型的对象缓存
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2); // 这块相等,<=127都是真的
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); // 这块不相等,因为num3和num4指向了不同Integer对象
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6); // true,这块的道理同上
以上就是享元设计模式(flyweight),即如果很多很小的对象,它们有很多属性相同,可把它们变成一个对象,那些不同的属性变成方法的参数,称之为外部状态,那些相同的属性称之为内部状态。