简介

数组存在的优势和劣质

优势

  • 数组是线性序列,从效率和类型检查的角度讲,数组是最好的

劣势

  • 不灵活,数组的大小是预先定义好的,不会随意改变

引入容器

  • 容器这个概念就是装东西的介质,可以理解为能装东西的都是容器
  • 比如之前的数组,就是一种容器
  • 英文collection,翻译为容器,也有意为集合的值得都是这个接口

Collection介绍

  • 其下有两个子接口Set和List
  • Set 没有顺序,不可重复
  • List 有顺序可以重复

接口常用实现类

  • Set实现HashSet(底层哈希实现)
  • List实现ArrayList(底层数组实现)和LinkedList(底层链表实现)

Map

  • 常用HashMap(底层哈希)

泛型概念引入

  • 泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合
  • 泛型的本质,就是"数据类型的参数化",就相当于给对象加了一个参数,调用的时候需要传入实参
  • 泛型是靠编译器进行处理的

泛型实战

  • 建立一个简单的泛型
建议一个简单的容器
调用容器
存在问题
  • 同类型数据无法共同存储
  • 每次需要不断转型
问题解决 ----------- 使用泛型
  • 泛型常用<T,E,V>表示名称.
改写容器
 1 class FormalCollection<E>{
2
3 Object[] objects;
4
5
6 FormalCollection(){
7 objects=new Object[5];
8 }
9
10 public E getObjects(int index) {
11 return (E)objects[index];
12 }
13
14 public void setObjects(E object,int index) {
15 objects[index] = object;
16 }
17 }
调用容器
 1 FormalCollection<String> formalCollectionString = new FormalCollection<>();
2
3 formalCollectionString.setObjects("zhangsan",0);
4 formalCollectionString.setObjects("lisi",1);
5 formalCollectionString.setObjects("wanger",2);
6 formalCollectionString.setObjects("longwu",3);
7
8 FormalCollection<Integer> formalCollectionInteger = new FormalCollection<>();
9
10 formalCollectionInteger.setObjects(25,0);
11 formalCollectionInteger.setObjects(26,1);
12 formalCollectionInteger.setObjects(27,2);
13 formalCollectionInteger.setObjects(28,3);
14
15
16 FormalCollection<Double> formalCollectionDouble = new FormalCollection<>();
17
18 formalCollectionDouble.setObjects(12500.00,0);
19 formalCollectionDouble.setObjects(12600.00,1);
20 formalCollectionDouble.setObjects(12700.00,2);
21 formalCollectionDouble.setObjects(42800.00,3);
22
23
24 System.out.println("姓名"+"\t\t\t"+"年龄"+"\t\t\t"+"薪资");
25
26 System.out.println(formalCollectionString.getObjects(0)+"\t"+formalCollectionInteger.getObjects(0)+"\t\t\t"+formalCollectionDouble.getObjects(0));
27 System.out.println(formalCollectionString.getObjects(1)+"\t\t"+formalCollectionInteger.getObjects(1)+"\t\t\t"+formalCollectionDouble.getObjects(1));
28 System.out.println(formalCollectionString.getObjects(2)+"\t\t"+formalCollectionInteger.getObjects(2)+"\t\t\t"+formalCollectionDouble.getObjects(2));
结果展示

容器中使用泛型

通过阅读源码,发现Collection、List、Set、Map、Iterator接口都定义了泛型

Collection简介

  • Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口
  • 由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。

Collection接口中定义的方法

  • boolean add(E e); 增加元素到容器中
  • boolean remove(Object o); 从容器中移除元素
  • boolean contains(Object o); 容器中是否包含该元素
  • int size(); 容器中元素的数量
  • boolean isEmpty(); 容器是否为空
  • void clear();清楚容器中所有元素
  • Iterator<E> iterator(); 获取迭代器,用于遍历所有元素
  • boolean containsAll(Collection<?> c);本容器是否包含C容器中的所有元素
  • boolean addAll(Collection<? extends E> c); 将容器C中所有元素增加到本容器
  • boolean removeAll(Collection<?> c); 移除本容器和容器C中都包含的元素
  • boolean retainAll(Collection<?> c); 取本容器和容器C中都包含的元素,移除非交集元素
  • Object[] toArray();转化成Object数组

例子详情见ArrayList

