list.add(list1)和list.add(new ArrayList<>(list1))

这是我在用回溯法写全排列的时候出现的问题,知识错误,特意对此进行巩固

首先,如果list的泛型是引用类型,那么list.add()添加的是地址,而不是值。所以,当你用一个对象(这里用list代替)来添加另一个对象(这里用list1代替),如果被添加的对象(list)值不断发生变化,那么在最后遍历list1的时候,最终的值会和list1的最后的相同
先附上一段小代码

public static void fun(){
        List<List<Integer>>  list= new ArrayList<>();
        List<Integer> list1= new ArrayList<>();
        for(int i = 1;i<=3;i++){
            list1.add(i);
            list.add(row);
        }
        //最终list的值会是[1,2,3],[1,2,3],[1,2,3]
        //这里只创建了两个对象,在最后一次将row集合加入到res中时,也将前面的值进行了赋值
        //list.add()加入的是指定对象的地址,当row的值进行变化时,row的内容也会发生变化

        for(int i = 1;i<=3;i++){
            list1.add(i);
            list.add(new ArrayList<>(list1));
        }
        //最终list的值会是[1],[1,2],[1,2,3]
        //这里是通过创建一个新的对象,将其加入到res集合中,并不会因为row的值发生变化而改变
    }

这段是我在写1,2,3的全排列的时候出现的问题代码,刚开始一直用list.add(list1),导致最终的list内容都为[],因为在代码中有list1.remove(list1.size()-1);最终list1的内容为[],最后经过查阅资料,改为list.add(new ArrayList<>(list1)).

import java.util.*;
public class Main {
	static List<List<Integer>> list = new ArrayList<>();
	
    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        List<Integer> list1 = new ArrayList<>();
        fun(nums, list1);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }


    public static void fun(int[] nums, List<Integer> list1) {
        if (list1.size() == nums.length) {
            System.out.println(list1);
            list.add(new ArrayList<>(list1));
            //list.add(list1);错误
            //这里如果使用list.add(list1),最终会由于list1.remove(list.size()-1),list1的内容会变为0,从而使得list的内容也变为0
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (list1.contains(nums[i])) {
                continue;
            }
            list1.add(nums[i]);
            fun(nums, list1);
            list1.remove(list1.size() - 1);
        }
    }
}
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是将这个SQL查询改成使用JdbcTemplate执行的代码: ``` List<List<String>> assetscardcodeQueryList = new ArrayList<>(); ArrayList<String> query1 = new ArrayList<>(); ArrayList<String> query2 = new ArrayList<>(); query1.add("000000009247"); query2.add("000000009247"); assetscardcodeQueryList.add(query1); assetscardcodeQueryList.add(query2); List<List<String>> assetscardcodeAndBukrsQueryList = new ArrayList<>(); ArrayList<String> query3 = new ArrayList<>(); query3.add("400000001644"); query3.add("A017"); query3.add("400000001641"); query3.add("A017"); String sql = "select * from table where (cloum1,cloum2) in " + "(?, ?)" + ", ".repeat(assetscardcodeAndBukrsQueryList.size() - 1) + "or cloum1 in " + "(?" + ", ?".repeat(assetscardcodeQueryList.size() - 1) + ")"; List<Object> params = new ArrayList<>(); for (List<String> cloumPair : assetscardcodeAndBukrsQueryList) { params.addAll(cloumPair); } params.addAll(assetscardcodeQueryList.stream().flatMap(Collection::stream).collect(Collectors.toList())); List<Map<String, Object>> rows = jdbcTemplate.query(sql, params.toArray(), new RowMapper<Map<String, Object>>() { @Override public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException { ResultSetMetaData meta = rs.getMetaData(); Map<String, Object> row = new HashMap<>(); for (int i = 1; i <= meta.getColumnCount(); i++) { row.put(meta.getColumnName(i), rs.getObject(i)); } return row; } }); // 处理查询结果 for (Map<String, Object> row : rows) { // do something } ``` 这里使用了与前面相同的动态生成SQL语句和参数设置方式,只是将参数列表改成了从Java对象中获取。最终,该方法将返回一个包含查询结果的列表,每个结果都是一个Map对象,其中包含列名和对应的值。你可以根据需要处理该结果集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值