[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 ...
随机推荐
- express遇到的问题
1. 如何引入express? cnpm install express --save 其中--save可以保存到依赖项中. 接着 var express = require("expres ...
- 【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统
这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指 ...
- groovy与javah互相调用
暂时只找到这几种方法.groovy代码方便灵活.常用来写一些工具.一般都是java加入groovy代码 第一种 java中加入 groovy代码就是 Toy.groovy class Toy{ def ...
- TOJ 2641 Gene
描述 How can millions of different and complex structures be built using only a few simple building bl ...
- MyBatis 中 sqlmapconfig核心标签说明以及配置
文件介绍 对于 MyBatis 最核心的全局配置文件是 sqlmapConfig.xml 文件,其中包含了数据库的连接配置信息.Mapper 映射文件的加载路径.全局参数.类型别名等. 配置项详解 标 ...
- input文本框点击第一次光标在最右边
效果: 样式效果引入bootstrap4.0就OK了. HTML代码: <div class="input-group w-25"> <div class=&qu ...
- win10下clodeblocks编译C语言乱码
打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8
- ARM-IoT
http://tech.hqew.com/fangan_723798 物联网就是一个物品互联网,这里的物品(物)内部有电子系统,具有感知和上报功能,支持远程控制,有时还能做出简单的决策.与物联网相关的 ...
- git push & git pull 推送/拉取分支
git push与git pull是一对推送/拉取分支的git命令. git push 使用本地的对应分支来更新对应的远程分支. $ git push <远程主机名> <本地分支名& ...
- 某虚拟定位APP从破解到原理分析
工具环境ida7.0iphone 6ios 10.2 0x00:基本情况 1. 该app可以修改模拟手机地理位置(gps.基站.WIFI),拥有全局定位.指定应用定位.模拟扫街等功能,只能在已越狱的I ...