JDK源码阅读-------自学笔记(十九)(容器概念初探和泛型概念)的更多相关文章

  1. JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)

    一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...

  2. JDK源码阅读-------自学笔记(二十五)(java.util.Vector 自定义讲解)

    Vector 向量 Vector简述 1).Vector底层是用数组实现的List 2).虽然线程安全,但是效率低,所以并不是安全就是好的 3).底层大量方法添加synchronized同步标记,sy ...

  3. JDK源码阅读-------自学笔记(五)(浅析数组)

    一.数组基础 1.定义和特点 数组也可以看做是对象,数组变量属于引用类型,数组中每个元素相当于该队形的成员变量,数组对象存储在堆中. 2.初始化数组 常用类初始化 // 整型初始化 int[] int ...

  4. JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)

    一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...

  5. JDK源码阅读(三):ArraryList源码解析

    今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...

  6. JDK源码阅读(一):Object源码分析

    最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...

  7. 利用IDEA搭建JDK源码阅读环境

    利用IDEA搭建JDK源码阅读环境 首先新建一个java基础项目 基础目录 source 源码 test 测试源码和入口 准备JDK源码 下图框起来的路径就是jdk的储存位置 打开jdk目录,找到sr ...

  8. JDK源码阅读-FileOutputStream

    本文转载自JDK源码阅读-FileOutputStream 导语 FileOutputStream用户打开文件并获取输出流. 打开文件 public FileOutputStream(File fil ...

  9. JDK源码阅读-FileInputStream

    本文转载自JDK源码阅读-FileInputStream 导语 FileIntputStream用于打开一个文件并获取输入流. 打开文件 我们来看看FileIntputStream打开文件时,做了什么 ...

  10. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...

随机推荐

  1. RabbitMQ 07 发布订阅模式

    发布订阅模式 发布订阅模式结构图: 比如信用卡还款日临近了,那么就会给手机.邮箱发送消息,提示需要去还款了,但是手机短信和邮件发送并不一定是同一个业务提供的,但是现在又希望能够都去执行,就可以用到发布 ...

  2. MogDB/openGauss学习笔记-获取对象DDL

    MogDB/openGauss 学习笔记-获取对象 DDL 本文出处:https://www.modb.pro/db/399230 内置函数 omm2=# \df *def List of funct ...

  3. HarmonyOS 电话服务开发指导

    电话服务开发概述 HarmonyOS 电话服务系统提供了一系列的 API 用于拨打电话.获取无线蜂窝网络和 SIM 卡相关信息. 应用可以通过调用 API 来获取当前注册网络名称.网络服务状态.信号强 ...

  4. android 关于插件包内的依赖版本不一致问题得解决

    前言 今天使用一个插件包的时候,依赖包冲突了,在此记录一下. 正文 在引用一个: debugImplementation 'com.squareup.leakcanary:leakcanary-and ...

  5. jenkins 持续集成和交付 —— 参数化构建(八)

    前言 这个其实就是我们构建的脚本时候希望能有一些变量,能给我们更多的选择. 正文 选择这个: 填好后,这边就有一个参数配置: 那么接下来就是把变量放到我们的脚本中. 如下: 脚本变成变量符,这样就ok ...

  6. jenkins 持续集成和交付——安装与账户安全还有凭证(二)

    前言 jenkins 整理完毕,共二十四章,逐步放出,互相交流学习.学会jenkins 只是第一步,真正的还是多写脚本,然后遇到构建过程的坑,然后解决. 正文 安装jenkins 首先是如何安装jen ...

  7. SVM简单分类的使用 sklearn机器学习

    # sklearn 库中导入 svm 模块 from sklearn import svm # 定义三个点和标签 X = [[2, 0], [1, 1], [2,3]] y = [0, 0, 1] # ...

  8. 第八課-Channel Study For Caller Custom JAR Lib

    1.下载 apache-maven 推荐3.6.3版本:https://maven.apache.org/download.cgi 设置系统环境变量:PATH 装好后在命令行验证:mvn -v Mav ...

  9. 牛客网-SQL专项训练25

    ①批处理是指包含一条或多条T-SQL语句的语句组,下列选项中,关于批处理的规则描述正确的是(B) 解析: A选项:不能定义一个check约束后,立即在同一个批处理中使用: C选项:Create def ...

  10. Redis消息队列发展历程

    ​简介:Redis是目前最受欢迎的kv类数据库,当然它的功能越来越多,早已不限定在kv场景,消息队列就是Redis中一个重要的功能.Redis从2010年发布1.0版本就具备一个消息队列的雏形,随着1 ...