arraylist

Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比【文末福利】

痞子三分冷 提交于 2020-02-01 09:25:05
ArrayList线程安全问题 众所周知, ArrayList 不是线程安全的,在并发场景使用 ArrayList 可能会导致add内容为null,迭代时并发修改list内容抛 ConcurrentModificationException 异常等问题。java类库里面提供了以下三个轮子可以实现线程安全的List,它们是 Vector Collections.synchronizedList CopyOnWriteArrayList 本文简要的分析了下它们线程安全的实现机制并对它们的读,写,迭代性能进行了对比。 Vector 从JDK1.0开始, Vector 便存在JDK中, Vector 是一个线程安全的列表,底层采用数组实现。其线程安全的实现方式非常粗暴: Vector 大部分方法和 ArrayList 都是相同的,只是加上了 synchronized 关键字,这种方式严重影响效率,因此,不再推荐使用 Vector 了。JAVA官方文档中这样描述: If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of Vector. 如果不需要线程安全性,推荐使用ArrayList替代Vector 关键源码如下: public synchronized

CopyOnWriteArrayList详解

人盡茶涼 提交于 2020-02-01 05:27:45
今天在项目中发现有人使用了CopyOnWriteArrayList,但是不明白这个类跟ArrayList有什么区别,于是搜索相关的内容学习一下:   CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add,set等)都是通过底层数组的进行一次新的复制产生的。 这一般需要很大的开销,但是当遍历操作的数量大大打的超过可变操作的数量时,这种方式更有效。在不能或者不想同步遍历的时候,但又要从并发线程中排出冲突的时候,他很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出ConCurrentModificationException.创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行元素的更改(remove,set和add)不受支持。这些方法将抛出UnsupportOpreationException。允许使用所有元素包括null.   内存一致性效果:当存在其他并发Collection的时候,讲对象放入CopyOnWriteArrayList之前的线程中的操作happen-before,随后通过另一线程从CopyOnWriteArayList中访问或移除该元素的操作。 这种情况一般出现在多线程操作时

Java总结05 Java集合体系.最高集合接口Collection和其迭代器/一般集合接口List和其迭代器/增强版For循环的应用

谁说我不能喝 提交于 2020-02-01 03:36:06
Collection - 集合 Iterator - 迭代器 Revise — 修改(rɪˈvaɪz) ** 1. 一/Collection集合的创建与应用 Collection本身是个接口,那么如果要把它以集合形式去应用,那么就需要用到多态.而子类则必须是个集合实现类,比如ArrayList. 格式: Collection<E泛型> 多态集合对象自定义名 = new ArrayList<E>(); 如: Collection<String> collectionListObj = new ArrayList<String>(); 常用方法: 1/对象名.add(); 添加元素 2/对象名.remove(); 删除指定元素,因为没有索引值,所以如果存在多个相同元素,则删除最靠前的. 3/对象名.isEmpty(); 判断集合中的元素是否全部为空内容元素,如果是则True,不是则False 4/对象名.contains(); 判断指定元素是否存在集合中 5/对象名.clear(); 清空所有元素(即将所有元素内容清空) 6/对象名.size(); 取集合长度 public static void main ( String [ ] args ) { Collection < String > collectionListObj = new ArrayList < String > (

C#中把List转换为DataTable的方法

此生再无相见时 提交于 2020-02-01 03:12:13
private static DataTable ToDataTable<T>(IEnumerable<T> collection) { var props = typeof(T).GetProperties(); var dt = new DataTable(); dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray()); if (collection.Count() > 0) { for (int i = 0; i < collection.Count(); i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in props) { object obj = pi.GetValue(collection.ElementAt(i), null); tempList.Add(obj); } object[] array = tempList.ToArray(); dt.LoadDataRow(array, true); } } return dt; } 来源: CSDN 作者: 知或谓之慧 链接: https://blog.csdn.net/destiny_98/article

Java----泛型

元气小坏坏 提交于 2020-02-01 03:11:25
##泛型 1、泛型定义及好处 Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常. 泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型 /*创建集合,使用泛型* 好处:1、避免了类型转换的麻烦,存储什么类型,取出什么类型* 2、把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)** 弊端:泛型是什么类型,就只能存储什么类型的数据** */泛型好处与坏处代码示例: package Collection.FanXing.demo01; import java.util.ArrayList; import java.util.Iterator; public class Demo01Generic { public static void main(String[] args) { demo02(); } /*创建集合,使用泛型 * 好处:1、避免了类型转换的麻烦,存储什么类型,取出什么类型 * 2、把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错) * * 弊端:泛型是什么类型,就只能存储什么类型的数据 * * */ private static void demo02() { ArrayList<String> list = new

