达内课程-foreach循环/可变长参数/枚举/泛型

来源:互联网 发布:php html解析器 编辑:程序博客网 时间:2024/05/09 23:42

for-each格式循环

1、是数组遍历、集合迭代器遍历的语法简化
2、数组a

for(int i=0;i<a.length;i++){    String s = a[i];    //处理s}

执行顺序其实是一样的,数组a里存放了字符串,下标递增,分别取出值,赋值给s

for(String s:a){    //处理s}

3、集合list

for(Iterator<String> it=list.iterator();it.hasNext();){    String s = it.next()    //处理s}

取值方式和上边是一样的,先用list创建一个迭代器对象,然后用迭代器对象的next()方法来取数据

for(String s:list){    //处理s}

栗子

public class Test {    public static void main(String[] args) {         HashMap<Integer,String> map = new HashMap<>();         map.put(9527,"王力宏");         map.put(9528,"王丽坤");         map.put(9529,"王小利");         //添加重复的键,新的值会覆盖以前的值         map.put(9528,"王尼玛");         map.put(9530,null);         map.put(null,"---");         System.out.println(map.size());         //数据显示无序         System.out.println(map);         System.out.println(map.get(9527));         System.out.println(map.get(9999));         System.out.println(map.containsKey(9527));         System.out.println(map.containsValue("Errol"));         //返回被移除的值         System.out.println(map.remove(9529));         System.out.println(map.remove(9999));         System.out.println("-------------------");         Set<Integer> keys = map.keySet();         for(Iterator<Integer> it = keys.iterator();it.hasNext();){             System.out.println(it.next());         }         System.out.println("-------------------");         Set<Entry<Integer,String>> entrys = map.entrySet();         for(Iterator<Entry<Integer, String>> it = entrys.iterator();it.hasNext();){             Entry<Integer, String> e = it.next();             System.out.println(e.getKey()+"="+e.getValue());         }         System.out.println("-------------------");         Collection<String> values = map.values();         for(Iterator<String> it = values.iterator();it.hasNext();){             System.out.println(it.next());         }                System.out.println("-------------------");         for(Entry<Integer,String> e:entrys){             System.out.println(e.getKey()+"="+e.getValue());         }    }}

输出结果

5{null=---, 9527=王力宏, 9528=王尼玛, 9529=王小利, 9530=null}王力宏nulltruefalse王小利null-------------------null952795289530-------------------null=---9527=王力宏9528=王尼玛9530=null----------------------王力宏王尼玛null-------------------null=---9527=王力宏9528=王尼玛9530=null

可变长参数

是数组参数的语法简化

f()方法

void f(int[] a){    //处理数组a}

调用f()时:

f(new int[]{1,2,3,4});f(new int[]{1,2});f(new int[]{});

f()方法

void f(int... a){    //处理数组a}

调用f()方法

f(1,2,3,4)f(1,2)f()

达内课程-Set集合和Collection用到的addAll就是一个可变长参数的方法

public static <T> boolean addAll(Collection<? super T> c, T... elements) {        boolean result = false;        for (T element : elements)            result |= c.add(element);        return result;    }

枚举

enumeration

一组固定选项
代替整数代码常量选项,提供类型安全的选项

TYPE_CODE = 1;TYPE_HEAT = 2;TYPE_NUCLEAR = 3;void f(int type){}f(1);

//定义枚举
enum WeaponType{
COLD,HEAT,NUCLEAR
}

每个选项,本质是WeaponType类型的实例
public static final WeaponType COLD = new WeaponType();

void f(WeaponType type){
}

f(WeaponType.COLD);

栗子是基于
达内课程-面向对象之接口修改

MainActivity和xml和之前的教程是一样的

涉及到修改的类有:

Weapon类

public interface Weapon {    void kill(TextView textView);    String getName();    WeaponType getType();}

Sword类

public class Sword implements Weapon {    @Override    public void kill(TextView textView) {        textView.append("耍剑");    }    @Override    public String getName() {        return "倚天剑";    }    @Override    public WeaponType getType() {        return WeaponType.COLD;    }}

Lyb

public class Lyb implements Weapon {    @Override    public void kill(TextView textView) {        textView.append("耍棒");    }    @Override    public String getName() {        return "狼牙棒";    }    @Override    public WeaponType getType() {        return WeaponType.NUCLEAR;    }}

AK47

public class AK47 implements Weapon {    @Override    public void kill(TextView textView) {        textView.append("耍枪");    }    @Override    public String getName() {        return "AK47";    }    @Override    public WeaponType getType() {        return WeaponType.HEAT;    }}

Transformer

public class Transformer {    private Weapon w;    public void setWeapon(Weapon w){        this.w = w;    }    public void attack(TextView textView){        if(w == null){            textView.setText("用牙咬");            return;        }        String type = "";        switch (w.getType()){            case COLD:type = "冷兵器";            case HEAT:type = "热兵器";            case NUCLEAR:type = "核武器";        }        textView.setText("使用"+type+w.getName());        w.kill(textView);    }}

泛型

generic type

1、是一种类型参数

void f(int a){}调用f()方法时,f(10)传入的10是数据参数泛型是这样的,传入一个类型,可以是StringInteger等例如class A<Type>{}

2、泛型变量名,习惯使用有意义单词首个字母大写

class A<T>{}

栗子

Holder类

public class Holder<T>{    private T t;    public T getT(){        return t;    }    public void setT(T t){        this.t = t;    }}

Test类

public class Test {    public static void main(String[] args) {        Holder<String> h1 = new Holder<>();        Holder<Double> h2 = new Holder<>();        h1.setT("abc");        h2.setT(3.14);        String s = h1.getT();        Double d = h2.getT();        System.out.println(s);        System.out.println(d);    }}

输出结果

abc
3.14

栗子2

Holder类不变

Test类修改如下

public class Test {    public static void main(String[] args) {        //raw type        //原始类型,即Object        Holder h = new Holder();        //有黄线警告,应该有泛型,不传的话也能执行        h.setT("abc");        h.setT(3.14);        //但是取值的时候必须强转        //最后一次放入的是Double类型,所以强转为Double        Double d = (Double)h.getT();        System.out.println(d);    }}

输出结果

3.14

栗子3

Holder类不变

Test类修改如下

public class Test {    public static void main(String[] args) {        Holder<Integer> a = new Holder<>();        Holder<Double> b = new Holder<>();        Holder<String> c = new Holder<>();        a.setT(10);        b.setT(3.14);        c.setT("abc");        f1(a);        f1(b);        f1(c);        f2(a);        f2(b);        //f2(c);只允许传数字,不能传其他类型    }    /*     *<?>表示某种特定类型的      */    private static void f1(Holder<?> h){        Object v = h.getT();        System.out.println(v);        //不能放入数据h.set(3.14);        //只能放入null        //h.setT(null);    }    /*     *<? extends Number>     *表示某种特定类型的     *并且是Number的子类型     */    private static void f2(Holder<? extends Number> h){        Number v = h.getT();        System.out.println(v);        //限制放入数据    }}

输出结果

103.14abc103.14
原创粉丝点击