Java学习笔记29(集合框架三:泛型)

泛型的概念:

简单地讲,就是同一个方法(类),可以接受不同的数据类型并运行得到相对应的结果,不会出现安全问题

上一篇有一段这样的代码:

没有定义集合类型、迭代器类型

package demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo {
    public static void main(String[] args) {
        //集合可以存储任意类型的对象
        //集合中,不指定存储的数据类型,也可以存储
        Collection c1 = new ArrayList();
        c1.add("abc");
        c1.add("def");
        Iterator it1 = c1.iterator();
        while(it1.hasNext()){
            //it.next获取Object类型,强制转换
            String s1 = (String)it1.next();
            System.out.println(s1.length());
        }
    }
}

这里会有隐患:如果add(1);,自动装箱成Integer类型,无法转换成String,发生类型的转换异常

java中提出了泛型的概念,来解决这个问题:

package demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class GenericDemo {
    public static void main(String[] args) {
        function();
    }

    public static void function(){
        Collection<String> c1 = new ArrayList<String>();
        c1.add("abc");
        c1.add("def");
        Iterator<String> it1 = c1.iterator();
        while(it1.hasNext()){
            String s1 = it1.next();
            System.out.println(s1);
        }
    }
}

这时候如果add(1);,在编译的时候会无法通过,解决了安全问题

其实这里的泛型,是伪泛型,这里只是一个编译的手段,如果不是String类型,编译无法通过,否则编译成功

而编译后的class文件里面不存在泛型,但是由于编译过程中处理了类型问题,所以最后运行也是安全的

泛型的方法(了解即可,没有实际应用价值):

package demo;

import java.util.ArrayList;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        // ArrayList集合内有方法toArray泛型方法
        array.add(123);
        array.add(456);

        Integer[] i = new Integer[(array.size())];
        Integer[] j = array.toArray(i);
        for (Integer k : j) {
            System.out.println(k);
        }
    }
}

同样存在泛型的接口,泛型类等,目的都是为了解决安全问题并且方便使用者,并且带来了增强for循环

泛型的通配符?:

package demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<String>();
        array.add("abc");
        array.add("def");

        HashSet<Integer> set = new HashSet<Integer>();
        set.add(123);
        set.add(456);

        iterator(array);
        iterator(set);
    }
    //要求定义一个方法,可以同时迭代两个集合
    public static void iterator(Collection<?> c){
        Iterator<?> it1 = c.iterator();
        while(it1.hasNext()){
            System.out.println(it1.next());
        }
    }
}

原文地址:https://www.cnblogs.com/xuyiqing/p/8276197.html

时间: 2024-08-12 08:08:19

Java学习笔记29(集合框架三:泛型)的相关文章

【Java学习笔记】集合框架Ⅱ

迭代 ●迭代是取出集合中元素的一种方式. ●因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器. ●用法: 第一种 for (iterator iter=iterator(); iter.hasNext();) //老外比较喜欢用这种,省内存(iter的内存),开发时用这个 { System.out.println(iter.next()); } 第二种 Iterator iter = l.iterator(); while(iter.hasNext()) {

【Java学习笔记】集合框架Ⅰ

集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1.用于存储对象的容器. 2.集合的长度是可变的. 3.集合中不可以存储基本数据类型值. 集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架. 框架的顶层是Collection接口. Collection的常见方法: 1.添加 boolean  add(Object obj); boolean  addAll(Collection coll); 2.删

【Java学习笔记】&lt;集合框架&gt;Iterator的子接口ListIterator

1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 public class Test3 { 6 7 public static void main(String[] args) { 8 List list = new ArrayList(); 9 10 list.add("abc1"); 11 list.add("abc2"); 12 lis

【Java学习笔记】&lt;集合框架&gt;TreeSet,Comparable,Comparator

1 public class Person implements Comparable{ 2 private String name; 3 private int age; 4 5 public Person(){ 6 super(); 7 } 8 public Person(String name, int age) 9 { 10 super(); 11 this.name = name; 12 this.age = age; 13 } 14 15 16 @Override 17 public

【Java学习笔记】&lt;集合框架&gt;使用LinkedList来模拟一个堆栈或者队列的数据结构

1 import java.util.LinkedList; 2 3 public class Test5 { 4 5 public static void main(String[] args) { 6 7 Duilie dl = new Duilie(); 8 9 dl.myAdd("abc1"); 10 dl.myAdd("abc2"); 11 dl.myAdd("abc3"); 12 dl.myAdd("abc4");

【Java学习笔记】&lt;集合框架&gt;对字符串进行长度排序

1 package 测试; 2 3 import java.util.Comparator; 4 5 public class ComparatorByLength implements Comparator { //定义比较器 6 7 @Override 8 public int compare(Object o1, Object o2) { 9 String s1 = (String)o1; 10 String s2 = (String)o2; 11 12 int temp = s1.len

黑马程序员——JAVA学习笔记八(集合)

1,    JAVA最初版本只为最常用的数据结构提供了很少的一组类:Vector.Stack.Hashtable.BitSet与Enumeration接口,从JAVA1.2版本开始推出了一组功能完善的的数据结构. 集合类的由来:  对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.  就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本数据类型值. 4,接口与实现相互分离. 集合框架是为表示和操作集合而规定的一种统一的标准

Java基础学习笔记十七 集合框架(三)之Map

Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储. Map中的集合,元素是成对存在的(理解为夫妻).每个元素由键与值两部分组成,通过键可以找对所对应的值. Collection中的集合称为单列集合,Map中的集合称为双列集合. 需要注意的是,Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值. Map中

【原】Java学习笔记026 - 集合

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // 需求:从三国演义中评选出四个最帅的武将,并存储下来 6 7 // 因为具备了面向对象的思想,所以创建四个对象来存储 8 Hero hero1 = new Hero("张飞", 18); 9 Hero hero2 = new Hero("赵云", 16); 10 Her