java方法可变参数研究
1 问题引出
(1)缘由
最近在研究如何在项目中引入Redis缓存,于是遇到可变参数这个疑惑点,之前没有好好研究过,为了避免项目后期出现问题。
(2)项目相关技术
- SpringBoot
- Redis
- Kryo(数据存储使用二进制)
(3)疑惑点:
概述:Redis设置List时,如果rightPushAll方法,可能发生空指针异常
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void test(){
// 发生空指针异常
redisTemplate.opsForList().rightPushAll("test",null);
}
源码
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
public ListOperations<K, V> opsForList() {
if (listOps == null) {
listOps = new DefaultListOperations<K, V>(this);
}
return listOps;
}
}
class DefaultListOperations<K, V> extends AbstractOperations<K, V> implements ListOperations<K, V> {
public Long rightPushAll(K key, V... values) {
final byte[] rawKey = rawKey(key);
final byte[][] rawValues = rawValues(values);
return execute(new RedisCallback<Long>() {
public Long doInRedis(RedisConnection connection) {
return connection.rPush(rawKey, rawValues);
}
}, true);
}
}
abstract class AbstractOperations<K, V> {
byte[][] rawValues(Object... values) {
final byte[][] rawValues = new byte[values.length][];
int i = 0;
for (Object value : values) {
rawValues[i++] = rawValue(value);
}
return rawValues;
}
}
2 可变参数简单研究
(1)概述
- 可变参数能够接受0个参数
- 可变参数能够接受1个参数
- 可变参数能够接受多个参数
(2)DEMO
0个参数
public static void main(String[] args) {
test();
}
private static void test(Object... values) {
System.out.println(values.getClass()); // class [Ljava.lang.Object;
System.out.println(values.length); // 0
}
1个参数
// test1
public static void main(String[] args) {
test(1); // 1
}
// test2
public static void main(String[] args) {
test(null); // Exception in thread "main" java.lang.NullPointerException
}
// test3:这种
public static void main(String[] args) {
Object[] objects = new Object[]{null};
test(objects); // 1,不报异常了
}
private static void test(Object... values) {
System.out.println(values.getClass()); // class [Ljava.lang.Object;
System.out.println(values.length);
}
多个参数
public static void main(String[] args) {
test(1,2,3,"Test"); // 打印输出:1 2 3 Test
}
private static void test(Object... values) {
int length = values.length;
if (values == null && length == 0) return;
Object[] localValues = new Object[length];
System.arraycopy(values, 0, localValues, 0, length);
for (Object obj : localValues) {
System.out.println(obj);
}
}
3 结论
- 使用可变参数需要检查参数是否为null
- 可变参数内部使用数组实现
- 多个参数时,最好在方法内部复制一份副本,防止外部修改了参数
注:以后把字节码打印出来补充
java方法可变参数研究的更多相关文章
- java方法---可变参数
可变参数 在方法的声明中,在指定参数类型后面加一个...(省略号) 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通参数必须在它之前声明:
- java方法可变参数的写法
jdk1.5之后出现的,该写法避免了当有多个不同个数的参数方法时,对方法的重载.其实就是数组. package com.shipin; /** * @author QiaoJiafei * @vers ...
- java高级特性(3)--方法可变参数
1.特征:... 2.方法可变参数,必须是方法参数列表的最后一位. 3.一个方法只能有一个方法可变参数. 4.方法可变参数本质是一个数组. 5.调用时按照方法可变参数赋值,多余的实参被封装成一个数组, ...
- 五分钟学Java:可变参数究竟是怎么一回事?
在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就 ...
- Java 中可变参数
可变参数 Java 中可变参数 现在需要编写一个求和的功能,但是不知道有几个参数,在调用的时候才知道有几个参数,请问这如何实现呢? Java 给我们提供了一个 JDK 1.5 的新特性---可变参数 ...
- [问题记录]Java关于可变参数重载问题的测试
突然发现java的可变参数重载是存在歧义的,只是不知道java内部是怎么处理的,特意做如下实验: 测试代码如下: /** * Created by ieayoio on 16-3-1. */ publ ...
- Java方法的参数传递方式为: 值传递
Java方法的参数传递方式为: 值传递 对于基本数据类型作为参数传递时, 是"按值传递", 这点都认识很清楚. 但是, 当对象或者说引用作为参数传递, Java 的参数传递方式是& ...
- 大数据学习--day07(冒泡排序、Arrays工具类、方法可变参数)
冒泡排序.Arrays工具类.方法可变参数 冒泡排序之前写过,略 Arrays工具类 二分法查询 public static int binarySearch(int[] a,int key) 头信息 ...
- Java方法传递参数传值还是传址的问题
这几天重构项目代码遇到一个疑问:可不可以在方法A中定义一个boolean变量b为false,然后A调用方法C把b传递到C方法中经过一些列业务判断后修改为true,C执行结束后A方法中b的值还是原来的f ...
随机推荐
- Multiline f-strings
多行字符串使用fstring需要注意每行都要加fstring >>> name = "Eric" >>> profession = " ...
- Maven的New中没有Servlet问题(IDEA)
1.问题 第一次使用Maven骨架创建Web项目的时候,遇到了 New 里面没有 servlet 的问题. 2.原因 经过查询,是因为IDEA检测到项目中没有导入相关的 jar 包导致. 3.解决方法 ...
- 无法访问com.alibaba.fastjson.parser.deserializer.PropertyProcessable
某项目加入了某依赖A,IDEA里编译报了如下错误: 无法访问com.alibaba.fastjson.parser.deserializer.PropertyProcessable 错误代码行为某个使 ...
- 解决阿里云轻量级服务器mysql无法用数据库操作软件连接
第一步:去阿里云购买一台轻量应用服务器Lamp然后登录到控制台点击应用详情 点击后你可以看到一些服务器的数据 首先是访问服务器的首页地址,默认会放一个html文件在网站根目录下(即/home/www/ ...
- 数据库访问接口之ODBC
ODBC API 实现数据库操作的手段是句柄.在ODBC中,使用不同的句柄(HANDLE)来标志环境(environment).连接(Connection).语句(statement).描述符(des ...
- Windows Bat 之For 循环
Windows Bat 之For 循环 1. For 循环基本用法. 1.1 格式 在cmd窗口中: FOR %variable IN (set) DO command [command-pa ...
- kotlin 之内联函数
在lambda表达式内联函数,需要在定义函数使用inline关键字 未使用inline关键字 fun main(arg: Array<String>) { print(haha({name ...
- springboot之rabbitmq安装与实践
环境:腾讯云centos7 注意:rabbitmq安装插件,可能会报错.本人是主机名的问题,所以修改了主机名. vim /etc/hosts vim /etc/hostname 修改这两个文件,并重启 ...
- Java并发编程系列-(7) Java线程安全
7. 线程安全 7.1 线程安全的定义 如果多线程下使用这个类,不过多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的. 类的线程安全表现为: 操作的原子性 内存的可见性 不 ...
- hadoop 2.8.5安装步骤
1.创建hadoop用户,作为haoop的运行用户 2.配置JAVA_HOME环境变量,修改/etc/profile export JAVA_HOME=/usr/java/jdk1.8.0_51 ex ...