Java学习日记-泛型&set接口

111 阅读3分钟

知识点总结

  • Map map = new HashMap(); 这时候,map.方法/变量 只能调用Map中有的方法/变量(HashMap继承过来的)

    HashMap = new HashMap(); map.方法/变量 既可以调用父类继承过来的,也能调用自身扩展的方法/变量

  • HashMap可以用迭代器遍历输出

    Iterator iter = map.keySet().iterator();
    while(iter.hasNext()){
    	Object key = iter.next();
        System.out.println(key + " " + map.get(key));
    }
    

泛型

  • 泛型的本质是参数化类型

    • 泛型实现了参数化类型的概念,使代码可以应用于多种类型。
    • “泛型”这个术语的意思是:“适用于许多许多的类型”。其最初目的是希望方法或类能够具备最广泛的表达能力。
  • 泛型的最主要目的之一是用来指定容器要持有什么类型的对象,而且由编译器来包装类型的正确性。

  • 暂时不指定类型,而是稍后再决定具体使用什么类型。

  • 语法格式:

    类型<E> 对象 = new 类型<E>();
    
    • 用<>括住,放在类名后面,然后在使用这个类的时候,再用实际的类型替换此类型参数。
  • 在集合中的应用

    • 使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换,并且如果把非指定类型对象放入集合,会出现编译错误

    • 例子 :

      public static void main(String[] args) {
          //创建新闻标题对象
          NewTitle c1 = new  NewTitle(1,"牧马人","小寒");
          NewTitle c2 = new  NewTitle(2,"大奔","小汪");
      	//创建存储新闻标题的集合对象
          List<NewTitle> newsTitleList = new ArrayList<NewTitle>();
          //按照顺序依次添加新闻标题
          newsTitleList.add(c1);
          newsTitleList.add(c2);
      
          //获取新闻标题的总数
          System.out.println("新闻标题的总数:" + newsTitleList.size());
      
          //遍历集合
          System.out.println("新闻标题名称为:");
          for (NewTitle newTitle :newsTitleList ) {
              System.out.println(newTitle.getTitleName());
          }
      }
      
  • 参数化类型:包含一个类或接口,以及实际的类型参数列表

  • 类型变量:是一种非限定性标识符,用来指定类、接口或者方法的类型

泛型类:

  • 具有一个或多个类型参数的 类
? super T //只接收的父类/自己    向上限制(最下层已确定)

? extends T //只接收T的子类/自己   向下限制(最上层已确定)
  • 定义泛型类

    • 访问修饰符 class classname<TypeList>{}

    • TypeList表示类型参数列表,每个类型变量之间用逗号隔开

    • public class Student<T>{}
      
    • 创建泛型类实例

      • new classname<TypeList>(arg List);
      • TypeList表示定义的类型参数列表,用逗号隔开
      • arg List表示实际传递的类型参数列表,用逗号隔开
  • 泛型接口

    • 定义泛型接口

      public interface StudentName<T>{
          public T getName(T t);
      }
      
    • 泛型类实现泛型接口

      访问修饰符 class Student<TypeList> implements StudentName<TypeList>{}
      
  • 泛型方法

    • 带有类型参数的方法
    • 定义泛型方法与方法所在类、或接口是否是泛型类或泛型接口没有直接的联系。
    • 无论是还是不是泛型类,如果需要就可以定义泛型方法
    • 对于一个static的方法而言,无法访问泛型类的类型参数,所以如果static方法需要使用泛型能力,就必须使其成为泛型方法

Set接口

  • Set接口

    • 可以存储一组唯一、无序的对象
    • 实现类有:HashSet类、TreeSet类
  • 方法

    方法说明
    boolean add(Object obj)如果Set中没有包含指定元素o,则添加指定元素o
    void clear()从Set中移除所有元素
    int size()返回Set中元素的数量
    boolean isEmpty()如果Set中不包含任何元素,则返回true
    boolean contains(Object obj)如果Set中包含指定元素,返回true
    boolean remove(Object obj)如果指定元素o存在于Set中,则将其移除
    • 例子

      public class ArrayList {
          public static void main(String[] args) {
          //创建多个新闻标题对象
              NewTitle c1 = new  NewTitle(1,"牧马人","www");
              NewTitle c2 = new  NewTitle(2,"大奔","aaa");
              NewTitle c3 = new  NewTitle(1,"沃尔沃","mmm");
              NewTitle c4 = new  NewTitle(2,"甲壳虫","hhh");
              //创建存储新闻标题的集合对象并添加新闻标题
              Set newsTitleList = new HashSet();
              //依照顺序依次添加新闻标题
              newsTitleList.add(c1);
              newsTitleList.add(c2);
              newsTitleList.add(c3);
              newsTitleList.add(c4);
              //获取新闻标题总数
              System.out.println("新闻标题数目:" + newsTitleList.size() + "条");
              //判断集合中是否包含甲壳虫新闻标题
              System.out.println("甲壳虫新闻是否存在:" + newsTitleList.contains(c4));
              //移除甲壳虫
              newsTitleList.remove(c4);
              System.out.println("甲壳虫对象已经删除");
              System.out.println("集合是否为空:" + newsTitleList.isEmpty());
              System.out.println("遍历所有的新闻标题");
              for (Object obj : newsTitleList) {
                  NewTitle newTitle = (NewTitle) obj;
                  System.out.println("新闻标题名称:" + newTitle.getTitleName());
              }
          }
      }
      
  • set遍历

//Iterator
Iterator it = map.keySet().iterator();
while(it.hasNext()){
    Object key = it.next();
   System.out.println(it.next().toString());
}

//entrySet()
Set set1 = map.keySet();
for(Object obj : set1){
    Map.Entry entry = (Map.Entry) obj;
    System.out.println(entry.getKey() + "----->" + entry.getValue());
}

//keySet()
Set set = map.keySet();
for(Object obj : set){
    System.out.println(obj + "----->" + map.get(obj));
}