sun公司在发布jdk时一直都是从1.0-1.1-1.2-1.3-1.4,为什么1.4之后直接过渡到了5.0了呢?
这是因为jdk5.0中发布了很多的新特性,和之前的jdk有很大的区别了,sun公司觉得用1.5表示不过瘾,便直接命名为5.0.
使用这些特性有助于我们编写更加清晰,精悍,安全的代码。
那么jdk5.0中都有哪些新特性呢?
静态导入.自动装箱拆箱.增强for循环.可变参数.枚举.反射.内省.泛型.元数据等等;
1.静态导入
使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
import static java.util.Arrays.*;
import static java.util.Math.*;
不过,过度使用这个特性也会一定程度上降低代码地可读性,所以一般也不怎么用.
2.自动装箱和拆箱
自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类.
自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型.
典型应用:
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);//这里自动完成了装箱操作
jdk5.0之前是这样做的list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
原因:list集合中只能存入元素,而元素也属于object.此特性的出现大大简化了代码.
Iterator it =new Iterator();
while(it.hasNext){
int i = (Integer)it.next;//这里自动完成了拆箱操作
}
3.增强for循环
- 对迭代器的简化
- 格式:
- for(类型 变量名: 数组|集合){
- 变量:存放当前遍历的数组或集合的当前内容
- 集合: 必须是实现Iterable接口的集合
用于遍历数组或集合中的元素
查看增强for能够遍历此数据要看:次数据是否是数组类型,或者该类型是否实现了Iterable接口.
增强for循环只能用在数组.或实现Iterable接口的集合类上.[list.set均实现了Iterable接口]
格式:
for(变量类型 变量名:需迭代的数组或集合)
@Test //增强for遍历数组
public void test1() {
int[] arr= {1,2,3};
for (int i : arr){
System.out.println(i);
}
}
}
@Test //增强for遍历Map方式一
public void test2() {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");
for (Object obj : map.keySet()) {
String key = (String) obj;
String value = map.get(key);
System.out.println(key + ":" + value);
}
}
@Test //增强for遍历Map方式二
public void test3() {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("1", "aaa");
map.put("2", "bbb");
map.put("3", "ccc");
for (Object obj : map.entrySet()) {
Map.Entry<String, String> entry = (Entry) obj;
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ":" + value);
}
}
使用增强for需要注意的小问题:增强for只适合取出数据,不能修改数据的值
@Test //增强for取数组中的值
public void test4() {
int arr[] = { 12, 22, 33 };
for (int i : arr) {
i = 10;
}
System.out.println(arr[2]); //33
}
@Test //增强for取集合中的值
public void test5() {
List list = new ArrayList();
list.add(1);
for (Object obj : list) {
obj = "10";
}
System.out.println(list.get(0)); //1
}
取出list中数据的方法 Object get(index)\
ctrl+shift+O整理包,快速导包 crl+alt+down/up向上向下复制代码
ctrl+1 快速修复 ctrl+T查看当前类的继承关系
4.可变参数
其实就是上一种数组参数的简写形式,不用每一次都手动的建立数组对象。
只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组。
在使用时注意:可变参数一定要定义在参数列表最后面,避免传入错误的参数。
示例:
class ParamMethodDemo
{
public static void main(String[] args)
{
/*
虽然少定义了多个方法。
但是每次都要定义一个数组,作为实际参数。这事在没有可变参数之前的作法。
int[] arr = {3,4};
show(arr);
int[] arr1 = {2,3,4,5};
show(arr1);
*/
/*
在使用可变参数之后,可以一次传入不定量的多个参数。
可变参数必须定义在最后面,避免将str当作int传入了。
*/
show("haha",2,3,4,5,6);
}
public static void show(String str,int... arr)
{
System.out.println(arr.length);
}