简介

数组存在的优势和劣质

优势

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

劣势

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

引入容器

  • 容器这个概念就是装东西的介质,可以理解为能装东西的都是容器
  • 比如之前的数组,就是一种容器
  • 英文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. 网络协议之:haproxy的Proxy Protocol代理协议

    目录 简介 Proxy Protocol的实现细节 版本1 版本2 Proxy Protocol的使用情况 总结 简介 代理大家应该都很熟悉了,比较出名的像是nginx,apache HTTPD,st ...

  2. Numpy通用函数及向量化计算

    Python(Cpython)对于较大数组的循环操作会比较慢,因为Python的动态性和解释性,在做每次循环时,必须做数据类型的检查和函数的调度. Numpy为很多类型的操作提供了非常方便的.静态类型 ...

  3. GPT-3的训练一次成本约为140万美元

    训练GPT模型的成本非常高昂,因为它需要大量的计算资源和时间.具体来说,GPT-3的训练成本约为140万美元,对于一些更大的LLM模型,训练成本介于200万美元至1200万美元之间.此外,OpenAI ...

  4. Unity 音乐或者视频播放完毕之后执行方法

    视频播放完毕后,执行某个方法 方法1 官方给的解释 private VideoPlayer video2; private void Awake() { video2.loopPointReached ...

  5. HarmonyOS应用事件打点开发指导

      简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息.因此,应用开发者需要一种数据打点机制,用来评估如访问数.日活.用户操作习惯以及影响用户使用的关键因素等关键 ...

  6. nginx重新整理——————http请求的11个阶段中的content阶段[十八]

    前言 简单介绍一下content 阶段. 正文 下面介绍一下root和alias. 这个前面其实就提交过了,这里再说明一下. 功能都是一样的:将url映射为文件路径,以返回静态文件内容. 差别:roo ...

  7. js es6 Proxy

    传统的get,set ES6 中引入Proxies,让你可以自定义Object的基本操作.例如,get就是Object的基础操作方法. const obj = { val: 10 }; console ...

  8. Pytorch-实战之对Himmelblau函数的优化

    1.Himmelblau函数 Himmelblau函数: F(x,y)=(x²+y-11)²+(x+y²-7)²:具体优化的是,寻找一个最合适的坐标(x,y)使得F(x,y)的值最小. 函数的具体图像 ...

  9. 百度AIPNLP 文本相似度 文本审核

    效果不如有监督的bert文本相似度好 from aip import AipNlp APP_ID = "22216281" APT_KEY = "foEeYauuvnqW ...

  10. 记录如何用php做一个网站访问计数器的方法

    简介创建一个简单的网站访问计数器涉及到几个步骤,包括创建一个用于存储访问次数的文件或数据库表,以及编写PHP脚本来增加计数和显示当前的访问次数. 方法以下是使用文件存储访问次数的基本步骤: 创建一个文 ...