首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TypeError: unhashable type: dict

哈希值可以简化对象比较和查找操作,因为只需要比较哈希值即可确定对象是否相等。在Python,只有不可变(immutable)对象才能被哈希,比如整数、字符串和元组等。...if key in cache: print("从缓存获取结果:", cache[key]) else: # 计算并缓存结果 result =...calculate_value(data) # 计算结果并缓存: 10data2 = {'value': 5}calculate_value(data2) # 从缓存获取结果: 10在示例代码,...为了避免字典作为键值导致TypeError错误,我们将字典转换为元组并作为缓存字典键。这样,即使字典内容一样,但其对应元组却不同,从而能够正确保存和获取缓存结果。...可变(mutable)对象: 可变象是指它值可以在创建之后被改变对象。这意味着我们可以对可变对象进行添加、删除、更新操作,而其内存地址不会改变。

44640

String 既然能这样性能调优,我直呼内行(文末送书)

6 及之前 数据存储在 char[]数组,String通过 offset 和 count两个属性定位 char[] 数据获取字符串。...,但字符串值 value 仍然指向是内存同一个数组,如下图所示: 如果我们仅仅是用 substring 获取一小段字符,而原始 string字符串非常大情况下,substring 对象如果一直被引用...高性能缓存 String不可变之后就能保证 hash值得唯一性,使得类似 HashMap容器才能实现相应 key-value 缓存功能。 实现字符串常量池 由于不可变,才得以实现字符串常量池。...大字符串如何构建 既然 String 对象是可变,所以我们在频繁拼接字符串时候是否意味着创建多个对象呢?...总结与思考 我们 String 进化历程掌握了她组成,不断改变成员变量节约内存。 她可变性从而实现了字符串常量池,减少同一个字符串重复创建,节约内存。

41620
您找到你想要的搜索结果了吗?
是的
没有找到

String类可变

来源 | 简书| 作者 | 指尖上榴莲 一.原理(为什么说String类是不可变) 1.什么是不可变对象 如果一个对象在创建之后就不能再改变它状态,那么这个对象是可变(Immutable)。...3.允许String对象缓存hashcode 查看上文JDK1.8String类源码,可以发现其中有一个字段hash,String类可变性保证了hashcode唯一性,所以可以用hash字段String...对象hashcode进行缓存,就不需要每次重新计算hashcode。...所以JavaString对象经常被用来作为HashMap等容器键。 4.安全性 如果String对象是可变,那么会引起很严重安全问题。...因为String对象是可变,所以它值是不可改变,否则黑客们可以钻到空子,改变String引用指向对象值,造成安全漏洞。

57830

JavaString为什么是不可变

从打印结果可以看出,s值确实改变了。那么怎么还说String对象是可变呢? 其实这里存在一个误区: s只是一个String对象引用,并不是对象本身。...为什么String对象是可变? 要理解String可变性,首先看一下String类中都有哪些成员变量。..., 在JavaString类其实就是字符数组封装。...除此之外还有一个hash成员变量,是该String对象哈希值缓存,这个成员变量也和本文讨论无关。在Java,数组也是对象。 所以value也只是一个引用,它指向一个真正数组对象。...但是一般我们这么做。这个反射实例还可以说明一个问题:如果一个对象,他组合其他对象状态是可以改变,那么这个对象很可能不是不可变对象。

66930

Java并发-推荐使用不可变对象原因分析

线程安全需同时考虑原子性和可见性问题,所以网上常说可变象是线程安全,其实是不严谨。...通常为了保证缓存不被污染,当我们从缓存中提取对象时,会返回原始缓存对象一个深拷贝,这样无论上层业务代码提取到对象如何修改,均不会对缓存本身造成影响。...2.2.3 更好可维护性 当我们在代码中看到一个不可变对象时,心情是轻松,因为这类对象很单纯,不会在哪个隐藏逻辑分支偷偷改变自身状态,代码测试、调试和阅读理解都有好处。...不可变对象并发编程友好、易于在进程内缓存、且拥有更好可维护性,建议在自己能力范围内,尽量优先考虑使用不可变对象设计。...比如颜色数值和颜色名可以因为多线程调动而对应上。 3.2定义不可变对象策略 以下一些规则是创建不可变对象简单策略。

57320

STRING对象不可变原理

从打印结果可以看出,s值确实改变了。那么怎么还说String对象是可变呢?其实这里存在一个误区:s只是一个String对象引用,并不是对象本身。...为什么String对象是可变? 要理解String可变性,首先看一下String类中都有哪些成员变量。..., 在JavaString类其实就是字符数组封装。...除此之外还有一个hash成员变量,是该String对象哈希值缓存,这个成员变量也和本文讨论无关。在Java,数组也是对象(可以参考我之前文章 java数组特性)。...但是一般我们这么做。这个反射实例还可以说明一个问题:如果一个对象,他组合其他对象状态是可以改变,那么这个对象很可能不是不可变对象。

68440

Java String 为什么是不可变

从打印结果可以看出,s值确实改变了。那么怎么还说String对象是可变呢? 其实这里存在一个误区: s只是一个String对象引用,并不是对象本身。...为什么String对象是可变? 要理解String可变性,首先看一下String类中都有哪些成员变量。..., 在JavaString类其实就是字符数组封装。...除此之外还有一个hash成员变量,是该String对象哈希值缓存,这个成员变量也和本文讨论无关。在Java,数组也是对象。 所以value也只是一个引用,它指向一个真正数组对象。...但是一般我们这么做。这个反射实例还可以说明一个问题:如果一个对象,他组合其他对象状态是可以改变,那么这个对象很可能不是不可变对象。

1.8K01

HashMap工作原理

但一些面试者可能可以给出答案,“HashMap是基于hashing原理,我们使用put(key, value)存储对象到HashMap,使用get(key)HashMap获取对象。...这一点有助于理解获取对象逻辑。如果你没有意识到这一点,或者错误认为仅仅只在 bucket存储值的话,你将不会回答如何HashMap获取对象逻辑。...因为HashMap使 用链表存储对象,这个Entry(包含有键值Map.Entry对象)会存储在链表。”...不可变性使得能够缓存不同键hashcode,这将提高整个获取对象速度,使用 String,Interger这样wrapper类作为键是非常好选择。... 可变性还有其他优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变,那么请这么做吧。

54210

java并发编程读书笔记(1)-- 对象共享

jvm对象,要特别注意对象共享状态 Shared:共享 Mutable:可变 当设计线程安全类时,良好面向对象技术、不可修改性,以及明晰不变性规范都能起到一定帮助作用; 无状态对象是线程安全...:没有任何域也包含任何其他类引用(比如StatelessFactory implements Servlet),多个线程访问并没有共享状态,不会影响其正确性。...volatile变量不会被缓存到寄存器或者其他处理器不可见地方,因此在读取volatile变量时总会返回最新写入值。 volatile一个用法:while条件变量,为保证可见性。...volatile变量不会被缓存到寄存器或者其他处理器不可见地方,因此在读取volatile变量时总会返回最新写入值。...构造函数象是this,其他譬如引用类属性拥有者为this,如果将这哥匿名类传递给source,source如果其进行了引用,而这时候构造函数还没结束即没有创建ThisEscape对象,这个匿名类也还没构造

86580

HashMap工作原理

但一些面试者可能可以给出答案,“HashMap是基于hashing原理,我们使用put(key, value)存储对象到HashMap,使用get(key)HashMap获取对象。...这一点有助于理解获取对象逻辑。如果你没有意识到这一点,或者错误认为仅仅只在 bucket存储值的话,你将不会回答如何HashMap获取对象逻辑。...因为HashMap使 用链表存储对象,这个Entry(包含有键值Map.Entry对象)会存储在链表。”...不可变性使得能够缓存不同键hashcode,这将提高整个获取对象速度,使用 String,Interger这样wrapper类作为键是非常好选择。... 可变性还有其他优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变,那么请这么做吧。

42420

阿里一面:如何将重复性比较高 String 类型地址信息 20GB 降到几百兆?

有粉丝去阿里面试,跟码哥分享了其中一题面试问题「如何将重复性比较高 String 类型地址信息 20GB 降到几百兆?」。 今天,码哥多个角度带你完全攻克这个知识点,让面试官眼前一亮。...[]数组,String通过 offset 和 count两个属性定位 char[] 数据获取字符串。...,但字符串值 value 仍然指向是内存同一个数组,如下图所示: 如果我们仅仅是用 substring 获取一小段字符,而原始 string字符串非常大情况下,substring 对象如果一直被引用...高性能缓存 String不可变之后就能保证 hash值得唯一性,使得类似 HashMap容器才能实现相应 key-value 缓存功能。 实现字符串常量池 由于不可变,才得以实现字符串常量池。...大量字符串拼接对象如何优化 既然 String 对象是可变,所以我们在频繁拼接字符串时候是否意味着创建多个对象呢?

