CoreJava基础之Properties集合(补充)

本文介绍了Properties类,它是Hashtable的子类,无泛型,键值为字符串,可持久化,有和流结合的方法。还阐述了其特有方法,如load和store。通过实例演示了将集合内容存储到文件,以及从文件读取数据到集合的操作,使用字符流可完成中文读取。

1.Properties类

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特点:

1、Hashtable的子类,map集合中的方法都可以用。

2、该集合没有泛型。键值都是字符串。

3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。

4、有和流技术相结合的方法。

2.Propertise类的方法

特有方法:

  1. load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中
  2. load(Reader) 
  3. store(OutputStream,commonts)把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息
  4. stroe(Writer,comments)。

3.Properties类的方法实例

代码演示:

/*
 * 
 * Properties集合,它是唯一一个能与IO流交互的集合
 * 
 * 需求:向Properties集合中添加元素,并遍历
 * 
 * 方法:
 * public Object setProperty(String key, String value)调用 Hashtable 的方法 put。
 * public Set<String> stringPropertyNames()返回此属性列表中的键集,
 * public String getProperty(String key)用指定的键在此属性列表中搜索属性
 */
public class PropertiesDemo01 {
	public static void main(String[] args) {
		//创建集合对象
		Properties prop = new Properties();
		//添加元素到集合
		//prop.put(key, value);
		prop.setProperty("周迅", "张学友");
		prop.setProperty("李小璐", "贾乃亮");
		prop.setProperty("杨幂", "刘恺威");
		
		//System.out.println(prop);//测试的使用
		//遍历集合
		Set<String> keys = prop.stringPropertyNames();
		for (String key : keys) {
			//通过键 找值
			//prop.get(key)
			String value = prop.getProperty(key);
			System.out.println(key+"==" +value);
		}
	}
}

4.将集合中的内容存储到文件

需求:使用Properties集合,完成把集合内容存储到IO流所对应文件中的操作

分析步骤:

1,创建Properties集合

2,添加元素到集合

3,创建流

4,把集合中的数据存储到流所对应的文件中

stroe(Writer,comments)

store(OutputStream,commonts)

把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

5,关闭流

案例:

public class PropertiesDemo02 {
	public static void main(String[] args) throws IOException {
		//1,创建Properties集合
		Properties prop = new Properties();
		//2,添加元素到集合
		prop.setProperty("周迅", "张学友");
		prop.setProperty("李小璐", "贾乃亮");
		prop.setProperty("杨幂", "刘恺威");
		
		//3,创建流
		FileWriter out = new FileWriter("prop.properties");
		//4,把集合中的数据存储到流所对应的文件中
		prop.store(out, "save data");
		//5,关闭流
		out.close();
	}
}

5.读取文件中的数据,并保存到集合

需求:从属性集文件prop.properties 中取出数据,保存到集合中

分析:

1,创建集合

2,创建流对象

3,把流所对应文件中的数据 读取到集合中

load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中

load(Reader) 

4,关闭流

5,显示集合中的数据

案例演示:

public class PropertiesDemo03 {
	public static void main(String[] args) throws IOException {
		//1,创建集合
		Properties prop = new Properties();
		//2,创建流对象
		FileInputStream in = new FileInputStream("prop.properties");
//FileReader in = new FileReader("prop.properties");
		//3,把流所对应文件中的数据 读取到集合中
		prop.load(in);
		//4,关闭流
		in.close();
		//5,显示集合中的数据
		System.out.println(prop);
		
	}
}

注意:使用字符流FileReader就可以完成文件中的中文读取操作了!

