原创

java泛型


泛型基本使用

@Test
public void test1(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(31);
        list.add(132);
        list.add(15);
        // 方式1
        for (Integer integer : list){
             System.out.println(integer);
        }
        //方式2
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
             System.out.println(iterator.next());
        }
    }

在集合中使用泛型

  • 集合接口或集合类在jdk5.0时都修改为带泛型的结构。
  • 在实例化集合类时,可以指明具体的泛型类型
  • 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化的泛型类型
  • 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置拿包装类替换
  • 如果实例化时,没有指明泛型的类型。默认类型为java.Lang.object类型。
 public void test2(){
        Map<String,Integer> map = new HashMap<String, Integer>();
        map.put("age",13);
        map.put("num",33);
        Set<Map.Entry<String,Integer>> entries = map.entrySet();
        Iterator<Map.Entry<String,Integer>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> entry = iterator.next();
             System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

TreeSet使用泛型并自定义排序

@Test
public void test(){
        // 先按price再按name排序
        TreeSet<Bean1> set = new TreeSet<>(new Comparator<Bean1>() {
            @Override
            public int compare(Bean1 o1, Bean1 o2) {
                if (o1 instanceof  Bean1 && o2 instanceof  Bean1){
                    Bean1 b1 = (Bean1)o1;
                    Bean1 b2 = (Bean1)o2;
                    // 方式1
                    if (b1.getPrice() > b2.getPrice())
                        return 1;
                    else if (b1.getPrice() < b2.getPrice())
                        return -1;
                    else
                        return b1.getName().compareTo(b2.getName());
                }
                throw  new RuntimeException("类型错误");
            }
        });
        set.add(new Bean1("a迈克",13));
        set.add(new Bean1("e迈克",14));
        set.add(new Bean1("g迈克",11));
        set.add(new Bean1("c迈克",16));
        set.add(new Bean1("f迈克",14));
        set.add(new Bean1("b迈克",17));
        set.add(new Bean1("ba迈克",17));
        set.add(new Bean1("bc迈克",17));
        set.add(new Bean1("bb迈克",17));

        Iterator<Bean1> iterator = set.iterator();
        while (iterator.hasNext()){
            Bean1 bean1 = iterator.next();
            System.out.println(bean1.getName() + ":" + bean1.getPrice());
        }
    }
  • 如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为object类型
public class Order<T> {
    String orderName;
    int orderId;
    T orderT;

    public Order(String orderName, int orderId, T orderT) {
        this.orderName = orderName;
        this.orderId = orderId;
        this.orderT = orderT;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    public T getOrderT() {
        return orderT;
    }

    public void setOrderT(T orderT) {
        this.orderT = orderT;
    }

    @Override
    public String toString() {
        return "Order{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
}
@Test
public void test(){
	Order order = new Order<>("桶装水",2,"默认套餐");
	System.out.println(order.toString());//Order{orderName='桶装水', orderId=2, orderT=默认套餐}
	Order order1 = new Order<>("桶装水",2,123);
         System.out.println(order1);//Order{orderName='桶装水', orderId=2, orderT=123}
}

通配符 ?

@Test
public void test(){
        List<Object> list1 = null;
        List<String> list2 = null;
        list2 = new ArrayList<>();
        list2.add("hello");
        List<?> list = null;

        list = list1;
        list = list2;
        //添加:对于List<?>就不能向其内部添加数据。
        //除了添加null之外。
//        list.add(0,1);
        list.add(null);
        //可以读取 类型为Object
         System.out.println(list.get(0));
        print(list);
    }
    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()){
            Object o = iterator.next();
             System.out.println(o);
        }
    }
java