java中关于switch case语句,多个case匹配相同的情况一些个人见解
最近遇到了这样的一个需求。有这样的一个需求, 当类型传入1,2,3,5,7,9,10,11,12,13,14的时候需要把传入的num进行累加,如果类型传入4,6的时候需要把传入的num进行替换保留最大值,如果传入8的时候需要和目标值匹配,如果等于目标值则保存。
开始的时候我使用if。。。。else的方式实现,发现算法的时间复杂度不稳定。
if(type==1
//弹球大咖
||type==2
//弹球大神
||type==3
......){
userAchievement.setFinishNum(userAchievement.getFinishNum()+finishNum);
}else.....
}
当type==1的时候判断只会执行一次,但是如果越靠后的值,执行判断的次数就会越多。这时候需要考虑使用switch...case+枚举进行优化。
先在枚举类型中加入getAchievementTypeByType的方法:
public static enum AchievementType {
INVITE_FRIENDS(1),//高朋满座
BALL_SUPERIOR(2),//弹球大咖
BALL_GOD(3),//弹球大神
MAX_SCORE(4),//经典模式中达到#分
FEARLESS(5),//浑身是胆
PASS_EXPERT(6),//通关达人
LOYAL_FANS(7),//忠实粉丝
PRECISE_CONTROL (8),//精准控分
VIEW_MARS(9),//皮肤战神
LUCK_BOX(10),//手气爆棚
CONTINUOUS_DOWN(11),//单次连续下落#层
DESTROY_KING(12),//破坏之王 累积击碎XX层
COUNT_VIDEO(13),//观看视频#次
GET_MONEY(14),//大富豪
ADD_TYPE(999);//累加类型(只为代码中返回)
// 定义私有变量
public int type ;
// 构造函数,枚举类型只能为私有
private AchievementType( int type) {
this . type = type;
}
public static AchievementType getAchievementTypeByType(int type){
switch (type) {
case 1:
return INVITE_FRIENDS;
case 2:
return BALL_SUPERIOR;
。。。。。。
}
}
GameStaticData.AchievementType aType = GameStaticData.AchievementType.getAchievementTypeByType(type);
switch (aType) {
case INVITE_FRIENDS:
case BALL_SUPERIOR:
。。。。。。
break;
default:
。。。。。。
}
break;
}
这样的确是实现了这个需求,但是发现执行效率和之前的if差不多。
现在我们就说下个人对switch case的执行过程中的一些理解:
首先switch case在编译的时候会把case分成很多个内存,每个内存地址都是用的case中的值hash过后的,switch (aType) 中首先对传入的type进行hash,然后在jvm中调用对应的case的值中的代码块进行执行,如果没有,则执行default。如果有,则执行代码块,但是