ArrayList和LinkedList

最近在刷回溯算法时,遇见了List<Integer> A = new ArrayList<>();

LinkedList<Integer> B = new LinkedList<>();这类型的表达方式

很好奇的问题是:

1、List<Integer> A = new ArrayList<>();为什么是正确的写法

2、List<Integer> A = new List<>();为什么是错误的写法

3、LinkedList<Integer> B = new LinkedList<>();为什么改成List<Integer> B = new LinkedList<>();就无法使用removeLast()方法了?

第一个和第二个问题可以一起回答:

首先我们从ArrayList的定义来看,ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口

(List是一个接口,不能实例化,因此List<Integer> A = new List<>();是错误的写法)

下图出自菜鸟教程runoob

其实在项目设计时,也有这类问题。例如service层会使用

Service service = new ServiceImpl();

在Service层我们定义了一些方法,然后在ServiceImpl中重写

这样的作用是什么呢?如果我需要使用一个新的 NewServiceImpl(),我只需要换成对应的实现类即可。这也就是多态性的由来,这种方式的好处是:

1.提高了代码的可维护性

2.提高了代码的扩展性

因为一个接口有多个实现类的话,就相当于将方法声明和方法实现解耦,方便维护代码

并且复用了接口,提高了代码的扩展性。

所以 List<Integer> A = new ArrayList<>();也就是实例化了一个ArrayList对象后把上溯到了List。此时它是一个List对象了,但是有些ArrayList独有的属性和方法,它就不能再用了。

并且顺带一提的是,ArrayList list=new ArrayList();这句话意思是创建一个ArrayList对象,它保留了其所有属性。

那么LinkedList<Integer> B = new LinkedList<>();为什么改成List<Integer> B = new LinkedList<>();就无法使用removeLast()方法了?

因为removeLast()方法是属于LinkedList类中的方法,前者的表达保留了所有方法,而后者其实本质上是List对象,没办法使用LinkedList类的独有方法。

那么我们会发现一个问题,我为什么要定义List<Integer> A = new ArrayList<>();??那不是意味着ArrayList()独有的方法没法调用,那么他上溯到List的意义是什么呢?

其实大多数时候ArrayList()独有的方法我们是用不到的,并且这样的写法也很好的解释了面向接口编程,除非要使用ArrayList()独有的方法,我们才会使用ArrayList list=new ArrayList()。

相关推荐
蛋蛋的就会顺顺的4 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡4 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_7 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs7 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲7 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261688 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail8 小时前
05 管理活动与选品
java