【Java集合进阶】LinkedList和迭代器的源码分析泛型类、泛型方法、泛型接口

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

目录

LinkedList和迭代器的源码分析

ArraList集合底层原理

LinkedList集合

LinkedList底层源码分析

泛型类、泛型方法、泛型接口

泛型深入

泛型的好处及拓展

泛型的细节

1、泛型类

代码演示:

2、泛型方法

练习 泛型方法的练习

3、泛型接口


LinkedList和迭代器的源码分析

ArraList集合底层原理

  • 利用空参创建的集合,在底层创建一个默认长度为0的数组

  • 添加第一个元素时,底层会创建一个新的长度为10的数组

  • 存满时,会扩容1.5倍

  • 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

LinkedList集合

  • 底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。
  • LinkedList本身多了很多直接操作首尾元素的特有API。

LinkedList底层源码分析

泛型类、泛型方法、泛型接口

泛型深入

泛型:是jdk5中引入的特性,可以在编译阶段约束的数据类型,并进行检查。

泛型的格式:<数类型>

注意:泛型只能支持引用数据类型

不使用泛型,无法使用前面的特有行为

package list;import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Objects;public class generics {public static void main(String[] args) {//没有泛型的时候,集合如何存储数据//结论://如果我们没有给集合指定类型,默认认为所有的数据类型都是Object类型//此时可以往集合添加任意的数据类型。//带来一个坏处:我们在获取数据的时候,无法使用他的特有行为。//此时推出了泛型,可以在添加数据的时候就把类型进行统一。//而且我们在获取数据的时候,也省的强转了,非常的方便。//1、创建集合的对象ArrayList list = new ArrayList();//2、添加数据list.add(123);list.add("aaa");list.add(new student("zhangsan",21));//3、遍历集合获取里面的每一个元素Iterator it = list.iterator();while (it.hasNext()){Object obj = it.next();System.out.println(obj);}}
}

使用泛型:

package list;import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Objects;public class generics {public static void main(String[] args) {//没有泛型的时候,集合如何存储数据//结论://如果我们没有给集合指定类型,默认认为所有的数据类型都是Object类型//此时可以往集合添加任意的数据类型。//带来一个坏处:我们在获取数据的时候,无法使用他的特有行为。//此时推出了泛型,可以在添加数据的时候就把类型进行统一。//而且我们在获取数据的时候,也省的强转了,非常的方便。//1、创建集合的对象ArrayList<String> list = new ArrayList<>();//2、添加数据list.add("aaa");//3、遍历集合获取里面的每一个元素Iterator<String> it = list.iterator();while (it.hasNext()){String str = it.next();//多态的弊端是不能访问子类的特有功能System.out.println(str);}}
}

泛型的好处及拓展

统一数据类型。

把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。

泛型的细节

  • 泛型中不能写基本数据类型

  • 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型

  • 如果不写泛型,类型默认是Object

1、泛型类

代码演示:
package list;import java.util.Arrays;
import java.util.Objects;public class myarraylist<E> {Object[] obj = new Object[10];int size;/*E : 表示是不确定的类型。该类型在类名后面已经定义过了。e:形参的名字,变量名* */public boolean add(E e){obj[size] = e;size++;return true;}public E get(int index){return (E)obj[index];}@Overridepublic String toString() {return Arrays.toString(obj);}
}
package list;public class GenericsDemo2 {public static void main(String[] args) {/* MyArrayList<String> list = new MyArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");System.out.println(list);*/myarraylist<Integer> list2 = new myarraylist<>();list2.add(123);list2.add(456);list2.add(789);int i = list2.get(0);System.out.println(i);System.out.println(list2);}
}

2、泛型方法

练习 泛型方法的练习

定义一个工具类:listutil

类中定义一个静态的方法addAll,用来添加多个集合的元素。

listutil类:

package list;import java.util.ArrayList;public class listutil {private listutil(){}public static<E> void addAll(ArrayList<E> list, E e1, E e2, E e3, E e4){list.add(e1);list.add(e2);list.add(e3);list.add(e4);}public void show(){System.out.println("hello world!!!");}}

GenericsDemo3类:

package list;import java.util.ArrayList;//定义一个工具类:listutil
//类中定义一个静态方法addall,用来添加多个集合的元素
public class GenericsDemo3 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();listutil.addAll(list,"aaa","bbb","ccc","ddd");System.out.println(list);}
}

3、泛型接口

定义一个myarraylist2类

package list;import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class myarraylist2 implements List<String> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}@Overridepublic Iterator<String> iterator() {return null;}@Overridepublic Object[] toArray() {return new Object[0];}@Overridepublic <T> T[] toArray(T[] a) {return null;}@Overridepublic boolean add(String s) {return false;}@Overridepublic boolean remove(Object o) {return false;}@Overridepublic boolean containsAll(Collection<?> c) {return false;}@Overridepublic boolean addAll(Collection<? extends String> c) {return false;}@Overridepublic boolean addAll(int index, Collection<? extends String> c) {return false;}@Overridepublic boolean removeAll(Collection<?> c) {return false;}@Overridepublic boolean retainAll(Collection<?> c) {return false;}@Overridepublic void clear() {}@Overridepublic String get(int index) {return null;}@Overridepublic String set(int index, String element) {return null;}@Overridepublic void add(int index, String element) {}@Overridepublic String remove(int index) {return null;}@Overridepublic int indexOf(Object o) {return 0;}@Overridepublic int lastIndexOf(Object o) {return 0;}@Overridepublic ListIterator<String> listIterator() {return null;}@Overridepublic ListIterator<String> listIterator(int index) {return null;}@Overridepublic List<String> subList(int fromIndex, int toIndex) {return null;}
}

