不可变类的实例的状态不可改变,可以很方便地被多个对象所共享,如果程序经常需要使用相同的不可变类的实例,则应该考虑缓存这种不可变类的实例,毕竟多次重复创建相同对象没有太大的意义,而且加大系统开销。如果可以,应该将已经创建的不可变类进行缓存。
缓存是软件设计中一个非常有用的模式,缓存的实现方式有很多,不同实现方式可能存在较大的性能差别。
以下是一个简单的Demo
package com.seimma.immutalb;
public class CacheImmutale {
private final String name;
private final int age;
private static CacheImmutale [] cache=new CacheImmutale[10];
//记录缓存实例在缓存中的位置,chche[pos-1]是最新缓存的实例
private static int pos=0;
public CacheImmutale(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public static CacheImmutale valueOf(String name,int age){
//遍历已缓存的对象
for (int i = 0; i < 10; i++) {
//如果已有相同的实例,直接返回该缓存的实例
if (cache[i]!=null && cache[i].getName().equals(name) && cache[i].getAge()==age) {
return cache[i];
}
}
//如果缓存已满
if (pos==10) {
//把缓存的第一个对象覆盖,即把刚刚生成的对象放在缓存池的最开始位置
cache[0]=new CacheImmutale(name,age);
pos=1; //把pos设置为1
return cache[0];
}else {
//把心创建的对象缓存起来,pos+1
cache[pos++]=new CacheImmutale(name,age);
return cache[pos-1];
}
}
public boolean equals(Object obj) {
if (obj instanceof CacheImmutale) {
CacheImmutale caImmutale=(CacheImmutale)obj;
if (name.equals(caImmutale.getName())) {
return true;
}
}
return false;
}
public int hashCode(){
return name.hashCode();
}
public static void main(String[] args) {
CacheImmutale caImmu1=CacheImmutale.valueOf("hello",12);
CacheImmutale caImmu2=CacheImmutale.valueOf("hello",12);
//下面代码输出true
System.out.println(caImmu1==caImmu2);
}
}
分享到:
相关推荐
本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...
本篇文章将详细探讨C#中的缓存机制及其应用实例。 首先,我们要理解缓存的基本概念。缓存,简单来说,就是一个临时存储数据的地方,它位于主内存和CPU之间,或者在网络层级的不同位置。通过将频繁访问的数据存储在...
【Hibernate缓存实例详解】 在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它极大地简化了数据库操作。为了提高性能,Hibernate引入了缓存机制,分为一级缓存和二级缓存。本篇文章将深入探讨...
这里的`@Cacheable`注解表示该实体类的实例可以被缓存,`@Cache`注解用于定义缓存区域,便于管理。 然后,我们需要在OSCache的配置文件(如`oscache.properties`)中进行一些设置,例如缓存大小、过期策略等: ```...
在多用户环境下,并发问题如脏读、不可重复读和幻读是常见的问题。Hibernate通过悲观锁和乐观锁来处理并发。悲观锁假设并发会导致数据冲突,因此在读取数据时就立即加锁,防止其他用户修改。乐观锁则在更新数据时...
本文将深入讲解如何使用Java实现一个简单的缓存池,并通过一个具体的代码实例来阐述其工作原理。 首先,我们来看缓存实体类(CacheItem)。这个类是用来存储缓存数据的容器,包含以下关键属性和方法: 1. `...
这是因为Java中的字符串是不可变的,每次对字符串进行修改都会生成一个新的对象,这可能会导致内存消耗增加和性能下降。为了解决这个问题,我们可以自定义一个字符串缓冲类来存储和复用字符串,以提高效率。 首先,...
为了提高代码的可维护性和复用性,操作类可能实现了设计模式,如单例模式确保在整个应用中只有一个实例,工厂模式简化了实例化过程。同时,良好的异常处理和错误提示也能提升开发效率。 6. 性能优化: 使用...
这些数据结构的设计使得Redis在处理复杂数据操作时表现出色,例如,哈希可用于存储对象,列表可实现消息队列,集合用于存储不重复元素,有序集合则添加了排序功能。 Redis支持多种操作命令,如设置(SET)、获取...
4. **缓存和 memoization**:不可变数据使得缓存计算结果变得更加简单,因为可以基于输入值的哈希来确定是否需要重新计算。 5. **调试**:由于每次修改都会生成新的数据结构,因此可以通过比较不同版本来追踪代码中...
`先锋缓存类 使用说明.htm`文件应该是对如何使用这个缓存类的详细指南,包括如何引入类库、实例化对象、调用方法等。通常会包含示例代码,解释每个方法的作用,以及如何配置缓存策略来适应不同场景。 缓存的正确...
`cache` 类是 PHP 缓存管理的核心,用于提高大型 PHP 项目性能。在这个实例中,`cache` 类...此外,该类没有实现错误处理和日志记录,这在生产环境中是必不可少的。在实际部署时,应根据具体需求进行相应的增强和完善。
在本实例中,我们将深入探讨如何在Spring框架中利用注解来实现缓存配置,特别是在Web应用程序中的实际应用。Spring Cache是一个强大的功能,它允许我们高效地管理应用程序中的数据,减少不必要的数据库查询,提高...
不可变类的特征是,它们的实例在创建后,其成员变量的值不能被修改。例如,Java中的Integer、Long和String类都是不可变的。与之相反,可变类的实例在其生命周期内可以改变其成员变量的值,这是大多数自定义类的默认...
在Android应用开发中,图片加载是一项关键任务,尤其是在处理大量图片数据时,如社交媒体应用、电商应用等。本文将深入探讨“Android图片异步加载(双缓存)实例”,介绍...对于大型应用来说,这样的优化是必不可少的。
4. **缓存哈希码**:不可变对象可以安全地缓存其哈希码,因为它们的哈希码永远不会改变。这对于HashMap等数据结构至关重要,它们依赖于对象的哈希码进行快速查找。如果String是可变的,其哈希码在对象生命周期内可能...
这两个方法都接受一个键和一个值,以及可选的缓存策略。 ```csharp var cacheKey = "myData"; var data = GetDataFromDatabase(); cache.Add(cacheKey, data, DateTimeOffset.Now.AddMinutes(5)); // 数据将在5分钟...
在PHP开发中,数据库操作是不可或缺的一部分,而为了提高应用程序的性能,缓存技术的应用也变得至关重要。"带有缓存功能的mysqli数据库操作类"是一个专门为PHP设计的实用工具,它将MySQLi数据库连接与缓存机制相结合...
- **缓存**:不可变数据适合用于缓存,因为它们不会被意外修改,且可安全地共享。 7. **与其他库的比较**: `immut`与`frozendict`、`immutable-py`等其他不可变数据结构库相比,可能提供不同的实现和特性。...
事务型策略提供了 Repeatable Read 隔离级别,适用于多读少写的场景,能防止脏读和不可重复读。读写型策略提供 Read Committed 隔离级别,适用于非集群环境,防止脏读。非严格读写型策略牺牲一致性,以换取更高的...