@liayun
2016-06-24T07:11:35.000000Z
字数 2908
阅读 1670
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),即如果很多很小的对象,它们有很多属性相同,可把它们变成一个对象,那些不同的属性变成方法的参数,称之为外部状态,那些相同的属性称之为内部状态。