实现List接口的ArrayList和LinkedList
package study;import java.util.*;public class day01_list {public static void main(String[] args) {// <Integer> 这个尖括号表示的是 Java 的泛型(Generics)// 泛型是 Java 5 引入的一项特性,它允许你在 类、接口和方法 中使用类型参数,从而使代码更具通用性和类型安全性// List 是一个接口,代表一个有序的集合,其中可以包含重复的元素// <Integer> 是泛型参数,指定这个列表只能存储Integer类型的对象/*ArrayList是List接口的一个具体实现类,使用动态数组来存储元素不能使用new List<>(),因为List是一个接口,不能直接实例化,接口只是定义了一组方法,没有具体实现必须实例化一个 List 接口的实现类,比如 ArrayList、LinkedList钻石操作符 <> 是 Java 7 引入的一个简化语法,用于推断泛型参数类型。在右边使用 new ArrayList<>() 时,编译器会自动推断出这个 ArrayList 的类型参数是 Integer,因为左边明确指定了 List<Integer>*//*List 是一个接口,而 ArrayList 是这个接口的一个具体实现类。在编写代码时,使用接口类型来声明变量,而用具体的实现类来实例化对象,这是面向对象编程中的一种最佳实践,称为“接口和实现分离”。多态性:通过使用接口类型,你可以利用多态性来处理对象。例如,你可以编写一个方法,它接收 List 类型的参数,这样这个方法就可以处理任何 List 的实现类(如 ArrayList、LinkedList、Vector 等)public void processList(List<Integer> list) {for (Integer number : list) {System.out.println(number);}}虽然 List 是一个接口,但在 Java 中,接口类型的变量可以引用任何实现这个接口的对象。这是因为接口定义了一组方法,而实现类提供了这些方法的具体实现。*/// 多态性List<Integer> arrayList = new ArrayList<>();List<Integer> linkedList = new LinkedList<>();processList(arrayList);processList(linkedList);/*使用接口类型声明变量的限制当你使用接口类型(例如 List)声明一个变量时,你只能调用接口中定义的方法然而,如果你需要调用实现类特有的方法,例如 ArrayList 的 ensureCapacity 方法,你就不能直接通过 List 类型的引用来调用。以下代码是非法的:*/List<Integer> list = new ArrayList<>();list.add(1);list.add(2);System.out.println(list.size()); // 这行代码是合法的,因为 add 和 size 是 List 接口中的方法// list.ensureCapacity(100); // 编译错误,因为 List 接口中没有 ensureCapacity 方法}public static void processList(List<Integer> list) {for (Integer number : list) {System.out.println(number);}}
}interface Animal {void eat();
}interface jiekou {void t();
}// 一个类只能继承一个父类(单继承),但可以实现多个接口(多实现)
// 一个接口可以继承多个其他接口(多继承)
interface Dog extends Animal, jiekou {}class ArrayList_use {/*Iterable<E> (接口)↑Collection<E> (接口) - 继承自 Iterable<E>↑List<E> (接口) - 继承自 Collection<E>↑AbstractCollection<E> (抽象类) - 部分实现 Collection<E>↑AbstractList<E> (抽象类) - 继承自 AbstractCollection 部分实现 List<E>↑ArrayList<E> (类) - 继承自 AbstractList<E> 并实现 List<E> 和 Collection<E>ArrayList 类除了实现 List 接口的方法外,还提供了一些独有的方法。这些方法在 List<> list 中无法直接使用:clone(): ...trimToSize(): 调整 ArrayList 的容量大小,使其等于当前列表的大小,减少内存使用。ensureCapacity(int minCapacity): 增加 ArrayList 的容量,确保它至少可以容纳指定数量的元素。*/// 数组可以包含基本数据类型和引用类型,ArrayList只能包含引用类型// 数组的大小在定义后不可以调整大小。ArrayList是基于动态数组实现的,可以通过内部扩容自动调整容量public static void main(String[] args) {// 三种构造方法List<Integer> list0 = new ArrayList<>(); // 构造一个初始容量为 10 的空列表list0.add(1);System.out.println(list0.size());List<Integer> list1 = new ArrayList<>(0); // 直接指定初始大小list1.add(1);System.out.println(list1.size());List<Integer> existingList = Arrays.asList(1, 2, 3); // 返回一个ArrayList对象List<Integer> list2 = new ArrayList<>(existingList); // 使用现成的list来构建System.out.println(list2.size());Set<Integer> existingSet = new HashSet<>(Arrays.asList(1, 2, 3, 4));List<Integer> list3 = new ArrayList<>(existingSet); // 使用现成的set来构建System.out.println(list3.size());// 尾插数据时速度是o(1)// 非尾插数据,会涉及元素的移动,在添加元素时会涉及到扩容的问题。// 超出初始长度时,会创建新的数组,将原数组数据赋值到新数组中。扩容:原来数组的大小+原来数组的一半(1.5倍)// ArrayList 是线程不安全的:// 线程不安全表示当多个线程同时访问一个对象时,如果没有适当的同步机制,可能会导致数据不一致或其他错误。// 在 ArrayList 中,多个线程同时修改列表可能会导致未定义的行为,包括但不限于数据丢失、重复或异常// 1. addList<String> list4 = new ArrayList<>(Arrays.asList("A", "B", "C"));list4.add("D");System.out.println(list4);list4.add(1, "X");System.out.println(list4);// 2. addAllList<String> temp = Arrays.asList("A", "B", "C");list4.addAll(temp);System.out.println(list4);list4.addAll(1, temp);System.out.println(list4);// 3. forEachlist4.forEach(System.out::println);// 4. clearlist4.clear();System.out.println(list4);// 5. clone// clone() 方法是 ArrayList 类特有的方法,而不是 List 接口的方法。// 因此,如果你需要克隆一个 ArrayList,你需要确保你的变量类型是 ArrayList 而不是 List。ArrayList<String> existingListTempClone = new ArrayList<>(Arrays.asList("A", "C"));ArrayList<String> clonedArrayList = (ArrayList<String>) existingListTempClone.clone();List<String> cloneList = (List<String>) existingListTempClone.clone();// 修改克隆list的对象看看会不会对原来造成影响// 6. setcloneList.set(0, "xiugai");// 7. getSystem.out.println(cloneList.get(0));System.out.println(existingListTempClone.get(0));// 8.containsSystem.out.println(cloneList.contains("xiugai"));// 9. containsAllList<String> containsList0 = new ArrayList<>(Arrays.asList("xiugai", "C"));List<String> containsList1 = new ArrayList<>(Arrays.asList("xiugai", "X"));System.out.println(cloneList.containsAll(containsList0));System.out.println(cloneList.containsAll(containsList1));// 10. indexOfList<Integer> indexOfList = new ArrayList<>(Arrays.asList(1, 2, 3));System.out.println(indexOfList.indexOf(2));// 11. removeAllList<Integer> removeList = new ArrayList<>(Arrays.asList(2, 3, 2));indexOfList.removeAll(removeList);// 12. removeList<Integer> removeList1 = new ArrayList<>(Arrays.asList(1, 2, 3));removeList1.remove(0);removeList1.remove(Integer.valueOf(2)); // Integer.valueOf(2) 将整数 2 包装为 Integer 对象System.out.println(removeList1);// 13. size// 14. isEmpty// 15. subList// 16. toArray// 17. toString// 18. lastIndexOfList<Double> doubleList = new ArrayList<>(Arrays.asList(1.0, 5.0, 2.0, 2.0));System.out.println(doubleList.size());System.out.println(doubleList.isEmpty());System.out.println(doubleList.subList(1, 2));System.out.println(doubleList.toArray()[2]);System.out.println(doubleList.toString());System.out.println(doubleList.lastIndexOf(Double.valueOf(2.0)));}
}class LinkedList_use {/*Iterable<E> (接口)↑Collection<E> (接口) - 继承自 Iterable<E>↑List<E> (接口) - 继承自 Collection<E>↑AbstractCollection<E> (抽象类) - 部分实现 Collection<E>↑AbstractList<E> (抽象类) - 继承自 AbstractCollection 部分实现 List<E>↑AbstractSequentialList<E> (抽象类) - 继承自 AbstractList<E>↑LinkedList<E> (类) - 继承自 AbstractSequentialList<E> 并实现 List<E>, Deque<E>, Queue<E>, Collection<E>Iterable<E> (接口)↑Collection<E> (接口) - 继承自 Iterable<E>↑Queue<E> (接口) - 继承自 Collection<E>↑Deque<E> (接口) - 继承自 Queue<E> Double Ended QueueLinkedList 类除了实现 List 接口的方法外,还实现了 Deque 接口,因此提供了一些双端队列(Deque)和队列(Queue)的特有方法。这些方法在 List<> list 中无法直接使用:void addFirst(E e)void addLast(E e)boolean offerFirst(E e) // 头部插入元素,返回是否成功,成功为 true,失败为 falseboolean offerLast(E e)E removeFirst()E removeLast()E pollFirst() // 检索并删除此列表的第一个元素,如果此列表为空则返回nullE pollLast()E getFirst()E getLast()E peekFirst() // 返回头部元素,不删除E peekLast()LinkedList也是多线程环境下不安全*/LinkedList<Integer> list = new LinkedList<>();}/*** ArrayList和LinkedList** 数据结构* ArrayList底层是动态数组,在空间中是一段连续的内存* LinkedList底层是链表,内存不连续,对内存要求低。** 空间利用:* ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间* LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间** 尾插数据:对ArrayList和LinkedList而言,在列表末尾增加一个元素时间复杂度都是 o(1)。* 对ArrayList来说,尾插速度非常快,但是会涉及到一个扩容的问题,会进行大量的复制操作。* 而对LinkedList而言,使用了链表结构,不需要维护大小,但是他每次添加需要新建entry对象,进行赋值操作。* 总得来说如果不涉及到扩容的问题,ArrayList的尾插会更快一些。** 非尾插:* 在ArrayList的中间插入或删除一个元素会导致列表中剩余的元素都会被移动,因此效率较低,插入位置越靠前,需要复制调整的元素也越多,效率也就越慢。* LinkedList的非尾插,首先要通过循环找到需要插入的位置。如果此位置处于前半段,则从前往后找;若其位置处于后半段,则从后往前找。所以在靠前和靠后的位置插入非常高效,但是在拥有大量元素的情况下,在链表的中间插入元素效率很低。(首尾复杂度为o(1),其余为o(n),整体来说还是o(n))** 当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会有更好的性能。* 当操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。*/
class TestArrayListAndLinkedList {public static void main(String[] args) {List<String> arraylist = new ArrayList<>();int listSize = 100;for(int i=0; i<listSize; i++){arraylist.add("初始数据");}System.out.println("ArrayList插数据用时:" + insert(arraylist));List<String> linkedList = new LinkedList<>();for(int i=0; i<listSize; i++){linkedList.add("初始数据");}System.out.println("LinkedList插数据用时:" + insert(linkedList));}// index=10插入:// ArrayList数据用时:3// LinkedList数据用时:0// list.size()/2插入// ArrayList插数据用时:4// LinkedList插数据用时:1// list.size()-10// ArrayList插数据用时:4// LinkedList插数据用时:2// 尾插:// ArrayList插数据用时:3//LinkedList插数据用时:0//插入数据,分别在头部、中间、尾部(四种插入位置:10、list.size()/2、list.size()-10、尾插)public static Long insert(List<String> list){long startTime = System.currentTimeMillis();int insertNum = 500;for (int i=0; i<insertNum; i++){list.add(10,"数据"+i); // 中间靠前部分插入
// list.add(list.size()/2,"数据"+i); //中间插入
// list.add(list.size()/2+10,"数据"+i); //中间靠后插入
// list.add("数据"+i); // 尾插}long endTime = System.currentTimeMillis();return endTime-startTime;}}
接口和抽象类是 Java 编程语言中用于实现抽象的两种主要机制。它们允许你定义类的骨架和行为规范,而不提供具体的实现。
接口(Interface)
概述
接口是一个完全抽象的类,它只包含方法的声明(没有方法体)和常量。接口用于定义一组方法,这些方法必须由实现接口的类提供具体的实现。
特点
- 完全抽象:接口中的方法默认是 public 和 abstract,不能有方法体(直到 Java 8 引入默认方法和静态方法)。
- 多重继承:一个类可以实现多个接口,打破了 Java 单继承的限制。
- 变量:接口中的变量默认是 public、static 和 final。
- 默认方法和静态方法:从 Java 8 开始,接口可以包含默认方法(有方法体)和静态方法。
- 私有方法:从 Java 9 开始,接口可以包含私有方法,这些方法只能在接口中调用。
示例
public interface Animal {void eat(); // 抽象方法,默认是 public abstractvoid sleep();// 默认方法default void breathe() {System.out.println("Breathing...");log("breathe");}// 静态方法static void info() {System.out.println("Animal Interface");logStatic("info");}// 私有方法private void log(String activity) {System.out.println("Logging activity: " + activity);}// 私有静态方法private static void logStatic(String activity) {System.out.println("Logging static activity: " + activity);}
}
抽象类(Abstract Class)
抽象类在 Java 中是用于定义类的骨架的类,包含具体方法(有方法体)和抽象方法(没有方法体)。抽象类不能被实例化,必须被子类继承,并且,如果子类不是抽象类,那么子类必须实现所有抽象方法。
- 抽象方法和具体方法:抽象类可以包含抽象方法和具体方法。抽象方法没有方法体,具体方法有方法体。子类必须实现抽象方法,或者自身也声明为抽象类。
- 成员变量:抽象类可以包含成员变量,可以使用各种访问修饰符(public、protected、private)。
- 构造方法:抽象类可以有构造方法,但不能用来创建对象实例。构造方法通常用于初始化类的成员变量。
- 继承:一个类只能继承一个抽象类(单继承),但抽象类可以被多个类继承。
- 实现接口:抽象类可以实现接口,并且不需要实现接口中的所有方法。子类可以选择实现剩余的方法。
public abstract class Animal {private String name; // 成员变量// 构造方法public Animal(String name) {this.name = name;}// 抽象方法public abstract void eat();public abstract void sleep();// 具体方法public void breathe() {System.out.println(name + " is Breathing...");}// 获取名称的方法public String getName() {return name;}
}
相关文章:

实现List接口的ArrayList和LinkedList
package study;import java.util.*;public class day01_list {public static void main(String[] args) {// <Integer> 这个尖括号表示的是 Java 的泛型(Generics)// 泛型是 Java 5 引入的一项特性,它允许你在 类、接口和方法 中使用类…...

下拉选择输入框(基于elment-ui)
最近在需求中,需要有一个下拉选择功能,又得可以输入,在 element-ui 官网找了,发现没有适合的,然后在修炼 cv 大法的我,也在网上看了一下,但是也都感觉不合适,所以就自己写了两个&…...

CPP入门:日期类的构建
目录 1.日期类的成员 2.日期类的成员函数 2.1构造和析构函数 2.2检查日期合法 2.3日期的打印 2.4操作符重载 2.4.1小于号 2.4.2等于号 2.4.3小于等于号 2.4.4大于号 2.4.5大于等于号 2.4.6不等号 2.4.7加等的实现 2.4.8加的实现 2.4.9减去一个天数的减等实现 2.4.10…...

springboot学习,如何用redission实现分布式锁
目录 一、springboot框架介绍二、redission是什么三、什么是分布式锁四、如何用redission实现分布式锁 一、springboot框架介绍 Spring Boot是一个开源的Java框架,由Pivotal团队(现为VMware的一部分)于2013年推出。它旨在简化Spring应用程序…...

【MySQL】如果表被锁可以尝试看一下事务
今天在MySQL中删除表的时候,发现无法删除,一执行drop,navicat就卡死。 通过 SHOW PROCESSLIST显示被锁了 kill掉被锁的进程后依旧被锁 最后发现是由于存在为执行完的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; kill掉这些事务以…...

Datawhale - 角色要素提取竞赛
文章目录 赛题要求一、赛事背景二、赛事任务三、评审规则1.平台说明2.数据说明3.评估指标4.评测及排行 四、作品提交要求五、 运行BaselineStep1:下载相关库Step2:配置导入Step3:模型测试Step4:数据读取Step5:Prompt设…...

【Sql-驯化】sql中对时间的处理方法技巧总结
【Sql-驯化】sql中对时间的处理方法技巧总结 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注:微信公众…...

TFD那智机器人仿真离线程序文本转换为现场机器人程序
TFD式样那智机器人离线程序通过Process Simulation、DELMIA等仿真软件为载体给机器人出离线,下载下来的文本程序,现场机器人一般是无法导入及识别出来的。那么就需要TFD on Desk TFD控制器来进行转换,才能导入现场机器人读取程序。 导入的文…...

贪心+后缀和,CF 1903C - Theofanis‘ Nightmare
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1903C - Theofanis Nightmare 二、解题报告 1、思路分析 我们任意一种分组其实都是若干个后缀和相加 比如我们分成了三组,第一组的数被加了一次,第二组的数被加了两次,第…...

10分钟完成微信JSAPI支付对接过程-JAVA后端接口
引入架包 <dependency><groupId>com.github.javen205</groupId><artifactId>IJPay-WxPay</artifactId><version>${ijapy.version}</version></dependency>配置类 package com.joolun.web.config;import org.springframework.b…...

如何寻找一个领域的顶级会议,并且判断这个会议的影响力?
如何寻找一个领域的顶级会议,并且判断这个会议的影响力? 会议之眼 快讯 很多同学都在问:学术会议不是期刊,即使被SCI检索,也无法查询影响因子。那么如何知道各个领域的顶级会议,并对各个会议有初步了解呢…...

真的假不了,假的真不了
大家好,我是瑶琴呀,拥有一头黑长直秀发的女程序员。 最近,17岁的中专生姜萍参加阿里巴巴 2024 年的全球数学竞赛,取得了 12 名的好成绩,一时间在网上沸腾不止。 从最开始的“数学天才”,到被质疑ÿ…...

看完这篇文章你就知道什么是未来软件开发的方向了!即生成式AI在软件开发领域的革新=CodeFlying
从最早的UGC(用户生成内容)到PGC(专业生成内容)再到AIGC(人工智能生成内容)体现了web1.0→web2.0→web3.0的发展历程。 毫无疑问UGC已经成为了当前拥有群体数量最大的内容生产方式。 同时随着人工智能技术…...

HTML5五十六个民族网站模板源码
文章目录 1.设计来源高山族1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 中国民族界面演示1.5 关于高山族界面演示1.6 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.ne…...

Linux_fileio实现copy文件
参考韦东山老师教程:https://www.bilibili.com/video/BV1kk4y117Tu?p12 目录 1. 通过read方式copy文件2. 通过mmap映射方式copy文件 1. 通过read方式copy文件 copy文件代码: #include <sys/types.h> #include <sys/stat.h> #include <…...

【JavaEE精炼宝库】多线程进阶(2)synchronized原理、JUC类——深度理解多线程编程
一、synchronized 原理 1.1 基本特点: 结合上面的锁策略,我们就可以总结出,synchronized 具有以下特性(只考虑 JDK 1.8): 开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁。 开始是轻量级锁实现ÿ…...

【Linux进程通信】使用匿名管道制作一个简单的进程池
进程池是什么呢?我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继…...

Django 多对多关系
多对多关系作用 Django 中,多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说,多对多关系允许一个模型的实例与另一个模型的多个实例相关联,反之亦然。这在很多实际应用场景中非常有用,比如: 博…...

构建 Audio Unit 应用程序
构建 Audio Unit 应用程序 构建 Audio Unit 应用程序从选择设计模式开始I/O Pass ThroughI/O Without a Render Callback FunctionI/O with a Render Callback FunctionOutput-Only with a Render Callback Function其他设计模式 构建应用程序配置 audio session指定 audio uni…...

JavaScript 实用技巧
1. 使用 const 和 let 替代 var 在 ES6 之前,我们通常使用 var 声明变量。但如今,推荐使用 const 和 let,因为它们具有块级作用域,可以避免很多潜在的问题。 const PI 3.14; // 常量,无法重新赋值 let age 25; // …...

Python协作运动机器人刚体力学解耦模型
🎯要点 🎯腿式或固定式机器人模型 | 🎯网格、点云和体素网格碰撞检测 | 🎯正反向运动学和动力学 | 🎯机器人刚体力学计算 | 🎯编辑参考系姿势和路径 | 🎯软件接口实体机器人模拟 | Ἲ…...

可重入锁思想,设计MQ迁移方案
如果你的MQ消息要从Kafka切换到RocketMQ且不停机,怎么做?在让这个MQ消息调用第三方发奖接口,但无幂等字段又怎么处理?今天小傅哥就给大家分享一个关于MQ消息在这样的场景中的处理手段。 这是一种比较特例的场景,需要保…...

Redis安装与使用
目录 1、介绍 1、redis的特点: 2、缓存 2、安装Redis 1、安装单机版redis 2、redis-cli命令参数 3、清空数据库的两种方式和作用域: 4、redis的增删查改命令 5、redis的查看所有分类命令 6、redis过期时间与控制键的行为 7、redis的相关工具 1、介绍 r…...

base64字符串空格问题
客户端使用的Content-Type为application/x-www-form-urlencoded时,字符串中出现了空格,base64解码时出错了,因为原来的字符有号, Spring Boot 对于Content-Type为application/x-www-form-urlencoded的HTTP请求,默认情…...

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)
💌 所属专栏:【BES2500x系列】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! Ὁ…...

电信NR零流量小区处理
【摘要】随着目前网络建设逐步完善,5G用户的不断发展,针对零流量小区的分析及处理存在着必要性,零流量小区的出现既是用户分布及行为的直观体现,也是发展用户的一个指引,同时也能发现设备的一些故障。一个站点的能够带…...

ArcTs布局入门03——层叠布局(Stack)
如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧! 扫描下面的二维码关注公众号。 1、概述 叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实…...

C语言之线程的学习
线程属于某一个进程 共同点:都能并发 线程共享变量,进程不共享。 多线程任务中,其中某一个线程调用了exit了,其他线程会跟着一起退出 如果是特定的线程就调用pthread_exit 失败返回的是错误号 下面也是...

HT8691 内置升压模块的D类音频功率放大器芯片IC
一般描述 HT8691是一款内置升压模块的D类音频功率放大器。内置的升压模块可通过外置电阻调节升压值,即使是锂电池供电,在升压至6.5V时,10%THDN,4Ω负载条件下能连续输出5.5W功率;升压至7V,3Ω负载条件下则能连续输出7.0W功率。其支持外部设置…...

和小红书一起参会! 了解大模型与大数据融合的技术趋势
在过去的两年中,“大模型”无疑成为互联网行业的焦点话题,曾经炙手可热的大数据架构似乎淡出公众视野。然而,大数据领域并未停滞不前,反而快速演进,传统依赖众多开源组件的大数据平台正逐步过渡到以融合与简化为核心特…...