简介

数组存在的优势和劣质

优势

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

劣势

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

引入容器

  • 容器这个概念就是装东西的介质,可以理解为能装东西的都是容器
  • 比如之前的数组,就是一种容器
  • 英文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. JDK11的新特性:新的HTTP API

    目录 简介 使用HTTP Client请求的基本流程 创建HTTP Client 创建HTTP Request 发送HTTP请求 异步HTTP请求 总结 JDK11的新特性:新的HTTP API 简介 ...

  2. js获取select标签的 value 和 text

    <select name="" id="test"> <option value="a1">yi</optio ...

  3. mybatis复习(二)

    简介 mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的 ...

  4. github 小技巧

    前言 简单记一下github 小技巧,因为经常忘. 正文 就是如何快速搜索到自己想找的项目. 如果自己知道项目名,那么直接输入就可以搜索到. 如果不是,那么一般要通过高级搜索. https://git ...

  5. mysql 必知必会整理—数据汇总与分组[七]

    前言 简单整理一下数据汇总与分组 正文 我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数.使用这些函数,MySQL查询可用于检索数据,以便分析和报表生成. 这种类型的检索例 ...

  6. 力扣239(Java)- 滑动窗口最大值(困难)

    题目: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回 滑动窗口中的最大值 . 示 ...

  7. 力扣69(java&python)-x的平方根(简单)

    题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 . 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 . 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0. ...

  8. Apache Flink在 bilibili 的多元化探索与实践

    简介: bilibili 万亿级传输分发架构的落地,以及 AI 领域如何基于 Flink 打造一套完善的预处理实时 Pipeline. 本文由 bilibili 大数据实时平台负责人郑志升分享,本次分 ...

  9. Flink 在有赞的实践和应用

    简介: 本文介绍了Flink 在有赞的实践和应用,内容包括:Flink 的容器化改造和实践.Flink SQL 的实践和应用.未来规划. 作者:沈磊 一.Flink 的容器化改造和实践 1. 有赞的集 ...

  10. dotnet 记 TaskCompletionSource 的 SetException 可能将异常记录到 UnobservedTaskException 的问题

    本文将记录 dotnet 的一个已知问题,且是设计如此的问题.假定有一个 TaskCompletionSource 对象,此对象的 Task 没有被任何地方引用等待.在 TaskCompletionS ...