实现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; // …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...