不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。 为什么要用immutable对象?...所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis) 可以被使用为一个常量,并且期望在未来也是保持不变的 immutable对象可以很自然地用作常量,因为它们天生就是不可变的对于immutable...微软.NET团队已经正式发布了不可变集合,可以通过Nuget添加,包括了下面的不可变集合: System.Collections.Immutable.ImmutableArray System.Collections.Immutable.ImmutableArray...如果该实例已经是不可变的列表,它会简单地转换而不是创建一个新的集合。 • 该 WithLines() 方法遵循 我们的订单公约,如果新的列表和当前列表是相同的就可以避免创建一个新的实例。...这里有两个视频介绍可变性集合: Immutable Collections for .NET Inner workings of immutable collections 不可变集合的系列博客推荐
在JDK中有很多的类被设计成不可变的,举个大家经常用到的类java.lang.String,String类被设计成不可变。String所表示的字符串的内容绝对不会发生变化。...为什么String不可变? 那么为什么String是不可变的呢?满足那些条件才可以变成不可变的类?...在一个类中使用了其他的类,其他的类是可变的 当一个不可变的类中使用了其他的可变类之后,那么受影响不可变的类也会变成可变的类。...,那么是否真的不可变呢?...也就是说,通过反射是可以修改所谓的“不可变”对象的。这些在使用的时候都是需要注意的地方。
文章目录 一、Map 集合 二、获取 Map 值 三、Map 遍历 四、可变 Map 集合 一、Map 集合 ---- 调用 mapOf 函数 创建 Map 集合 , 键值对 元素有两种初始化方式 :...Tom=18, Jerry=12, Jack=20} {Tom=18, Jerry=12, Jack=20} 二、获取 Map 值 ---- 获取 Map 值 : 使用 取值运算符 [] 获取 Map 集合中的值...Pair("Tom", 18), Pair("Jerry", 12), Pair("Jack", 20)) println(map2) // 使用 取值运算符 `[]` 获取 Map 集合中的值...} 执行结果 : {Tom=18, Jerry=12, Jack=20} Tom = 18 Jerry = 12 Jack = 20 Tom = 18 Jerry = 12 Jack = 20 四、可变...Map 集合 ---- 通过调用 mutableMapOf 函数 , 可创建 可变 Map 集合 ; 代码示例 : fun main() { val mutableMap = mutableMapOf
集合在程序中是非常有用的,只有用好集合才能真正感受到该语言的魅力。...在scala中集合主要在三个包里面:scala.collection, scala.collection.immutable和scala.collection.mutable。...scala中引入不可变集合是为了方便程序的使用并减少在程序中的未知风险。如果一个集合被定义为不可变的,那么我们在使用的过程中就可以指定该集合是不会变化的,可以放心使用。...s"Element by key VD = ${hashMap2("VD")}") println(s"Element by key GD = ${hashMap2("GD")}") 我们再看一下怎么对集合进行操作
通过解构一次性给多个元素赋值 八、Set 集合 九、可变 Set 集合 十、List 与 Set 之间相互转换 十一、数组类型 十二、Map 集合 十三、获取 Map 值 十四、Map 遍历 十五、可变...Map 集合 一、List 创建与元素获取 ---- Kotlin 中的集合分为两类 , 只读集合 和 可变集合 ; 调用 listOf 函数 , 可以 直接创建 List 集合 ; 通过 [] 下标可以...---- 使用 listOf 函数 创建的 List 集合 是 只读列表集合 ; 使用 mutableListOf 函数 创建的 MutableList 集合 是 可变列表集合 ; 调用 MutableList...#toList 函数 , 可以 将 可变列表集合 转为 只读列表集合 ; 调用 List#toMutableList 函数 , 可以 将 只读列表集合 转为 可变列表集合 ; 代码示例 : fun main...(1)) } 执行结果 : Jerry 九、可变 Set 集合 ---- 调用 mutableSetOf 函数 , 可以创建 可变 Set 集合 ; 可变 Set 集合 , 可以 使用 += 运算符 添加元素
文章目录 一、MutableList 可变列表集合 二、修改 MutableList 集合的 mutator 函数 1、添加元素运算符 += 和 删除元素运算符 -= 2、通过 Lambda 表达式筛选要删除的元素...一、MutableList 可变列表集合 ---- 使用 listOf 函数 创建的 List 集合 是 只读列表集合 ; 使用 mutableListOf 函数 创建的 MutableList 集合...是 可变列表集合 ; 调用 MutableList#toList 函数 , 可以 将 可变列表集合 转为 只读列表集合 ; 调用 List#toMutableList 函数 , 可以 将 只读列表集合...转为 可变列表集合 ; 代码示例 : fun main() { // 创建可变列表集合 var mutableList = mutableListOf("Tom", "Jerry")...转为 只读列表集合 val list: List = mutableList.toList() // 将 只读列表集合 转为 可变列表集合 val mutable
微软基础类库(Base Class Library)团队已经完成了.NET不可变集合的正式版本,但不包括ImmutableArray。与其一起发布的还包括针对其它不可变对象类型的设计指南。...如果你需要在多个线程中安全地共享集合,并且允许每个线程在需要时对其内容进行改变。这种场景就是不可变集合所设计的初衷。...只读集合在使用时需要复制集合中的全部内容,而新的不可变集合可以以一种更高性能的方式从一个现有集合中进行创建。...使用不可变集合需要特别当心,因为你很容易错误地写成“list.Add(item)”,而正确的方法是“list = list.Add(item)”。...甚至编译器也可能产生类似的错误,这也是为什么不可变集合不支持构造函数的原因。
/** * Guava的不可变集合用法 * * 创建对象的不可变集合是一种很好的防御性编程技巧; * Guava为所有JDK标准集合类型和Guava集合类型都提供了简单易用的不可变版本; *...* 1、不可变集合的优点: * (1)当对象被不可信的库调用时,不可变形式是安全的; * (2)不可变对象被多个线程调用时,不存在竞态条件问题; * (3)不可变集合不需要考虑变化,...因此可以节省时间和空间; * (4)不可变对象因为有固定变化,可以作为常量来安全使用; * 2、JDK提供的unmodifiableXXX方法笨重且累赘、不安全、低效; * 3、不可变集合的三种创建方法...arrayList = new ArrayList(); arrayList.add(1); arrayList.add(2); arrayList.add(3); //需要使用处理后的不可变集合...Collections.unmodifiableList(arrayList); test(arrayList); System.out.println(arrayList); //如果对不可变集合进行操作会报错
7.2 不可变设计 ?...final的使用 发现该类、类中所有属性都是final的 属性用final修饰保证了该属性是只读的,不能修改 类用final修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性 保护性拷贝
文章目录 一、Set 集合 二、可变 Set 集合 三、List 与 Set 之间相互转换 四、数组类型 一、Set 集合 ---- List 集合中的元素是 可以重复 的 , Set 集合中的元素...不可重复 ; 调用 setOf 函数 , 可以创建 Set 集合 ; 调用 Set#elementAt 函数 , 可以 读取 Set 集合中的元素 ; 代码示例 : fun main() { val...set = setOf("Tom", "Jerry", "Jack") println(set.elementAt(1)) } 执行结果 : Jerry 二、可变 Set 集合 ---- 调用...mutableSetOf 函数 , 可以创建 可变 Set 集合 ; 可变 Set 集合 , 可以 使用 += 运算符 添加元素 , 使用 -= 运算符删除元素 ; 代码示例 : fun main()...Set 集合 , 转换过程中会 自动删除重复的元素 ; 调用 List#distinct() 函数 , 可以去除重复元素 ; 调用 Set#toList() 函数 , 可以将 Set 集合转为 List
列表是一个有序可变的数据集合,所谓有序是指列表里的数据会按照存入的顺序存储,所谓可变是指列表的长度会随着数据的增多而变长,不是固定大小的长度。 列表作为最为常用的基本数据结构,到底有什么用呢?...如果pop()不写索引值会怎么样呢? image.png 是的,如果不写索引值就会弹出最后一个元素。
文章目录 Pre 潜在线程不安全的问题 解决方案(不可变类) 如果当前类被子类继承还是一个不可变类吗?
java集合及concurrent并发包 集合包 集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形式的键值对。...CopyOnWriteArrayList: CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的ArrayList,CopyOnWriteArrayList在兼顾了线程安全的同时,又提高了并发性...ConcurrentHashMap是线程安全的HashMap的实现;锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问; 并发...Condition Condition是并发包中提供的一个接口,典型的实现有ReentrantLock,ReentrantLock提供了一个mewCondition的方法,以便用户在同一个锁的情况下可以根据不同的情况执行等待或唤醒动作
来源:阿凡卢, www.cnblogs.com/luxiaoxun/p/4638748.html 本文简要介绍Java并发编程方面常用的类和集合,并介绍下其实现原理。...公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。...往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。...常见有以下几种: AbortPolicy :不执行,会抛出 RejectedExecutionException 异常。 CallerRunsPolicy :由调用者(调用线程池的主线程)执行。...参考: 《java并发编程的艺术》
正因为有了读写锁,才使得多个线程之间的读操作可以并发进行,不需要同步,而写操作需要同步进行,提高了效率。...3.性能比较 在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时ReentrantLock的性能要远远优于synchronized。...因为这是一个重量级操作,它对性能最大的影响是阻塞的是实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性带来了很大的压力。
进程和线程 进程: 进程可理解为是一个正在运行的程序整体 进程是具有一定独立功能的程序,是操作系统进行资源分配的基本单位 线程: 线程是操作系统进行调度的基本单位 进程 vs....线程比进程划分更细,执行开销更小,并发性更高 进程是一个实体,拥有独立的资源,而同一进程中的多个线程是共享进程的资源的如下图: ?...Java多线程编程的特点又在于: 多线程模型是Java程序最基本的并发模型; 后续读写网络、数据库、Web开发等都依赖Java多线程模型。 因此,必须掌握Java多线程编程才能继续深入学习其他内容。
进程和线程 进程: 进程可理解为是一个正在运行的程序整体 进程是具有一定独立功能的程序,是操作系统进行资源分配的基本单位 线程: 线程是操作系统进行调度的基本单位 进程 vs....线程 一个程序至少有一个进程,一个进程至少有一个线程 线程比进程划分更细,执行开销更小,并发性更高 进程是一个实体,拥有独立的资源,而同一进程中的多个线程是共享进程的资源的如下图: JVM在单进程中运行...Java多线程编程的特点又在于: 多线程模型是Java程序最基本的并发模型; 后续读写网络、数据库、Web开发等都依赖Java多线程模型。 因此,必须掌握Java多线程编程才能继续深入学习其他内容。
并发集合 1 为什么使用并发集合?...注意: 与经典集合相比,并发集合会有更大的开销,因此在串行代码中使用并发集合无意义,只会增加额外的开销且运行速度比访问经典集合慢。...2 并发集合 1)ConcurrentQueue:线程安全的先进先出 (FIFO) 集合 主要方法: Enqueue(T item);将对象添加到集合结尾。...millisecondsTimeout, CancellationToken cancellationToken); 说明: 使用BlockingCollection()构造函数实例化BlockingCollection,意味着不设置...图1 并行的生产者-消费者模式 说明: 并发集合用在此模式下非常合适,因为并发集合支持此模式中对象的并行操作。
thread1.start(); thread2.start(); thread3.start(); } } 字符a和字符b是混合输出的,这符合我们的预期,因为多线程是并发的
本文简要介绍Java并发编程方面常用的类和集合,并介绍下其实现原理。 AtomicInteger 可以用原子方式更新int值。...公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。 一些源代码参考: ? ?...往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。...常见有以下几种: AbortPolicy :不执行,会抛出 RejectedExecutionException 异常。 CallerRunsPolicy :由调用者(调用线程池的主线程)执行。...参考:《java并发编程的艺术》
领取专属 10元无门槛券
手把手带您无忧上云