arraylist类的底层数据结构是(java数据结构 ,初学,要求用list类建立一个无序列表,内容可由文件输入,求过程!T^T)
本文目录
- java数据结构 ,初学,要求用list类建立一个无序列表,内容可由文件输入,求过程!T^T
- ArrayList属于什么数据结构
- ArrayList和LinkedList底层实现的区别
- ArrayList的添加和删除操作实现原理图解
- java 如何得到list中指定行数的数据
java数据结构 ,初学,要求用list类建立一个无序列表,内容可由文件输入,求过程!T^T
您好,提问者: ArrayList是有序的,无序的是HashSet。 如果想要List无需输入也不是不可能。 我们都知道ArrayList其实底层就是一个数组,那么Arrays类中有一个asList(数组)方法可以将其转换为List,我们可以随机存入数组,判断如果有重复则不存入,最后将其转换为ArrayList即可。
ArrayList属于什么数据结构
ArrayList属于动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素实现了ICollection和IList接口灵活的设置数组的大小
最简单的例子:ArrayList List = new ArrayList();for( int i=0;i 《10;i++ ) //给数组增加10个Int元素List.Add(i);//..程序做一些处理List.RemoveAt(5);//将第6个元素移除for( int i=0;i 《3;i++ ) //再增加3个元素List.Add(i+20);Int32)List.ToArray(typeof(Int32));//返回ArrayList包含的数组
这是一个简单的例子,虽然没有包含ArrayList所有的方法,但是可以反映出ArrayList最常用的用法
ArrayList重要的方法和属性1)构造器ArrayList提供了三个构造器:public ArrayList();默认的构造器,将会以默认(16)的大小来初始化内部的数组public ArrayList(ICollection);用一个ICollection对象来构造,并将该集合的元素添加到ArrayListpublic ArrayList(int);用指定的大小来初始化内部的数组
2)IsSynchronized属性和ArrayList.Synchronized方法IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如:ArrayList list = new ArrayList();//...lock( list.SyncRoot ) //当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性{list.Add( “Add a Item” );}
如果使用ArrayList.Synchronized方法返回的实例,那么就不用考虑线程同步的问题,这个实例本身就是线程安全的,实际上ArrayList内部实现了一个保证线程同步的内部类,ArrayList.Synchronized返回的就是这个类的实例,它里面的每个属性都是用了lock关键字来保证线程同步。
3)Count属性和Capacity属性Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。
4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange这几个方法比较类似Add方法用于添加一个元素到当前列表的末尾AddRange方法用于添加一批元素到当前列表的末尾Remove方法用于删除一个元素,通过元素本身的引用来删除RemoveAt方法用于删除一个元素,通过索引值来删除RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来删除Insert用于添加一个元素到指定位置,列表后面的元素依次往后移动InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动
另外,还有几个类似的方法:Clear方法用于清除现有所有的元素Contains方法用来查找某个对象在不在列表之中
其他的我就不一一累赘了,大家可以查看MSDN,上面讲的更仔细5)TrimSize方法这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。6)ToArray方法这个方法把ArrayList的元素Copy到一个新的数组中。
ArrayList与数组转换例1:ArrayList List = new ArrayList();List.Add(1);List.Add(2);List.Add(3);
Int32)List.ToArray(typeof(Int32));
例2:ArrayList List = new ArrayList();List.Add(1);List.Add(2);List.Add(3);
Int32;List.CopyTo(values);
上面介绍了两种从ArrayList转换到数组的方法
例3:ArrayList List = new ArrayList();List.Add( “string” );List.Add( 1 );//往数组中添加不同类型的元素
object values = List.ToArray(typeof(object)); //正确string)List.ToArray(typeof(string)); //错误
和数组不一样,因为可以转换为Object数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。
ArrayList和LinkedList底层实现的区别
ArrayList和LinkedList都实现了List接口,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删。ArrayList与LinkList两者的区别:ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况,时间复杂度是 O(n) ,而 LinkedList 中插入或删除的时间复杂度仅为 O(1) 。 ArrayList 在插入数据时还需要更新索引(除了插入数组的尾部)。3) 类似于插入数据,删除数据时, LinkedList 也优于 ArrayList 。4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置 ( 一个 LinkedList 实例存储了两个值: Node《E》 first 和 Node《E》 last 分别表示链表的其实节点和尾节点,每个 Node 实例存储了三个值: E item,Node next,Node pre) 。 什么场景下更适宜使用 LinkedList,而不用ArrayList1) 你的应用不会随机访问数据 。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。2) 你的应用更多的插入和删除元素,更少的读取数据 。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。
ArrayList的添加和删除操作实现原理图解
上一篇 《《《 Java集合类图总览 下一篇 》》》 ArrayList的动态扩容、ModCount及fail-fast原理
Arraylist数据结构: 集合底层使用动态数组实现,随机查询效率非常快,插入和删除需要移动整个数组、效率低。
相关文章链接: 《《《 Java集合类图总览 《《《 ArrayList的动态扩容、ModCount及fail-fast原理 《《《 LinkedList增删改查操作底层实现原理 《《《 数组拷贝的几种方式及和链表结构的对比 《《《 Jdk1.7HashMap源码分析 《《《 Jdk1.7HashMap如何扩容及解决死循环问题 《《《 JDK1.8HashMap源码分析 《《《 ConcurrentHashMap在JDK1.8版本比1.7改进了什么 《《《 JDK8的HashMap中红黑树左旋右旋原理图解 《《《 基于LinkedHashMap手写LRU淘汰策略 《《《 HashSet集合底层实现原理 《《《 HashTable底层实现原理及和ConcurrentHashMap区别 《《《 java集合常见面试题
java 如何得到list中指定行数的数据
|--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引, |-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步 |-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快) |-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了)List a1 = new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");a1.add("java04");获取java03就是a1.get(2);因为下标是从0开始。
更多文章:
oracle跨库关联查询(请问oracle数据库中两张表分别在两个数据库中怎么能建关联)
2024年4月17日 04:04
windows虚拟机安装教程(怎样安装windows 的虚拟机)
2024年10月23日 15:45
filezilla文件名显示乱码(文件名出现奇怪的乱码,求解决方法)
2024年7月19日 07:30
eclipse安装要求(你好,请问电脑上要安装eclipse,需要的最低配置的cpu和内存分别要多大注意,是要最低标准哦)
2024年10月9日 14:55
网络编程应用(在哪些场景需要应用网络编程 网络程序与一般的单机环境运行的程序有何不同)
2024年6月25日 08:55
kotlin教程android(android studio怎么使用kotlin)
2024年1月1日 21:00
mostpopular(the most popular是什么意思)
2024年7月14日 09:51
ip地址dhcp是什么意思(电脑网络连接DHCP是什么意思)
2024年7月8日 08:27