您的位置:首页 > 编程语言 > Java开发

黑马程序员_java jdk5.0新特性和枚举的学习笔记

2015-08-22 23:05 756 查看


------- android培训java培训、期待与您交流! ----------

1.Jdk5.0新特性:

Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性。

2.增强for循环

  格式:

   for(数组或集合中的元素类型 变量名 : 数组或者Collection集合)

   {

    //这个变量其实就是从数组或者集合中依次取出的元素

   }

   好处:简化了数组和集合的遍历

示例:

import java.util.*;  

class For  

{  

    public static void main(String[] args)   

    {  

        //定义一个ArrayList集合   

        ArrayList<String> al = new ArrayList<String>();  

        al.add("abc1");  

        al.add("abc2");  

        al.add("abc3");  

  

        for(String s : al)  

        {  

            System.out.println(s);//用高级for遍历集合   

        }  

  

        //传统for与高级for遍历数组   

        int[] arr = {3,5,1};  

  

        for(int x=0; x<arr.length; x++)  

        {  

            System.out.println(arr[x]);  

        }  

        for(int i : arr)  

        {  

            System.out.println("i:"+i);  

        }  

  

        //定义一个HashMap集合   

        HashMap<Integer,String> hm = new HashMap<Integer,String>();  

  

        hm.put(1,"a");  

        hm.put(2,"b");  

        hm.put(3,"c");  

  

        //keySet取出方式的高级for遍历   

        Set<Integer> keySet = hm.keySet();  

        for(Integer i : keySet)  

        {  

            System.out.println(i+"::"+hm.get(i));  

        }  

  

        //entrySet取出方式的高级for遍历   

        for(Map.Entry<Integer,String> me : hm.entrySet())  

        {  

            System.out.println(me.getKey()+"------"+me.getValue());  

        }  

  

    }  

}  

3.可变参数(...):

用到函数的参数上,当要操作的同一个类型元素个数不确定的时候,可是用这个方式,这个参数可以接受任意个数的同一类型的数据。

和以前接收数组不一样的是:

以前定义数组类型,需要先创建一个数组对象,再将这个数组对象作为参数传递给函数。现在,直接将数组中的元素作为参数传递即可。底层其实是将这些元素进行数组的封装,而这个封装动作,是在底层完成的,被隐藏了。所以简化了用户的书写,少了调用者定义数组的动作。

如果在参数列表中使用了可变参数,可变参数必须定义在参数列表结尾(也就是必须是最后一个参数,否则编译会失败。)。

如果要获取多个int数的和呢?可以使用将多个int数封装到数组中,直接对数组求和即可。

示例:

class  ParamMethodDemo  

{  

    public static void main(String[] args)   

    {  

        show("haha",2,3,4,5,6);  

    }  

    public static void show(String str,int... arr)//...就表示可变参数   

    {  

        System.out.println(arr.length);  

    }  

}



4.静态导入:

导入了类中的所有静态成员,简化静态成员的书写,一般不太常用

import static java.util.Collections.*;  //导入了Collections类中的所有静态成员

示例:

[java] view plaincopyprint?import java.util.*;  

import static java.util.Arrays.*;  

import static java.lang.System.*;  

  

class  StaticImport //extends Object   

{  

    public static void main(String[] args)   

    {  

        out.println("haha");//打印输出时就可以直接省略书写System.   

        int[] arr = {3,1,5};  

  

        sort(arr);//使用Arrays工具类的方法sort时就可以省略书写Array.   

  

        int index = binarySearch(arr,1);//半分查找也是一样可以省略   

        out.println("Index="+index);  

  

        //当没有指定继承时,所以类默认继承了Object,   

       //因为toString方法都具备,所以为了区分,必须写上具体调用者   

       out.println(Arrays.toString(arr));  

    }  



5.自动拆装箱:

java中数据类型分为两种 : 基本数据类型   引用数据类型(对象)

在 java程序中所有的数据都需要当做对象来处理,针对8种基本数据类型提供了包装类,如下:

int --> Integer

byte --> Byte

short --> Short

long --> Long

char --> Character

double --> Double

float --> Float

boolean --> Boolean

jdk5以前基本数据类型和包装类之间需要互转:

基本---引用   Integer x = new Integer(x);

引用---基本   int num = x.intValue();

1)、Integer x = 1; x = x + 1;  经历了什么过程?装箱  拆箱  装箱;

2)、为了优化,虚拟机为包装类提供了缓冲池,Integer池的大小 -128~127 一个字节的大小;(享元模式)

3)、String池:Java为了优化字符串操作 提供了一个缓冲池;



6.枚举:

        枚举(Enum)就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否侧,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个;

解决办法:

1)、在setGrade方法中做判断,不符合格式要求就抛出异常;

2)、直接限定用户的选择,通过自定义类模拟枚举的方式来限定用户的输入,写一个Grade类,私有构造函数,对外提供5个静态的常量表示类的实例;

3)、枚举是JDK1.5增加的一个新特性,用于解决此类问题

4)、枚举就是一个特殊的java类,可以定义属性、方法、构造函数、实现接口、继承类;

注意事项:1、 枚举元素必须位于枚举体中的最开始部分

                   2、   可以使用只有一个成员的枚举实现单例

public enum Weekday {

  SUN,MON,TUE,WED,THU,FRI,SAT;

}

    复杂的带抽象方法的枚举

public enum TrafficLamp {

  RED(40) {

   public TrafficLamp nextLamp() {

    return GREEN;

   }

  },

  GREEN(35) {

   public TrafficLamp nextLamp() {

    return YELLOW;

   }

  },

  YELLOW(5) {

   public TrafficLamp nextLamp() {

    return RED;

   }

  };

  public abstract TrafficLamp nextLamp();

  private int time;

  private TrafficLamp(int time) {this.time = time;}

}

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"
target="blank">java培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: