java 对象中集合属性及复制

本文深入探讨了Java对象中集合属性的复制场景与多种实现方法,包括浅复制与深复制的区别,以及如何通过不同技术手段实现集合的高效克隆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java 对象中集合属性及复制

本文我们介绍集合属性的复制场景及多种实现方式。

对象中集合属性

实际应用中对象中的集合属性很常见,表达一对多的关系。如用户有多个地址,订单包括多个产品等。一般我们需要定义集合属性,并提供set、get方法。
下面示例定义属性检查类,每个属性拥有多个验证规则:

@NoArgsConstructor
public class PropCheck {
    /**
     * 属性名称
     */
    @Setter
    @Getter
    private String name;

    /**
     * 中文描述
     */
    @Setter
    @Getter
    private String desc;

    /**
     * 数据类型:string,number,date
     */
    @Setter
    @Getter
    private String type;

    private PropCheck(String name, String desc, String type){
        this.name  = name;
        this.desc  = desc;
        this.type  = type;
    }

    public static PropCheck of(String name, String desc, String type){
        return new PropCheck(name, desc, type);
    }

    /**
     * 属性验证规则集
     */
    private List<String> checkRules = Lists.newArrayList();

    /**
     * 增加验证规则
     * @param rule 新的规则
     */
    public PropCheck addRule(String rule){
        checkRules.add(rule);
        return this;
    }

    /**
     * 获取验证规则
     * @return 验证规则集合的拷贝
     */
    public List<String> getCheckRules(){
        return Lists.newArrayList(checkRules);
    }
}

为了避免list被随意修改,增加只能通过addRule方法增加,getCheckRules方法返回了规则集合的副本。
上面list复制,通过guava的Lists类进行复制,下面我们通过map来展示多种复制方式,list也一样。

map的多种复制方式

java内置API实现

最简单的方式是通过迭代map并调用put(k,v)方法实现:

``````
public static<K,V> Map<K,V> clone(Map<K,V> original) {
	Map<K,V> copy = new HashMap<>();

	for (Map.Entry<K,V> entry: original.entrySet()) {
		copy.put(entry.getKey(), entry.getValue());
	}

	return copy;
}

使用putAll(Collectioini<? extends E> c)

map.putAll方法可以一次从源拷贝所有项至目标map:

public static<K,V> Map<K,V> clone(Map<K,V> original) {
	Map<K,V> copy = new HashMap<>();
	copy.putAll(original);
	return copy;
}

使用java 8 流API

java 8 流可以实现集合拷贝:

public static<K,V> Map<K,V> clone(Map<K,V> original) {
	return original.entrySet()
					.stream()
					.collect(Collectors.toMap(Map.Entry::getKey,
											Map.Entry::getValue));
}

通过json 实现深复制

我们也可以使用 json库实现序列化与反序列化集合对象。通过转换集合为json字符串,然后再把json字符串转成集合对象。改过程是深复制,之前示例都是浅复制,当然对于基本数据类型及字符串两者一样。
下面代码利用GSON,读者也可以使用JACKSON:

public static<K,V> Map<K,V> clone(Map<K,V> original) {
	Gson gson = new Gson();
	String jsonString = gson.toJson(original);

	return gson.fromJson(jsonString, Map.class);
}

总结

本文介绍集合复制场景,并提供多种方式实现集合拷贝,包括深复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值