GenericsDemo4类:

package list;public class GenericsDemo4 {public static void main(String[] args) {/*泛型接口的两种使用方式:1.实现类给出具体的类型2.实现类延续泛型,创建实现类对象时再确定类型*///1、实现类给出具体的类型
//        myarraylist2<String> list = new myarraylist2<>();//2、实现类延续泛型,创建实现类对象时再确定类型myarraylist2 list = new myarraylist2();list.add("123");System.out.println(list);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04平台编译完美解决问题“error: GLSL 4.5 is not supported.”【GLSL(OpenGL着色器语言)】

GLSL介绍 GLSL&#xff08;OpenGL着色器语言&#xff09;是用于编写OpenGL着色器程序的语言。GLSL 4.5 是 GLSL 的一个版本&#xff0c;引入了许多新的特性和改进&#xff0c;旨在提高着色器编程的灵活性和性能。GLSL 4.5 工具通常是用于编写、调试和优化 GLSL 4.5 着色器代码…

[AutoSar]BSW_Memory_Stack_006 NVM 的常用实现方式 (Per_instance/NVBlockSwComponent)

目录 关键词平台说明一、定义及说明1.1 per_instance memories&#xff08;PIM&#xff09;1.2 Service NvBlockNeeds (SN)1.3 NVBlockSwComponent1.4 NvblockDescriptor 二、NVM 的常用现方式2.1 不使用PIM 不经过RTE 访问NV block2.1.1 描述2.1.2 实现 2.2 使用PIM 且经过RTE…

js笔记(学习存档)

JS的调用方式与执行顺序 使用方式 HTML页面中的任意位置加上<script type"module"></script>标签即可。 常见使用方式有以下几种&#xff1a; 直接在<script type"module"></script>标签内写JS代码。直接引入文件&#xff1a;…

java数据结构与算法刷题-----LeetCode367. 有效的完全平方数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 自实现Math.sqrt()函数&#xff1a;牛顿迭代法 自实现Math.sqrt(…

【QT+QGIS跨平台编译】076:【libdxfrw跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libdxfrw介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、libdxfrw介绍 libdxfrw是一个用于读取和写入DXF(Drawing Exchange Format)文件的开源C++库。DXF是一种由AutoCAD开发的文件格式,用于存储CAD(计算机辅助设计)图形数据,它…

预定义详解

学习流程 ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

Sql优化篇-干货总结大全

前言 我们经常会听到Sql优化的一个概念&#xff0c;但其实sql优化不一定就是说sql语句写的有问题&#xff0c;它可能是因为cpu资源爆满&#xff0c;或者内存空间不足&#xff0c;它也会导致sql执行卡顿&#xff1b;或者说表设计层面&#xff0c;过滤条件没有加索引之类的 等等…

Java之final、常量的详细总结

final final关键字是最终的意思&#xff0c;可以修饰类、方法、变量修饰类&#xff1a;该类被称为最终类&#xff0c;特点是不能被继承 //final修饰的类&#xff0c;类不能再被继承了 final class A{} class B extends A{}//会报错 修饰方法&#xff1a;该方法被称为最终方法&…

linux学习:shell脚本

目录 要求 注意 变量 变量的定义和赋值 变量的引用 变量的种类 设置环境变量 特殊符号 引号 竖杠&#xff08;管道&#xff09; 和大于小于号&#xff08;重定向&#xff09; 字符串处理 测试语句 脚本语法 判断 循环 函数 trap 前提 要把 Shell 命令放到一…

从0到1搭建文档库——sphinx + git + read the docs

sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1&#xff09;创建基本框架&#xff08;生成index.rst &#xff1b;conf.py&#xff09; conf.py默认内容 index.rst默认内容 2&#xff09;生成页面&#xff08;Windows系统下&#xf…

windows一键休眠,一键唤醒

1.使windows睡眠不可用&#xff0c;cmd以管理员身份运行&#xff1a; powercfg.exe /hibernate off 2.桌面创建快捷键 Rundll32.exe Powrprof.dll,SetSuspendState Sleep

零信任安全模型:构建未来数字世界的安全基石

在数字化转型的浪潮中&#xff0c;云原生技术已成为推动企业创新和灵活性的关键力量&#x1f4a1;。然而&#xff0c;随着技术的进步和应用的广泛&#xff0c;网络安全威胁也日益严峻&#x1f513;&#xff0c;传统的网络安全模型已经难以应对复杂多变的网络环境。在这样的背景…