泛型和Map集合的不同

简介: 泛型和Map集合的不同


  1. 举例1:中药店,每个抽屉外面贴着标签.
  2. 举例2:超市购物架上很多瓶子,每个瓶子上都有标签.
  3. 举例3:家庭厨房中各种调料罐上面的标签.
  4. Java中的泛型,就类似于上述场景中的标签.

1.2 泛型的引入.

  • 在Java中,我们在声明方法时,当在完成方法功能时如果有未知的数据需要参与,这些未知的数据需要在调用方法时才能确定,那么我们把这样的数据通过形参表示。在方法体中,用这个形参名来代表那个未知的数据,而调用者在调用时,对应的传入实参就可以了。受以上启发,JDK1.5设计了泛型的概念。泛型即为“类型参数”,这个类型参数在声明它的类、接口或方法中,代表未知的某种通用类型,由调用者传入的类型决定。
  • 举例:
  • 集合类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK5.0之前只能把元素类型设计为Object,JDK5.0时Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时指定集合元素的类型。比如:List<String>,这表明该List只能保存字符串类型的对象。
  • 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值或参数的类型。这个类型参数将在使用时确定(即传入实际的类型参数,也称为类型实参)。泛型不能使用基本数据类型,必须是引用类型,如果没有指定泛型,默认是Object类型。不可以在静态方法和异常中使用泛型,但是静态的泛型方法是可以使用泛型的。

1.3泛型方法.

  • 如果我们定义类、接口时没有使用<泛型参数>,但是某个方法形参类型不确定时,这个方法可以单独定义<泛型参数>。语法格式如下:

[访问权限]  <泛型>  返回值类型  方法名([泛型标识 参数名称])  [抛出的异常]{

 

}

  • 注意事项:
  1. 方法,也可以被泛型化,与其所在的类是否是泛型类没有关系。
  2. 泛型方法中的泛型参数在方法被调用时确定。
  3. 泛型方法可以根据需要,声明为static的。
  • 练习:编写一个泛型方法,接收一个任意引用类型的数组,并输出该数组里面所有元素。


1.4通配符?在泛型里面的使用.

1.4.1通配符?的理解.

  • 当我们声明一个变量/形参时,这个变量/形参的类型是一个泛型类或泛型接口,例如:Comparator<T>类型,但是我们仍然无法确定这个泛型类或泛型接口的类型变量<T>的具体类型,此时我们考虑使用类型通配符 ? 。
  • 使用类型通配符:?,比如:List<?>,Map<?,?>。List<?>是List<String>、List<Object>等各种泛型List的父类。

1.4.2通配符的读和写.

  1. 写的操作:将任意元素加入其中是不安全的。

  • 因为我们不知道c的元素类型,我们不能向其中添加对象。add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一可以插入的元素是null,因为它是所有引用类型的默认值。

  1. 读的操作:读取List<?>的对象list中的元素时,永远是安全的,因为不管 list 的真实类型是什么,它包含的都是Object的子类。


1.4.3使用时注意点.


1.4.4使用案例.


1.5有限制的通配符.

  1. <?>:允许所有泛型的引用调用;
  2. 通配符指定上限:<? extends 类/接口>:使用时指定的类型必须是继承某个类,或者实现某个接口。
  3. 通配符指定下限:<? super 类/接口>:使用时指定的类型必须是操作的类或接口,或者是操作的类的父类或接口的父接口。

  • 举例1:

  • 举例2:


2.Map集合讲解内容.

2.1相关方法.


2.2迭代器讲解.

解决办法 =============> 迭代器Iterator

   迭代器Iterator作用:遍历Set集合或取Set集合中的值。

   Iterator方法:

   boolean      hasNext();  //如果仍有元素可以迭代,则返回 true。

   E            next();     //返回迭代的下一个元素。

   

   操作步骤:

   第一: 声明迭代器(放到一个传送带上)

   Iterator<String> 迭代名 = 集合名.iterator<String>();

       

   例:Set ar = new HashSet();

       ar.add("java01");

       ar.add("java02");

       ar.add("java03");

       Iterator<String>  it = ar.iterator<String>();

   第二: 循环取出

   while(it.hasNext()){  

       String  str = it.next();

       System.out.println(str);

   }

 


2.3HashMap和HashTable的区别.

  1. HashMap可以加null值,HashTable不可以;
  2. HashMap在JDK1.2出现;HashTable在JDK1.0出现;
  3. HashMap没有实现方法的同步;HashTable实


相关文章
|
5月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
5月前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
78 3
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
1月前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
42 0
|
3月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
3月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
3月前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
3月前
|
存储
|
3月前
|
安全 Java
【Java集合类面试五】、 如何得到一个线程安全的Map?
如何得到一个线程安全的Map的方法包括:使用Collections工具类将Map包装为线程安全,使用java.util.concurrent包下的ConcurrentHashMap,以及不推荐使用性能较差的Hashtable。