【源码那些事】超详细的ArrayList底层源码+经典面试题,2024年最新javaweb面试题最全

list.add(i+“a”);

}

//测试随机访问时间

long startTime = System.currentTimeMillis();

for (int i = 0; i < list.size(); i++) {

//取出集合的每一个元素

list.get(i);

}

long endTime = System.currentTimeMillis();

System.out.println(“随机访问耗时:”+(endTime-startTime));

//测试顺序访问时间

long startTime2 = System.currentTimeMillis();

Iterator it = list.iterator();

while (it.hasNext()){

it.next();

}

long endTime2 = System.currentTimeMillis();

System.out.println(“顺序访问耗时:”+(endTime2-startTime2));

}

}

随机访问耗时:3

顺序访问耗时:4

由此可见,在数据量极大的情况下,ArrayList随机访问的效率远高于顺序访问

而LinkedList的数据结构是链表,且未实现RandomAccess接口,他的效率和ArrayList相比如何呢,我们来做一个

测试

package ArrayListProject.CloneTest;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

public class Test03 {

public static void main(String[] args) {

List list1 = new LinkedList<>();

for (int i = 0; i < 100000; i++) {

list1.add(i+“a”);

}

//测试随机访问时间

long startTime = System.currentTimeMillis();

for (int i = 0; i < list1.size(); i++) {

//取出集合的每一个元素

list1.get(i);

}

long endTime = System.currentTimeMillis();

System.out.println(“随机访问耗时:”+(endTime-startTime));

//测试顺序访问时间

long startTime2 = System.currentTimeMillis();

Iterator it = list1.iterator();

while (it.hasNext()){

it.next();

}

long endTime2 = System.currentTimeMillis();

System.out.println(“顺序访问耗时:”+(endTime2-startTime2));

}

}

随机访问耗时:11676

顺序访问耗时:4

由此可见,没有实现RandomAccess接口的LinkedList集合的随机访问速度远远小于顺序访问

在这里插入图片描述

👋2 ArrayList构造方法源码解析

===================================================================================

| Constructor | Constructor描述 |

| :-: | :-: |

| ArrayList() | 构造一个初始容量为10的空列表 |

| ArrayList(int initialCapacity) | 构造具有指定初始容量的空列表 |

| ArrayList(Collection<? extends E> c) | 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序 |

👋2.1 ArrayList()构造方法

===================================================================================

/**

  • Constructs an empty list with an initial capacity of ten.

*/

//构造一个初始容量为10的数组

//DEFAULTCAPACITY_EMPTY_ELEMENTDATA:默认的空容量的数组

//elementData:集合真正存储数据的容器

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

👋2.2 ArrayList(int initialCapacity)构造方法

======================================================================================================

/**

  • Constructs an empty list with the specified initial capacity.

  • @param initialCapacity the initial capacity of the list

  • @throws IllegalArgumentException if the specified initial capacity

  •     is negative
    

*/

public ArrayList(int initialCapacity) {

if (initialCapacity > 0) {

//如果传进来的变量大于0,则初始化一个指定容量的空数组

this.elementData = new Object[initialCapacity];

} else if (initialCapacity == 0) {

//传进来的变量=0,则不去创建新的数组,直接将已创建的EMPTY_ELEMENTDATA空数组传给

//ArrayList

this.elementData = EMPTY_ELEMENTDATA;

} else {

//传进来的指定数组容量不能<0

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

}

}

👋2.3 ArrayList(Collection<? extends E> c)构造方法

============================================================================================================

/**

  • Constructs a list containing the elements of the specified

  • collection, in the order they are returned by the collection’s

  • iterator.

  • @param c the collection whose elements are to be placed into this list

  • @throws NullPointerException if the specified collection is null

*/

public ArrayList(Collection<? extends E> c) {

//将构造方法中的参数转换成数组形式,其底层是调用了System.arraycopy()

elementData = c.toArray();

//将数组的长度赋值给size

if ((size = elementData.length) != 0) {

//检查elementData是不是Object[]类型,不是的话将其转换成Object[].class类型

if (elementData.getClass() != Object[].class)

//数组的创建与拷贝

elementData = Arrays.copyOf(elementData, size, Object[].class);

} else {

//size为0,则把已创建好的空数组直接给它

this.elementData = EMPTY_ELEMENTDATA;

}

}

在这里插入图片描述

👋3 ArrayList基础方法

===============================================================================

👋3.05 ArrayList中的各个变量

=============================================

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb面试题通常涉及JavaEE规范和相关技术的问题。以下是一些常见的JavaWeb面试题及其答案: 1. 什么是Servlet规范? Servlet规范是JavaEE规范的一部分,主要定义了用于扩展Java作为Web服务的功能的接口和类。它规范了Servlet接口、Filter接口、Listener接口、ServletRequest接口、ServletResponse接口等。Servlet规范由servlet-api.jar和jsp-api.jar这两个Jar文件提供支持。 2. 什么是Servlet和JSP的区别? Servlet和JSP都是JavaWeb开发中的技术,用于处理Web请求和生成动态内容。主要区别在于Servlet是基于Java的类,用于处理请求和生成响应,而JSP是一种将Java代码嵌入HTML中的技术,用于生成动态网页。Servlet可以在代码中直接编写Java逻辑,而JSP则允许在HTML页面中嵌入Java代码。 3. JavaWeb中的三大组件是什么? JavaWeb中的三大组件是Servlet、Filter和Listener。Servlet用于处理Web请求和生成响应,Filter用于对请求和响应进行过滤和修改,Listener用于监听Web应用程序的生命周期件。这三个组件共同构成了JavaWeb应用的核心。 4. 在JSP中,有哪些无需创建就可以使用的对象? 在JSP中,无需创建就可以使用的对象有: - out对象:用于向客户端输出数据。 - request对象:封装了来自客户端的请求信息。 - response对象:封装了服务器的响应信息。 - exception对象:封装了JSP程序执行过程中的异常和错误信息。 - config对象:封装了应用程序的配置信息。 - page对象:指向了当前JSP程序本身。 - session对象:用于保存会话信息。 - application对象:代表了当前应用程序的上下文,可在不同用户之间共享信息。 - pageContext对象:提供了对JSP页面所有对象以及命名空间的访问。 希望以上内容能对你的面试准备有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java基础面试题JavaWeb专题)](https://blog.csdn.net/qq_40695336/article/details/130597300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [java面试题Web篇](https://blog.csdn.net/weixin_52489114/article/details/122982656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值