简介

数组存在的优势和劣质

优势

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

劣势

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

引入容器

  • 容器这个概念就是装东西的介质,可以理解为能装东西的都是容器
  • 比如之前的数组,就是一种容器
  • 英文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. OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器

     @Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景.不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参 ...

  2. [llama懒人包]ChatGPT本地下位替代llama-7b,支持全平台显卡/CPU运行

    LLAMA的懒人包: 链接: https://pan.baidu.com/s/1xOw8-eP8QB--u6y644_UPg?pwd=0l08 提取码:0l08 模型来源:elinas/llama-7 ...

  3. springBoot集成RPC

    需求 : 项目开发到尾期,仓库系统需要对接我们这边的制造系统, 为的是制造系统所使用物料时,需向仓库系统发送请求物料信息,所以需要调用 仓库接口. 使用技术: RPC 数据传输格式: json 开发环 ...

  4. openGauss每日一练(全文检索)

    openGauss 每日一练(全文检索) 本文出处:https://www.modb.pro/db/224179 学习目标 学习 openGauss 全文检索 openGauss 提供了两种数据类型用 ...

  5. MogDB 使用样本数据集Mogila

    MogDB 使用样本数据集 Mogila MogDB 提供了一个样本数据集 Mogila,本数据集借鉴了适用于 MySQL 的Sakila 示例数据库.Sakila最初由 MySQL AB 文档团队的 ...

  6. CentOS添加一个新的硬盘分区到挂载的过程

    1.分区 分区工具fdisk用法介绍    fdisk命令参数介绍    p.打印分区表.    n.新建一个新分区.    d.删除一个分区.    q.退出不保存.    w.把分区写进分区表,保 ...

  7. redis 简单整理——发布与订阅[十四]

    前言 简单介绍一下redis的发布与订阅. 正文 Redis提供了基于"发布/订阅"模式的消息机制,此种模式下,消息发布 者和订阅者不进行直接通信,发布者客户端向指定的频道(cha ...

  8. mysql 重新整理——性能下降的原因[四]

    前言 什么是性能下降? 其实就是代码运行的环境变了,那么环境变化是什么? 比如cpu上升了,内存满了.有或者表中数量增加了,量变了. 其实这些是dba干的,但是呢,我们也需要去了解下,并且优化我们的c ...

  9. pycharm更换主题,pycharm更换皮肤,pycharm更换不同颜色

    1.首先  点击File→进入setting 2. 在settings里面找到appearance 3.选择 Theme,下拉即可修改 4.选择不同的主题,darcula是黑色,其他两个是白色

  10. axios 使用与 拦截器

    未拦截使用使用: 由于axios每个请求都是异步.例如有ABC三个请求,C需要拿到AB请求回来的值作为参数,则需同步加载才能,所以使用axios.all才好完成.... 拦截器:为了处理axios中g ...