java.util.ConcurrentModificationException异常详解

故事扮演 提交于 2020-02-01 01:48:59
环境:JDK 1.8.0_111 在Java开发过程中,使用iterator或for遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常,一般抛出异常的场景分为两类,一是单线程场景,二是多线程场景,尤其是第二个场景不容易察觉,不幸的是小编就中招了。 一、单线程情况下问题分析及解决方案 1.1 问题复现 先上一段抛异常的代码。 iterator方式: import java.util.ArrayList ; import java.util.Iterator ; public class ExceptionTest1 { public void test ( ) { ArrayList < Integer > arrayList = new ArrayList < Integer > ( ) ; for ( int i = 0 ; i < 20 ; i++ ) { arrayList.add ( Integer.valueOf ( i )) ; } Iterator < Integer > iterator = arrayList.iterator ( ) ; while ( iterator.hasNext ( )) { Integer integer =

剑指Offer对答如流系列 - 和为s的数字

情到浓时终转凉″ 提交于 2020-01-31 22:30:29
面试题57:和为s的数字 题目描述 问题(1)和为s的两个数字 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 问题(2)为s的连续正数序列 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。 问题分析 问题(1) 考虑到数列递增,我们设置两个头尾两个索引i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 由于是从两边往中间移动,所以不会有跳过的情况,时间复杂度为O(n)。 问题(2) 顺着问题(1)的思路来就是 当从i到j的序列的和小于sum时,增加j,使序列包含更多数字;(记得更新序列之和) 当从i到j的序列的和大于sum时,减少i,使序列去掉较小的数字;(记得更新序列之和) 当从i到j的序列的和等于sum时,此时得到一个满足题目要求的序列,输出,然后继续将i增大,往后面找新的序列。 序列要求最少两个数字,因此,当i到了sum/2时,就可以结束了。

java 快速失败(fail—fast)和 安全失败(fail—safe)

落爺英雄遲暮 提交于 2020-01-31 22:02:38
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程(迭代器迭代)中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent ModificationException(这个异常只建议用于检测并发修改的bug)。 场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。 用ArrayList来解释 (AbstractList是ArrayList父类) 大部分博客是解释modCount != expectedModCount 这里我需要特别强调这两个属性并不是位于同一个类而是 java . util . AbstractList#modCount! = java . util . AbstractList . Itr#expectedModCount 当我们对ArrayList对象进行数据修改操作的时候将会触发java . util . AbstractList#modCount 加 1 , 当我们使用迭代器遍历ArrayList对象的时候,会新建一个迭代器对象(java . util . AbstractList . Itr) 同时初始化java . util . AbstractList . Itr#expectedModCount为java . util . AbstractList

集合知识汇总

。_饼干妹妹 提交于 2020-01-31 11:03:42
实际开发中,经常用到的 ArrayList、LinkedList、HashMap、LinkedHashMap 等集合类,其实涵盖了很多数据结构和算法,每个类可以说都是精华,今天和大家一起来梳理一下! 一、摘要 在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。 Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set 代表无序、不可重复的集合;Java 5 又增加了 Queue 体系集合,代表队列集合。 Map:则代表具有映射关系的键值对集合。 很多书籍将 List、Set、Queue、Map 等能存放元素的接口体系,也归纳为容器,因为他们可以存放元素! 集合和容器,这两者只是在概念上定义不同,比如ArrayList是一个存放数组的对象,真正用起来并不会去关心这个东西到底是集合还是容器,把东西用好才是关键! java.util.Collection下的接口和继承类关系简易结构图: https://imgconvert.csdnimg.cn

ArrayList自带排序用法

纵饮孤独 提交于 2020-01-31 10:57:27
ArrayList自带排序用法 如果是字符串排序 List array= new ArrayList<>(); array.sort(new Comparator(){ @Override public int compare(String arg0, String arg1){ return arg0.compareTo(arg1); } }); 这里主要是重写的compare方法,如果是实体类,我们需要根据里面的属性进行比较排序,这个方法无非就是我们是用什么排序规则 来源: CSDN 作者: weixin_42452839 链接: https://blog.csdn.net/weixin_42452839/article/details/104121275