[19/03/23-星期六] 容器_ 泛型Generics
一、概念
生活中的容器不难理解,是用来容纳物体的,程序中的“容器”也有类似的功能,就是用来容纳和管理数据。
数组就是一种容器,可以在其中放置对象或基本类型数据。
---优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。
---劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。(因为数组容量是提前定义好的)
基于数组并不能满足我们对于“管理和组织数据的需求”,需要一种更强大、更灵活、容量随时可扩的容器来装载我们的对象,即容器也叫集合(Collection)
【容器的接口层次】Hash:哈希 ;Array:数组 linked:线性表 Map:存放键值对

【泛型】
泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。
JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。
泛型的本质就是“数据类型的参数化”。 我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
我们可以在类的声明处增加泛型列表,如:<T,E,V>,字符可以是任何标识符,一般采用这3个字母
【比喻】 容器:厨房一个大桶,放多种肉的混合,可以放但是拿出来某种肉得仔细找找看看
泛型:厨房放几个大桶,把肉分类,每种肉放一桶且各贴一种标签,方便拿出。而泛型就是这个标签。
【自定义泛型】
/*测试泛型
*Generics:一般的、普通的,无标签、无商标的 Object:目标、物体、对象
*
*/
package cn.sxt.collection; public class Test_0323_Generics {
public static void main(String[] args) {
MyCollection mc=new MyCollection();
mc.set("高老师", 0);
mc.set(200, 1);
System.out.println((String)mc.get(0)); //没有加泛型的情况,取对象内容需要强制转型 ,Object型转成String型
System.out.println((Integer)mc.get(1)); //加了泛型后注意区别 MyCollection2类中, <String>类似于实参对应于形参<E>, 第2个<String>在jdk1.7之后可以不写
MyCollection2<String> mc2=new MyCollection2<String>();
mc2.set("李老师", 0);//如果这样 mc2.set(200, 1);会报错 因为mc2中只能放字符型对象
System.out.println(mc2.get(0));//这里不用像上边一样强制转型了 因为通过设置编译器会自动检查 相当于把肉分类了贴好标签 }
}
//没加泛型的情况
class MyCollection{
Object objs[]=new Object[5]; public void set(Object obj,int index){
objs[index]=obj;
} public Object get(int index) {
return objs[index]; } }
//加了泛型(本质就是某种类型)的情况:可以在类的声明处增加泛型列表,如:<T,E,V> 字符可以是任何标识符,一般采用这3个字母。 类似形参
class MyCollection2 <E> {
Object objs[]=new Object[5]; public void set(E e,int index){
objs[index]=e;
} public E get(int index) {
return (E)objs[index]; } }
【好处】容器相关类都定义了泛型,在开发中使用容器类时都要使用泛型。这样,在容器的存储数据、读取数据时都避免了大量的类型判断,非常便捷。
通过阅读源码,我们发现Collection、List、Set、Map、Iterator接口都定义了泛型,因此,我们在使用这些接口及其实现类时,都要使用泛型。
强烈建议使用泛型。事实上,不使用编译器也不会报错!
接口的源码如下图所示:

[19/03/23-星期六] 容器_ 泛型Generics的更多相关文章
- [19/03/24-星期日] 容器_Collection(集合、容器)之List(表,有顺序可重复)
一. 概念&方法 Collection 表示一组对象,它是集中.收集的意思.Collection接口的两个子接口是List.Set接口. 由于List.Set是Collection的子接口,意 ...
- JAVA基础复习与总结<六> 数组_容器_泛型
数组的常用方法 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的. 具有以下功能: 给数组赋值:通过 fill 方法. 对数组排序:通过 sort 方法,按升序. 比较 ...
- CentOS 8.0 安装docker 报错:Problem: package docker-ce-3:19.03.4-3.el7.x86_64 requires containerd.io >= 1
1.错误内容 package docker-ce-3:19.03.2-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of th ...
- Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but ...
- 安装docker遇到:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
执行 yum install docker-ce docker-ce-cli containerd.io 提示: 错误: 问题: package docker-ce-3:19.03.8-3.el7.x ...
- deepin 15.11 升级docker-ce 18.01到19.03.1,升级docker compose 1.23到1.24.1
1.升级docker compose ,docker官方安装方法 $ sudo curl -L "https://github.com/docker/compose/releases/dow ...
- [RHEL8]安装Docker Problem: package docker-ce-3:19.03.6-3.el7.x86_64 requires containerd.io
系统环境 # cat /etc/redhat-release Red Hat Enterprise Linux release 8.0 (Ootpa) 安装依赖 # yum install -y yu ...
- fedora30平台安装docker 19.03
一,下载docker 1,说明:docker的打包对于fedora的支持很及时, 所以在fedora 30/31上都可以直接使用官方的rpm包 下载地址: https://download.docke ...
- docker19.03搭建私有容器仓库
一,启动docker后,搜索registry [root@localhost source]# systemctl start docker [root@localhost source]# dock ...
随机推荐
- 全网备份脚本rsync
一,服务端配置 #!/bin/sh ######################################################### #by:kingle # #use: confi ...
- 如何透过上层div点击下层的元素解决方法
一.问题描述 笔者是在些一个登录界面时遇到这个问题的,需求是点击登录按钮出现登录悬浮框,初始化时登录悬浮框是display:none的,但笔者发现登录框那一块区域的input框无法响应点击时间,也无法 ...
- 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...
- HAProxy advanced Redis health check---ref
http://blog.exceliance.fr/2014/01/02/haproxy-advanced-redis-health-check/ HAProxy advanced Redis hea ...
- java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE 的理解
[2013-12-06 11:06:21,715] [C3P0PooledConnectionPoolManager[identityToken->2tl0n98y1iwg7cbdzzq7a|7 ...
- 6、Modal
1.首先Modal是一个内容窗格.通常用来做一个选择或编辑. 先来看一下 tabs.html 做了什么. /* --- tabs.html ----*/ <ion-navbar *navbar ...
- ADO.NET教程(2)实现增删查改
声明一个类,在类中实现增删查改的方法 public class AdoNet { //声明连接字符串 public string Sqlstr = "data source={0};data ...
- android aidl通信 RemoteCallbackList客户端注册回调
RemoteCallbackList 声明 public class RemoteCallbackList<E extends IInterface> 情况 在AIDL中客户端向服务端注册 ...
- Java开发团队管理细则
软件开发是团队协作,多人开发很容易造成协调问题,因此,做一些必要的开发规范,有助于帮助新员工成长,也有助于提高开发效率,防止各种问题影响开发进度. 1. 代码规范 建议每位java开发人员都读一下&l ...
- Spring课程 Spring入门篇 4-8 Spring bean装配之基于java的容器注解说明--基于泛型的自动装配
1 解析 1.1 什么是泛型? 1.2 泛型有什么作用? 1.3 泛型装配样式? 2 代码演练 2.1 泛型应用 1 解析 1.1 什么是泛型? Java泛型设计原则:只要在编译时期没有出现警告,那么 ...