8310

结构型-Flyweight

享元模式原理与实现 享元模式(Flyweight Design Pattern) 所谓“享元”,顾名思义就是被共享单元。享元模式意图是复用对象,节省内存,前提是享元对象是可变对象。...具体来讲,当一个系统存在大量重复对象时候,如果这些重复象是可变对象,我们就可以利用享元模式将对象设计成享元,在内存只保留一份实例,供多处代码引用。...这里我稍微解释一下,定义“不可变对象”指的是,一旦通过构造函数初始化完成之后,它状态(对象成员变量或者属性)就不会再被修改了。所以,不可变对象不能暴露任何 set() 等修改内部状态方法。...之所以要求享元是不可变对象,那是因为它会被多处代码共享使用,避免一处代码享元进行了修改,影响到其他使用它代码。 接下来,我们通过一个简单例子解释一下享元模式。...享元模式 VS 单例、缓存、对象池 我们前面也多次提到,区别两种设计模式,不能光看代码实现,而是要看设计意图,也就是要解决问题。这里区别也例外。我们可以用简单几句话来概括一下它们之间区别。

19610

Java String 对象,你真的了解了吗?

在 Java6 以及之前版本 String对象是 char 数组进行了封装实现对象,主要有四个成员变量: char 数组、偏移量 offset、字符数量 count、哈希值 hash。...String对象是通过 offset 和 count 两个属性来定位 char[] 数组,获取字符串。这么做可以高效、快速地共享数组对象,同时节省内存空间,但这种方式很有可能会导致内存泄漏。 2.... Java7 版本开始到 Java8 版本 Java7 版本开始,Java String类做了一些改变。String类不再有 offset 和 count 两个变量了。...String 对象可变我们知道String对象那一刻起,我想大家都知道了String对象是可变。那它不可变是怎么做到呢?Java 这么做能带来哪些好处?...假设 String 对象是可变,那么 String 对象将可能被恶意修改。

79440

python mmap_python mmap对象

