关键字switch语句用于多条件判断,功能类似于if-else语句,两者性能也差不多,不能说switch会降低系统性能。在绝大部门情况下,switch语句还是有性能提升空间的。
但是在项目代码中,如果switch的case很多,然后代码也就多了,感觉和if-else差不多呢,总在想有什么更好的办法吗?能不能替换掉这么多的条件判断呢?
答案是有的。举个?来说明,先来个正常的switch使用方式,直接上代码。
@Slf4j
public class TestSwitch {
int resutl = 0;
@Test
public void testDefautl()
{
Long start = System.currentTimeMillis();
for(int i=0;i<10000000;i++)
{
//调用包含switch语句的函数
resutl = switchInt(i);
}
log.info("耗时:{}",System.currentTimeMillis()-start);
}
/**
* 根据操作数不同,返回不同的值
* @param arg 参数
* @return
*/
protected int switchInt(int arg)
{
int index = arg%10+1;
switch (index)
{
case 1: return 3;
case 2: return 6;
case 3: return 7;
case 4: return 8;
case 5: return 10;
case 6: return 16;
case 7: return 18;
case 8: return 44;
default: return -1;
}
}
}
打印结果,耗时:77
这是对一个switch操作进行了若干次循环。为了使测试用例更加接近于现实情况,每次都使用不同索引的操作数i去测试switch的性能。就分支逻辑而言,这种switch模式的性能并不差。但是如果换一种全新的思路去替代switch呢。还是举?说明吧。
@Slf4j
public class TestSwitch {
int resutl = 0;
int[] sw = new int[]{3,6,7,8,10,16,18,44};
@Test
public void testDefautl()
{
Long start = System.currentTimeMillis();
for(int i=0;i<10000000;i++)
{
resutl = arrayInt(sw,i);
}
log.info("耗时:{}",System.currentTimeMillis()-start);
}
/**
* 使用数组替换switch
* @param sw 数组
* @param arg
* @return
*/
protected int arrayInt(int[] sw,int arg)
{
int index = arg%10+1;
if(index>7 || index<1)
{
return -1;
}else
{
return sw[index];
}
}
}
打印结果,耗时:59
这个思路,使用一个连续的数组代替了switch语句。因为按索引在数组中访问数据是非常快的,至少好于switch的分支判断,因此他的速度会快于原来的实现。
参考
《Java程序性能优化》