package Other;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector;
/**
* @author vincent
* @description 面试相关List
* @Date 2020-03-18 17:03
*/
public class LList {
public static void main(String[] args) {
/**
* ArrayList
*/
ArrayList<Object> arrayList = new ArrayList<>();
// 结构是数组 object[]
// 优点查找和访问速度更快 缺点新增删除慢线程不安全
// 延伸: 插入速度快但是查找速度慢的是linkedlist 线程安全的是vector
ArrayList<Object> objects = new ArrayList<>(10);
ArrayList<Object> objects2 = new ArrayList<>(10);
// 因为结构是数组,所以构造方法可以传入初始长度 默认是0
// Java经典bug 构造方法赋初始长度,只是构建了一个长度的数组,但是size还是0
// 如果此时set,会报越界错误 除非初始后就add够足够的长度
for (int i = 0; i < 10000; i++) {
objects.add(i);
objects2.add(i);
}
// objects.add(5,"5");
arrayList.add("");
// 空数组,只有第一次add操作才会赋值10的初始长度
// 数组扩容公式
// int newCapacity = oldCapacity + (oldCapacity >> 1); oldCapacity为当前数组长度 翻译:len+len/2
// 扩容方式和hashmap一样,都是新建一个数组 复制
// 10这个默认值,在Java里都是sun公司根据调研,得出的大概最有效率的一个初值
//新增删除效率问题
arrayList.add(null);// 普通新增不指定index则直接加在数组最后
// arrayList.add(5,null);
// 如果指定位置的话
// 看源代码可以看到,首先判断数组是否需要扩容,其次index+1后的所有数组进行copy,然后再把新增元素添加到index位置
// 如果数组长度够大,len-index-1的元素复制太多,效率可想而知
arrayList.remove(null); // 删除同理,先for循环对比得到index,len-index-1的元素向前复制,置len位置为null
// 新增删除就一点慢吗
// 答案是否定的,我们通过源码可以看到,arraylist主要是通过复制截取数组来实现的插入和删除,并不涉及移位,这里就考量到一个index,即操作的元素在数组中的位置
long startTime=System.nanoTime();
objects.remove(5000);
long endTime=System.nanoTime();
System.out.println("删除1000运行时间: "+(endTime - startTime)+"ms");
long endTime2=System.nanoTime();
objects2.remove(9000);
System.out.println("删除9000运行时间: "+(endTime2 - endTime)+"ms");
// 通过上面这段代码,我们能看出,index越靠近尾部,执行效率越低
//arraylist适合用来做队列吗
// 我们首先了解队列的原则应该是先入先出first in first out
// 即我们的remove要remove头,add要add尾,反过来也可以
// 我们知道arrayList的新增删除都需要复制移位,效率低,所以不适合
// 相反,数组是适合做队列的,经典的几个队列底层都是使用的定长环形队列
/**
* LinkedList
*/
LinkedList<Object> linkedList = new LinkedList<>();
// 结构链表
linkedList.add(null); // 插入因为只需要操作尾部的next即可,所以效率高
linkedList.add(1,null); // 先定位index,元素的next链接index的next,元素的pre链接index,index的next指向元素
linkedList.get(1); // 这里看源码可以看到,判断index和size/2,决定是在链表前半段查找,还是后半段查找
linkedList.indexOf(null);// indexof都是从头判断到尾
// 所有源码有modcount的都是failfast机制(快速失败),即遍历时,如果其他线程操作该元素导致该元素的modcount改变,则此次遍历会报错
/**
* 对比
*/
// arrayList因为底层结构是数组,数组是一片连续的空间,读取都很快,但是插入删除需要频繁的开辟新的数组复制
// linkedList因为底层结构是链表,链表没有扩容问题,有新数据就建一个node,改变前驱后驱即可,但是因为数据在内存中存储空间不连续,读取效率低
/**
* 线程安全的Vector
*/
Vector<Object> vector = new Vector<>();
// vector的源码其实和arrayList一模一样,只是每个方法上加了synchronized保证线程安全
}
}
相关推荐
ray.tune调参学习笔记0:调参基本流程
本篇总结python中使用tune调参的整体流程
泛型类List<Model>和 DataTable的分组统计
项目中在经常会对数据解析并做图标展示,数据获取的方式有很多(文本文件、api、数据库……),大多数情况下我们都会将数据转化为泛型类List或者DataTable两种数据类型并做处理,并绑定在UI界面做各种炫酷的展示,下面我们讲讲这泛型类List和DataTable两种数据源的数据处理吧。 ...
李宏毅机器学习hw3
Homework 3 - Convolutional Neural Network 1作业概述 在food_11文件中有三个文件分别是training、validation、testing,打开training和validation可以看见总共有11种食物(0-10的类别编号),而testing是没有类别编号的。 然后用卷积神经网络对食物图片进行分类。 2导入用到的库 torch库 这个我弄了半天,直接pip总是timeout,用镜像源下下来又出现OSError: [WinError..
Java List常见面试题
1、你知道的List都有哪些?ArrayList、LinkedList、Vector等。 2、List是有序的吗?List是有序的。3、List和Vector有什么区别?Vector是List接口下线程安全的集合。4、ArrayList和LinkedList的底层数据结构是什么?ArrayList使用的是数组结构,LinkedList使用的是链表结构。 5、ArrayList默认大小是多少,是如何...
FlowPic实战:从流量到图像的端到端加密应用识别
本文深入解析了FlowPic技术如何将网络流量转化为图像,并利用CNN模型进行端到端加密应用识别。该方法通过分析数据包大小和时序信息生成流量图像,有效绕过加密内容,实现对视频、聊天、文件传输等应用的精准分类。文章提供了从流量抓取、图像生成到轻量级CNN模型设计与训练的完整实战指南,并探讨了在VPN、Tor等复杂场景下的应用与挑战。
Abaqus梁模型仿真中的常见陷阱与优化策略
本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。
【面试】我是如何面试别人List相关知识的,深度有点长文
simulink构建一个基于 BP(反向传播)神经网络 的自适应 PID 控制系统
本文介绍了基于BP神经网络的自适应PID控制系统设计方法。系统通过神经网络实时调整PID参数,实现智能控制。主要内容包括:1)系统架构设计,采用误差反馈和在线学习机制;2)详细建模步骤,从被控对象定义到神经网络结构设计;3)S-Function实现核心算法,包含前向传播、PID计算和反向传播;4)仿真结果分析,显示神经网络PID在响应速度、超调控制和鲁棒性方面的优势;5)进阶建议和常见问题解决方案。该方法突破了传统PID的局限性,实现了具有自我学习能力的智能控制。
Java集合框架基础-----List
List: 接口,常用ArrayList实现. 起始位置为0.添加元素可以指定添加位置,删除亦是如此. *注意:考虑边界,指定位置不能超过序列的长度. List可以添加另一个List,简单的说就是合并.通常是数组转集合序列然后合并. 常见方法list.addAll();此方法同样可以指定保存位置 List中保存的内容是有序且可以重复的. 遍历常用Ite
[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能
[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能
从零到精通:BLDC电机驱动电路详解与设计思路
这套电机驱动电路从核心控制器到反馈采集模块,涉及了BLDC电机驱动的方方面面。每一个模块的设计和选择都需要综合考虑系统需求和实际使用环境。在实际应用中,很多细微的设计改进都会显著影响电机的运行性能。
List相关面试题
Java SE 八股文,List面试题
【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB
文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整
【面试】大佬是如何面试别人List相关知识的
本文公众号来源:编程新说李新杰作者:编程新说看后总结:良心面试官面试我们应该正确对待。知道的就回答,不知道的就请教,似是而非的就探讨,开开心心的度过一个小时的交谈就行了...
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
我是如何面试别人List相关知识的
作者 | 李新杰 来源 | 编程新说 微信公众号 先来点鸡汤 前几年易中天可谓非常的火,接受过很多采访。他的情况比较特殊,在武汉读高中时期,恰逢“知识青年上山下乡”活动,就到新疆去了。 在新疆生产建设兵团工作、生活了10年,而后在乌鲁木齐钢铁公司子弟中学任教。77年全国恢复高考后他没有去考大学,78年国家恢复研究生招生后他去考了,然后被武汉大学中文系录取。 当时主持人问他,为什么...
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
算法复杂度分析、List相关面试题、HashMap
**双向链表**:每个结点有后继指针next和前驱指针prev,支持双向遍历,查询头尾结点的时间复杂度是O(1),平均查询时间复杂度是O(n),给定节点找前驱节点的时间复杂度为O(1),增删头尾结点的时间复杂度为O(1),其他部分结点增删的时间复杂度是O(n),给定节点增删的时间复杂度为O(1)。- **单向链表**:每个结点包括数据域和指针域,支持查询(头节点时间复杂度为O(1),其他结点为O(n))、插入和删除(头节点时间复杂度为O(1),其他结点为O(n))操作。
锂电池充电器电路设计 里面有电路
锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。
大佬是如何面试别人List相关知识的
说面试时他内心非常紧张,但面试官总是面带微笑很温和地跟他说话。遇到不懂的地方,总是非常有耐心地给他讲解,旁征博引,举一反三。最后他都听懂了,而且也不紧张了。 我感觉这是我收到的对我最高的评价,不是吗?...
是如何面试别人List相关知识的
参考:https://mp.weixin.qq.com/s/5AitRt2gErclGC_VHf0Uxw
List和map相关的面试题
1.Collection 与 Map 简介: Collection 每个位置只有一个元素,旗下分为两个门派:List和Set –List:ArrayList,LinkedList,Vector –Set:HashSet / TreeSet Collection、List、Set都是接口,不能实例化。 继承自它们的 ArrayList, Vector是具象class,这些才可被实例化。 Map(ke...
Java 集合List相关面试题
数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。我们定义了这么一个数组之后,在内存的表示是这样的:现在假如,我们通过arrar[1],想要获得下标为1这个元素,但是现在栈内存中指向的堆内存数组的首地址,它是如何获取下标为1这个数据的?
面试相关list
1、纯函数? 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。 数组排序比较 看以下数组,在各种排序操作后都下输出什么? const arr1 = [‘a’, ‘b’, ‘c’]; const arr2 = [‘b’, ‘c’, ‘a’]; console.log( arr1.sort() === arr1, arr2.sort() == arr2, arr1.sort() === arr2.sort() ); 答案和解析 答案:
2622



被折叠的 条评论
为什么被折叠?