也就是说,文件并没有被复制到内存缓存或数组。相反,操作系统仅仅为文件内容保留了一段虚拟内存。当访问文件不同区域时,这些区域内容才根据需要被读取并映射到内存区域中。...—-mmap是什么 mmap是一种虚拟内存映射文件方法,它可以将一个文件或者其它对象映射到进程地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址一一应关系。...对象是可变,而 str 对象是可变 mmap 对象同时对应于打开文件,多态于一个Python file 对象 mmap 对象可以切片和索引,也可以为它切片或索引赋值(因为 mmap 对象是可变...([offset, n])   把 m offset开始n个字节刷到对应文件,参数 offset 要么同时指定,要么同时指定; m.move(dstoff, srcoff, n)   等于...m.read(n)   返回一个字符串, m 对应文件中最多读取 n 个字节,将会把 m 对应文件位置指针向后移动; m.read_byte()   返回一个1字节长字符串, m 对应文件

96910

JVM内存模型和性能优化之线程锁优化(下篇)

工作内存里变量,在多核处理器下,将大部分储存于处理器高速缓存。 工作内存会拷贝主存变量,然后变量操作在自己工作内存中进行。 线程之间无法相互直接访问,变量传递均需要通过主存完成。...如何保证内存计算一致性 1、缓存一致性 当一个线程更新了自己工作内存数据后,没有写到主内存,其他线程是不知道。...a、获取对象监视器锁(lock) b、清空工作内存数据, 主存复制变量到当前工作内存, 即同步数据 (read and load) c、 执行代码,改变共享变量值 (use and...---- 线程安全模式 线程安全性定义要求无论是多线程时序或交替操作,都要保证破坏业务本身不变约束 。 为了保护状态一致性,要在单一原子操作更新相互关联状态变量。...状态和值对象 值对象是DDD中一种模型,不可变性。 状态是表达一段时间内一个逻辑为真的事实,状态是不可变,因为我们不能回到过去改变状态。 状态是一种值对象。

60330

HashMap工作原理

但一些面试者可能可以给出答案,“HashMap是基于hashing原理,我们使用put(key, value)存储对象到HashMap,使用get(key)HashMap获取对象。...这一点有助于理解获取对象逻辑。如果你没有意识到这一点,或者错误认为仅仅只在bucket存储值的话,你将不会回答如何HashMap获取对象逻辑。...因为HashMap使用链表存储对象,这个Entry(包含有键值Map.Entry对象)会存储在链表。”...不可变性使得能够缓存不同键hashcode,这将提高整个获取对象速度,使用String,Interger这样wrapper类作为键是非常好选择。    ...我个人很喜欢这个问题,因为这个问题深度和广度,也直接涉及到不同概念。

58230

【Java 基础篇】Java线程安全与并发问题详解

多线程编程在Java是一个常见需求,它可以提高程序性能和响应能力。然而,多线程编程也带来了一系列线程安全与并发问题。...在多线程环境,如果采取适当措施,可能会导致以下问题: 竞态条件(Race Condition):多个线程同时访问共享资源,竞争资源读写操作,导致数据不一致。...不可变对象(Immutable Objects) 不可变象是指一旦创建,其状态不能被修改对象。因为不可变对象状态不可变,所以它们可以安全地在多个线程之间共享,而无需同步。...它具有以下特性: 当一个线程修改了volatile字段值,其他线程会立即看到最新值。 volatile字段不会被缓存在线程本地内存,而是直接主内存读取和写入。...为了避免死锁,可以采用以下方法: 按顺序获取锁:确保所有线程以相同顺序获取锁,避免循环等待情况。 使用tryLock:尝试获取锁一段时间,如果失败则释放已经获得锁,然后重新尝试。

21840

Java线程安全与并发问题

多线程编程在Java是一个常见需求,它可以提高程序性能和响应能力。然而,多线程编程也带来了一系列线程安全与并发问题。...在多线程环境,如果采取适当措施,可能会导致以下问题: 竞态条件(Race Condition):多个线程同时访问共享资源,竞争资源读写操作,导致数据不一致。...不可变对象(Immutable Objects)不可变象是指一旦创建,其状态不能被修改对象。因为不可变对象状态不可变,所以它们可以安全地在多个线程之间共享,而无需同步。...它具有以下特性:当一个线程修改了volatile字段值,其他线程会立即看到最新值。volatile字段不会被缓存在线程本地内存,而是直接主内存读取和写入。...为了避免死锁,可以采用以下方法: 按顺序获取锁:确保所有线程以相同顺序获取锁,避免循环等待情况。 使用tryLock:尝试获取锁一段时间,如果失败则释放已经获得锁,然后重新尝试。

11910

一文读懂字符串String

为什么说字符串是不可变 在工作,我们经常要在代码字符串进行赋值和改变它值,但是,为什么我们说字符串是不可变呢?...不可变象是在完全创建后其内部状态保持不变对象。这意味着,一旦对象被赋值给变量,我们既不能更新引用,也不能通过任何方式改变内部状态。...缓存 字符串是使用最广泛数据结构。大量字符串创建是非常耗费资源,所以,Java提供了字符串缓存功能,可以大大地节省堆空间。...性能 前面提到了字符串池、hashcode缓存等,都是提升性能提现。 因为字符串不可变,所以可以用字符串池缓存,可以大大节省堆内存。...而且还可以提前hashcode进行缓存,更加高效 由于字符串是应用最广泛数据结构,提高字符串性能对提高整个应用程序总体性能有相当大影响。

49620

hashmap实现原理面试_jvm面试题总结及答案

因为HashMap好处非常多,我曾经在电子商务应用中使用HashMap作为缓存。...但其它线程可以通过set()方法更改集合对象是允许,因为这并没有“结构上”更改集合。...但一些面试者可能可以给出答案,“HashMap是基于hashing原理,我们使用put(key, value)存储对象到HashMap,使用get(key)HashMap获取对象。...这一点有助于理解获取对象逻辑。如果你没有意识到这一点,或者错误认为仅仅只在bucket存储值的话,你将不会回答如何HashMap获取对象逻辑。...不可变性使得能够缓存不同键hashcode,这将提高整个获取对象速度,使用String,Interger这样wrapper类作为键是非常好选择。

45810
领券