java中传参问题的分析,基本数据类型和引用类型传参的区别,String类型传参是值传递还是引用传递?

java中没有引用传递,只有值传递

分析:java有基本数据类型和引用数据类型两种,基本数据类型变量存储的就是数值,而引用数据类型变量存储的是引用,也就是能指向堆中对象的地址

为什么说java只要值传递呢?

对于基本数据类型,传参传递的就是数值的副本,也就说把实参的数据复制给形参一份,不管形参怎么改变,实参是不受影响的

对于引用数据类型,传参传递的是引用的副本,也就说把引用(对象的地址)复制了一份,这时候实参和形参都是引用(是两个引用,指向相同,区分C语言指针传递,一个对象指针只有一个,实参和形参是一个指针),都指向在堆中相同的对象

对形参引用两种操作的区别

  • 1把形参引用指向一个新对象

              这时改变的只是形参引用的指向,而实参引用和实参引用指向的对象都没有被改变

  •  2通过形参引用找到指向的对象,并对该对象修改

             因为实参引用和形参引用指向的对象相同,这是实参引用指向的对象被修改了

具体测试代码

传参基本数据类型

        

引用数据类型

           1把形参引用指向一个新对象

        public void setInt(Integer b) {
		b = new Integer(2);
		System.out.println("b的值为:"+b);
	}
	
	public static void main(String[] args) {
		Integer a = 1;
		Test1 t = new Test1();
		
		t.setInt(a);
		System.out.println("a的值为:"+a);
		

                //没有改变a的值
		/*
		 * 输出 
		 * b的值为:2 
		 * a的值为:1
		 */

	}
        //String类的直接赋值就相当于新创建另一个对象(但还是区别直接new的,可以这样理解)
        public void setString(String s2) {
		s2 = "bb";
		System.out.println("s2的值为:"+s2);
	}
	
	public static void main(String[] args) {
		String s1 = "aa";
		
		//调用setString()方法,试图修改s1的值
		Test t = new Test();
		t.setString(s1);
		
		System.out.println("s1的值为:"+s1);
	}
	
        //没有改变s1的值
	/*
	 * 输出 
	 * s1的值为:aa 
	 * s2的值为:bb
	 */

2通过形参引用找到指向的对象,并对该对象修改

	public void setArray(int[] b) {
		b[0] = 4;
		System.out.println("b数组:"+b[0]+b[1]+b[2]);
	}
	
	public static void main(String[] args) {
		int[] a = {1,2,3};
		
		Test2 t = new Test2();
		t.setArray(a);
		
		System.out.println("a数组:"+a[0]+a[1]+a[2]);
	}
	
	//a数组的值发生了改变
	/*
	 * 输出 
	 * 423 
	 * 423
	 */
	

 

 

 

可以通过以下步骤来实现: 1. 编写 Lua 脚本,对传入的 List<Map<String,String>> 进行遍历解析。假设每个 Map 都有 "key" 和 "value" 两个字段,可以使用以下代码: ``` for i, item in ipairs(KEYS) do local map = cjson.decode(item) for k, v in pairs(map) do redis.call('HSET', 'hash:' .. i, k, v) end end ``` 这段代码会将传入的 List<Map<String,String>> 解析为多个 Map,然后将每个 Map 存入 Redis ,使用 hash:i 作为 key,其 i 为序号。 2. 在 Java 代码调用 Lua 脚本。可以使用 RedisTemplate 的 execute() 方法来执行 Lua 脚本,代码类似以下: ``` List<Map<String,String>> list = new ArrayList<>(); // 往 list 添加数据 redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { byte[] scriptBytes = script.getBytes(); byte[] keyBytes = key.getBytes(); List<byte[]> argList = new ArrayList<>(); for (Map<String,String> map : list) { argList.add(JsonUtils.toJson(map).getBytes()); } Object result = connection.eval(scriptBytes, ReturnType.VALUE, 1, keyBytes, argList.toArray(new byte[argList.size()][])); return result; } }); ``` 其,script 是 Lua 脚本的内容,key 是 Redis 的 key。在执行 eval() 方法时,将 List<Map<String,String>> 的每个 Map 转换为 JSON 字符串,并将它们作为参数传递给 Lua 脚本。最后执行结果会返回在 Redis 存储的 hash:i 的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值