<think>我们正在讨论Redis的Set集合在Java中的操作。根据用户的问题,用户想了解在Java中如何实现Redis的Set集合存储。我们可以结合站内引用中给出的代码示例来讲解。引用[1]和引用[2]都展示了使用Java操作RedisSet的方法,其中引用[1]使用了SpringDataRedis的RedisTemplate,引用[2]使用了Jedis。因此,我们可以介绍两种常用的JavaRedis客户端操作Set集合的方法。1.使用Jedis(直接连接Redis服务器)2.使用SpringDataRedis的RedisTemplate(通常在Spring应用中使用)我们将分别给出两种方式的代码示例。注意:用户问题集中在“存储”操作,所以我们将重点放在添加元素到Set集合,同时也展示一些基本操作,但以存储为主。步骤:1.引入依赖2.连接Redis3.操作Set集合我们分别介绍两种方式。方式一:使用Jedis步骤1:添加Jedis依赖(以Maven为例)```xml<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version><!--请使用最新版本--></dependency>```步骤2:Java代码示例```javaimportredis.clients.jedis.Jedis;importjava.util.Set;publicclassJedisSetExample{publicstaticvoidmain(String[]args){//连接到Redis服务器,默认本地6379端口Jedisjedis=newJedis("localhost",6379);//如果Redis服务器设置了密码,需要认证//jedis.auth("password");Stringkey="fruits";//存储数据到Setjedis.sadd(key,"apple","banana","orange");//获取Set中的所有成员Set<String>members=jedis.smembers(key);System.out.println("Setmembers:"+members);//添加一个新成员jedis.sadd(key,"grape");//再次获取members=jedis.smembers(key);System.out.println("Afteraddinggrape:"+members);//关闭连接jedis.close();}}```方式二:使用SpringDataRedis的RedisTemplate步骤1:添加SpringDataRedis依赖```xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.5.5</version><!--请使用合适的版本--></dependency>```步骤2:配置Redis连接(在SpringBoot的application.properties中)```propertiesspring.redis.host=localhostspring.redis.port=6379spring.redis.password=#如果有密码的话```步骤3:在代码中使用RedisTemplate```javaimportorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjava.util.Arrays;importjava.util.Set;@ComponentpublicclassRedisSetExample{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;publicvoidoperateOnSet(){Stringkey="fruits";//存储数据到SetredisTemplate.opsForSet().add(key,"apple","banana","orange");//获取Set中的所有成员Set<Object>members=redisTemplate.opsForSet().members(key);System.out.println("Setmembers:"+members);//添加一个新成员redisTemplate.opsForSet().add(key,"grape");//再次获取members=redisTemplate.opsForSet().members(key);System.out.println("Afteraddinggrape:"+members);}}```注意:在SpringBoot中,我们通常使用依赖注入的方式获取RedisTemplate。如果非Spring环境,需要手动配置RedisTemplate。两种方式各有优劣:-Jedis:轻量级,直接使用,适用于简单的独立应用。-RedisTemplate:功能丰富,Spring框架集成,支持事务、序列化配置等,适用于Spring应用。用户可以根据自己的项目情况选择。问题:用户如果对RedisTemplate的配置有疑问,我们可以进一步讲解如何配置RedisTemplate。但当前问题主要关注Set的存储操作,因此我们提供了基础操作。根据用户之前的引用,他们还提到了差集操作。这里补充一下使用RedisTemplate进行差集操作的方法(但非用户本次主要问题,作为扩展):```java//计算多个集合的差集Set<Object>difference=redisTemplate.opsForSet().difference(Arrays.asList(setKey1,setKey2,setKey3));```同样,Jedis中可以使用sdiff方法。我们最后回答用户的问题:在Java中实现Redis的Set集合存储,主要通过上述两种方式,使用sadd命令(在Jedis中是sadd方法,在RedisTemplate中是opsForSet().add方法)来实现。生成相关问题:1.如何在Java中配置Redis连接?2.除了Set集合,Redis还支持哪些数据结构?在Java中如何操作?3.使用RedisTemplate时,如何选择序列化方式?4.如何实现RedisSet集合的交集和并集操作?我们将上述内容整理后回答用户。</think> ### Java 中操作 Redis Set 集合存储的方法详解 Redis 的 Set 集合是一个无序且元素唯一的键值存储结构,常用于去重、交集/并集计算等场景。在 Java 中主要通过以下两种方式实现: --- #### 一、使用 Jedis 客户端(原生操作) ```java import redis.clients.jedis.Jedis; import java.util.Set; public class RedisSetDemo { public static void main(String[] args) { // 1. 创建Redis连接 Jedis jedis = new Jedis("localhost", 6379); // 2. 存储数据到Set jedis.sadd("fruits", "apple", "banana", "orange"); // 添加元素 // 3. 获取Set集合数据 Set<String> allFruits = jedis.smembers("fruits"); System.out.println("所有水果: " + allFruits); // 输出: [apple, banana, orange] // 4. 常用操作示例 jedis.sadd("tropical", "banana", "mango"); Set<String> diff = jedis.sdiff("fruits", "tropical"); // 差集计算 System.out.println("独有水果: " + diff); // 输出: [apple, orange] // 5. 关闭连接 jedis.close(); } } ``` **关键方法说明**: - `sadd(key, values)`:添加元素到集合 - `smembers(key)`:获取集合所有元素 - `sdiff(key1, key2)`:返回差集(key1有但key2无的元素) - `sismember(key, value)`:检查元素是否存在 --- #### 二、使用 Spring Data Redis(企业级推荐) ```java @SpringBootTest public class RedisSetTests { @Autowired private RedisTemplate<String, Object> redisTemplate; public void setOperations() { // 1. 初始化Set集合 String key = "products"; redisTemplate.opsForSet().add(key, "phone", "laptop", "tablet"); // 2. 获取全部元素 Set<Object> products = redisTemplate.opsForSet().members(key); // 3. 计算并存储差集 String key2 = "electronics"; redisTemplate.opsForSet().add(key2, "laptop", "camera"); Set<Object> diffProducts = redisTemplate.opsForSet().difference(key, key2); System.out.println("独有商品: " + diffProducts); // 输出: [phone, tablet] // 4. 存储差集结果(SDIFFSTORE等效操作) String destKey = "unique_products"; redisTemplate.opsForSet().differenceAndStore(key, Arrays.asList(key2), destKey); } } ``` **核心接口**: - `opsForSet()`: 返回Set操作接口 - `difference()`: 内存级差集计算 - `differenceAndStore()`: 计算差集并存储结果(等价于SDIFFSTORE命令) --- ### 配置准备 1. **Jedis依赖**: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.4.1</version> </dependency> ``` 2. **Spring Data Redis依赖**: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` --- ### 使用场景建议 1. **去重场景**:存储用户ID、IP地址等唯一值 2. **关系运算**:标签系统(如共同兴趣计算) 3. **随机抽样**:通过`SRANDMEMBER`抽取随机元素 4. **实时过滤**:利用`SISMEMBER`快速验证存在性 > ⚠️ **注意**:Set 最大存储 $2^{32}-1$ 个元素,超大数据集建议分片存储或使用 HyperLogLog 进行基数统计[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员巨轮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值