Java中if的判断条件很多怎么简化

现在有一个需求是如果是某个商户下的设备,就做相应的处理,设备有40个怎么简化。

if(number == "num1" || number == "num2"|| number == "num3"|| number == "num4"|| number == "num5"|| number == "num6"|| number == "num7"|| number == "num8"|| number == "num9"|| number == "num10"|| number == "num11"|| number == "num12"|| number == "num13"|| number == "num14"|| number == "num15"|| number == "num16"|| number == "num17"|| number == "num18"|| number == "num19"|| number == "num20"|| number == "num21|| number == "num23"|| number == "num24"|| number == "num25"|| number == "num26...." ){
    //做相应处理
}

类似这样的,有没有简单点的办法呢

谢谢大佬门啦

找到解决办法啦,谢谢大家。
下面贴出来

        List<String> list = new ArrayList<>();
        list.add("XB203039");
        list.add("XB203031");
                ......


        if(list.contains("XB20303")){
            System.out.println("true");
            ......
        }


6个回答

Boolean b = false;
for (int i = 1; i < 27; i++)
{
    if (number.equals("num" + i)) { b= true; break;}
}
if (b)
...
qq_37746483
好小一只 num1-num26只是我弄得demo,实际情况不是这样的哟,我已经把我找的解决办法更新了,谢谢啦
8 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复好小一只: 请采纳一下
8 个月之前 回复
qq_37746483
好小一只 谢谢啦,我找到解决办法啦
8 个月之前 回复

可以参考楼上方法,补充下,for中27改成40;

for (int i = 1; i < 40; i++)

如果考虑扩展和维护,可以考虑用配置的方式,比如渠道和对应的设置配置在json文件中,如

{
channelId:[number1,number2,number3...number40]
}

你可以用把相同的一批放入一个list里面
if(list.contains("参数"){
//处理
}

这个优化需要具体查看实际问题,比如第一个判断30+,并且是相同处理,那这样条件应该封一下吧?
在这就是这30+的条件都是什么规律
哎呀 解决的思路不错

建立数组,将判断条件放进去,然后以遍历数组的形式判断即可。

像这种设备名称的话推荐卸载枚举类里面,然后你可以在枚举类加一个方法,根据设备名称查询值,如果该方法返回有值说明存在,如果返回为null,说明不存在

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 多重if判断怎么优化

if(id == null || id.isEmpty()){ if(type == null){ if(name==null || name.isEmpty()){ //...select..sql... }else { //...select..sql... } }else { if(name==null || name.isEmpty()){ //...select..sql... }else { //...select..sql... } } }else { if(type == null){ if(name==null || name.isEmpty()){ //...select..sql... }else { //...select..sql... } }else { if(name==null || name.isEmpty()){ //...select..sql... }else { //...select..sql... } } }

java 如图 if里面多null的判断,看着好难受,如何优化代码?

![图片说明](https://img-ask.csdn.net/upload/201912/25/1577265789_147572.png)

大量的if,如何优化代码

bean里大量的相同的字段,每个字段都有isChecked和content属性,所以需要每一个都判断一遍是否选中,选中再显示内容 稍微举下例子 ``` public class FittingsInfo { private Field companyCn;//中文公司名 private Field companyEn;//英文公司名 private Field tel;//电话 private Field orderNum;//订单号 ... ... } public class Field { private boolean isChecked; private String content; ... ... ``` setter getter constructor都省略了 然后 ``` if (fittingsInfo.getCompanyCn().isChecked()) { ... } if (fittingsInfo.getCompanEn().isChecked()) { ... } ``` 里面逻辑全一样,少说得有三十多个字段,就一个判断几百行出去了....有没有什么办法简化代码呢

像这种很多if else的判断可以怎么优化?用什么设计模式?

VerifyCode lastVerifyCode = toBo(getRepo().getLatelyCode(mobile, type)); if (lastVerifyCode == null) { logger.error("记录不存在,手机号: {},验证码: {}", mobile, verifyCode); return false; } else if (null != lastVerifyCode.getVerifyDate()) { logger.error("验证码已校验,手机号: {},验证码: {}", mobile, verifyCode); return false; } else if (lastVerifyCode.getVerifyCount() >= VerifyCodeConfig.getCheckCount()) { logger.error("校验次数超过3次,手机号: {},验证码: {}", mobile, verifyCode); return false; } else if (!verifyCode.equals(lastVerifyCode.getVerifyCode())) { logger.error("验证码错误,手机号: {},验证码: {}", mobile, verifyCode); lastVerifyCode.setVerifyCount(lastVerifyCode.getVerifyCount() + 1); update(lastVerifyCode); return false; } else if (DateUtil.compare(DateUtil.offsetMinute(lastVerifyCode.getCreateDate(), VerifyCodeConfig.getPeriodOfValidity()), DateUtil.date()) < 0) { logger.error("验证码已失效,手机号: {},验证码: {}", mobile, verifyCode); return false; } else { lastVerifyCode.setVerifyCount(lastVerifyCode.getVerifyCount() + 1); lastVerifyCode.setVerifyDate(DateUtil.date()); update(lastVerifyCode); return true; }

如何优化这种多个if条件相同,结果不同的代码

类似于这种 ``` private CompanyFill check_fill(HttpServletRequest request) { String s = new String(); CompanyFill cfill = new CompanyFill(); cfill.setFillTime(request.getParameter("fillTime")); s = request.getParameter("id"); if (s != null && Tools.isInteger(s)) cfill.setId(Integer.parseInt(s)); s = request.getParameter("enterpriceId"); if (s != null && Tools.isInteger(s)) cfill.setEnterpriceId(Integer.parseInt(s)); s = request.getParameter("fillyear"); if (s != null && Tools.isInteger(s)) cfill.setFillyear(Integer.parseInt(s)); s = request.getParameter("status"); if (s != null && Tools.isInteger(s)) cfill.setStatus(Integer.parseInt(s)); s = request.getParameter("gdp"); if (s != null && Tools.isNumeric(s)) cfill.setGdp(Double.parseDouble(s)); s = request.getParameter("daysOfWork"); if (s != null && Tools.isNumeric(s)) cfill.setDaysOfWork(Double.parseDouble(s)); s = request.getParameter("hoursOfDay"); if (s != null && Tools.isNumeric(s)) cfill.setHoursOfDay(Double.parseDouble(s)); s = request.getParameter("totalHour"); if (s != null && Tools.isNumeric(s)) cfill.setTotalHour(Double.parseDouble(s)); s = request.getParameter("totalElec"); if (s != null && Tools.isNumeric(s)) cfill.setTotalElec(Double.parseDouble(s)); return cfill; } ```

if 嵌套过多 求大神指点

``` @RequestMapping(value = "/add", produces = "text/plain;charset=UTF-8") public ModelAndView AddBrands(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelMap map = new ModelMap(); try { //表单元素名 String[] formElements = { "bName", "bRemark" }; //获取表单元素 Map<String, Object> elementsValues = FileUpload.getFormElements(request, formElements); //上传结果 Map<String, Object> values = null; //实体 Brands brands = new Brands(); //判断表单元素是否为空 msg 存储错误信息 if (null != elementsValues.keySet() && null != elementsValues.get("msg")) { map.addAttribute("msg", EncodingTools.encodeStr(elementsValues.get("msg").toString())); } else { //实体赋值 brands.setbName(elementsValues.containsKey("bName") ? elementsValues.get("bName").toString() : ""); brands.setbRemark(elementsValues.containsKey("bRemark") ? elementsValues.get("bRemark").toString() : ""); //保存实体成功 mybatis 返回成功的ID if (0 < brandsService.addBrands(brands) && null != brands.getbId() && 0 != brands.getbId()) { //拼接路径 StringBuffer filePath = new StringBuffer(request.getSession().getServletContext().getRealPath("\\")); filePath.append("upload\\image\\logo\\"); //因为这里的路径需要保存成功的实体ID filePath.append(brands.getbId() + "\\"); String[] fileType = { "image/png" }; //取出读出表单时存储的FileItem FileItem item = (FileItem) elementsValues.get("item"); //上传图片 values = FileUpload.uploadFile(item, 1, fileType, filePath.toString()); //判断上传是否成功 if (null != values.keySet() && null == values.get("msg")) { //得到上传成功后的文件名// 这可以减少一个判断 在页面多加一个input 存储表单类型 生成名称 先保存 再上传 String fileName = values.get("fileName").toString(); brands.setbIconPath(fileName); //更新 if(0 < brandsService.editBrands(brands)){ //成功 }else{ //失败 } } else if (null != values.get("msg")) { map.addAttribute("msg", EncodingTools.encodeStr("上传图片失败!")); } map.addAttribute("msg", EncodingTools.encodeStr("添加成功!")); //return new ModelAndView("redirect:/brands/findAll", map); } else { map.addAttribute("msg", EncodingTools.encodeStr("插入数据失败!")); } } } catch (Exception e) { e.printStackTrace(); map.addAttribute("msg", EncodingTools.encodeStr("上传文件失败!")); } return new ModelAndView("redirect:/view/admin/brands/add_brands.jsp", map); } ```

if语句影响性能吗????

网络请求返回的result下 我放了很多的if语句 这会影响性能吗????? if语句影响性能吗????

超多判断的if和else需要改成设计模式或者进行其他优化吗?

``` public static String getModelLevel(String modelNum, String modelName) { String level = ""; if (modelNum.startsWith("2")) { // 固定板--完全匹配 if ("固定板".equals(modelName) || modelName.contains("支撑板") || modelName.contains("轴") || modelName.contains("辊") || modelName.contains("切刀") || modelName.contains("压刀") || modelName.contains("模具") || modelName.contains("模架") || modelName.contains("治具") || modelName.contains("方通") || modelName.contains("机架") || modelName.contains("支架") || modelName.contains("铝型材") || modelName.contains("底座") || modelName.contains("安装座") || modelName.contains("齿条") || modelName.contains("滚轮") || modelName.contains("齿轮") || modelName.contains("销") || modelName.contains("键") || modelName.contains("转塔") || modelName.contains("框架") || modelName.contains("大理石") || modelName.contains("滑台") || modelName.contains("垫圈") || modelName.contains("单轴") || modelName.contains("气缸") || modelName.contains("电机") || modelName.contains("大板") || modelName.contains("底板") || modelName.contains("支撑板") || modelName.contains("连接板") || modelName.contains("立板") || modelName.contains("侧板") || modelName.contains("安装板") || modelName.contains("电木板") || modelName.contains("动板")) { level = "A"; } else if (modelName.contains("板") || modelName.contains("支撑") || modelName.contains("轴承") || modelName.contains("加强筋") || modelName.contains("滑轨") || modelName.contains("导轨") || modelName.contains("滑座") || modelName.contains("滑道") || modelName.contains("线轨") || modelName.contains("丝杆") || modelName.contains("轴承") || modelName.contains("压") || modelName.contains("导向") || modelName.contains("调节") || modelName.contains("同步") || modelName.contains("支撑") || modelName.contains("座") || modelName.contains("轮") || modelName.contains("杆") || modelName.contains("柱") || modelName.contains("块") || modelName.contains("片") || modelName.contains("梁") || modelName.contains("圈") || modelName.contains("环") || modelName.contains("套") || modelName.contains("棒") || modelName.contains("台") || modelName.contains("安装块") || modelName.contains("安装码") || modelName.contains("支撑架") || modelName.contains("基米") || modelName.contains("法兰") || modelName.contains("组件") || modelName.contains("转盘") || modelName.contains("浮动接头") || modelName.contains("弹簧") || modelName.contains("垫板") || modelName.contains("螺钉") || modelName.contains("不常用螺丝") || modelName.contains("螺母")) { level = "B"; } else if (modelName.contains("吸盘") || modelName.contains("爪") || modelName.contains("漏斗") || modelName.contains("缓冲") || modelName.contains("扫码") || modelName.contains("感应") || modelName.contains("石") || modelName.contains("钩") || modelName.contains("勾") || modelName.contains("尺") || modelName.contains("箱") || modelName.contains("件") || modelName.contains("皮带") || modelName.contains("头") || modelName.contains("架") || modelName.contains("挡条") || modelName.contains("替罪羊") || modelName.contains("夹子") || modelName.contains("胶") || modelName.contains("拖链") || modelName.contains("铭牌") || modelName.contains("毛刷") || modelName.contains("吸板") || modelName.contains("盖板")) { level = "C"; } else if (modelName.contains("针") || modelName.contains("门") || modelName.contains("钣金") || modelName.contains("管道") || modelName.contains("爬梯") || modelName.contains("盒") || modelName.contains("桶") || modelName.contains("海绵") || modelName.contains("把手") || modelName.contains("槽") || modelName.contains("仓") || modelName.contains("护罩") || modelName.contains("玻璃") || modelName.contains("管") || modelName.contains("通道") || modelName.contains("罩") || modelName.contains("冷轧板") || modelName.contains("踏板") || modelName.contains("亚克力封板") || modelName.contains("封板") || modelName.contains("指针")) { level = "D"; } } else if (modelNum.startsWith("3")) { if (modelName.contains("台阶销") || modelName.contains("圆柱销") || modelName.contains("齿轮") || modelName.contains("键") || modelName.contains("垫圈")) { level = "A"; } else if (modelName.contains("加强筋") || modelName.contains("轴承") || modelName.contains("止回座块") || modelName.contains("止回卡爪") || modelName.contains("支架") || modelName.contains("支柱") || modelName.contains("调节") || modelName.contains("浮动接头") || modelName.contains("直线导轨") || modelName.contains("调节螺杆") || modelName.contains("回程导轨") || modelName.contains("板") || modelName.contains("限位")) { level = "B"; } else if (modelName.contains("吸盘固定座") || modelName.contains("旋钮") || modelName.contains("缓冲器限位套") || modelName.contains("光电固定块") || modelName.contains("传感器防护套") || modelName.contains("设备铭牌") || modelName.contains("线槽防护件") || modelName.contains("扎线固定座") || modelName.contains("工位铭牌") || modelName.contains("盖板") || modelName.contains("门吸") || modelName.contains("显示器安装块") || modelName.contains("罩") || modelName.contains("拖链分隔块") || modelName.contains("拉手") || modelName.contains("盒")) { level = "C"; } } else if (modelNum.startsWith("4")) { if (modelNum.startsWith("40101") || modelNum.startsWith("40206") || modelNum.startsWith("40301") || modelNum.startsWith("40303") || modelNum.startsWith("40304") || modelNum.startsWith("40405") || modelNum.startsWith("40409") || modelNum.startsWith("40108")) { level = "A"; } else if (modelNum.startsWith("40403") || modelNum.startsWith("40305") || modelNum.startsWith("40302") || modelNum.startsWith("40203") || modelNum.startsWith("40207") || modelNum.startsWith("40109") || modelNum.startsWith("40202") || modelNum.startsWith("40102")) { level = "B"; } else if (modelNum.startsWith("40104") || modelNum.startsWith("40105") || modelNum.startsWith("40106") || modelNum.startsWith("40204") || modelNum.startsWith("40205") || modelNum.startsWith("40208") || modelNum.startsWith("40306") || modelNum.startsWith("40201")) { level = "C"; } else if (modelNum.startsWith("40103") || modelNum.startsWith("40110") || modelNum.startsWith("40501") || modelNum.startsWith("40502") || modelNum.startsWith("40401") || modelNum.startsWith("40404") || modelNum.startsWith("40601") || modelNum.startsWith("40602") || modelNum.startsWith("40603") || modelNum.startsWith("40604") || modelNum.startsWith("4080") || modelNum.startsWith("40407")) { level = "D"; } } return level; } ```

是if语句后面,不是函数后面

在很多JS中有重复一样的if判断语句, 我想在if判断语句后面都加上一个函数或者变量什么的 除了在原有的所有JS中增加,还有什么类似AOP一样好的办法吗?

网络延迟 并发 会跳过if判断吗?

现在出现了一个充值问题,一直困扰了好几天,希望道友给分析一下 需求是这样的,我是限制充值金额1000,在service层中使用if 判断, 如果小于1000直接返回,但是现在发现小于1000的也有成功的充值记录。 很是费解 项目用的是ssm,什么原因出现的这种bug呢,希望有这方面经验的朋友不惜赐教。多谢 controller层代码: service层代码如下: BigDecimal fmoney = new BigDecimal(paramMap.get("money").toString());//设置充值金额 String property = PropertiesUtil.getProperty("rechargeMoney");//property文件中取值 if(null != property && !"".equals(property)){ BigDecimal rechargeMoney=new BigDecimal(property); System.err.println(NumberUtils.greaterThan(fmoney, rechargeMoney)); if(!NumberUtils.greaterThan(fmoney, rechargeMoney)){ response.setDescription("充值金额不能小于1000元"); return response; } }

[并发]判断条件同时插入数据

业务逻辑: 两个老师在同一或交叉时间段内在同一教室开课,只能有一个老师开课成功, 虽然在插入开课数据前,做了代码层面的判断,但通过压测,仍不能有效避免并发开课成功的结果,请问各位有没有一种有效的解决方案? ``` //判断教室是否占用 if (class_update_status == 1) { boolean canUse = classroomCanUse(class_id, startInputDate, endInputDate); //教室不可用 if (!canUse) { return ResultBean.setOk(1, "添加课时失败,该时间段此教室已被占用,请预约其他教室"); } } int i = lessonPeriodMapper.insertPeriod(period); //添加直播课时成功 if (i > 0) { int new_period_id = period.getPeriod_id(); int seconds=(int)((endTime- System.currentTimeMillis())/1000); redisUtils.setex(new_period_id + "_ossurl",seconds,oss_path); map.put("period_id", new_period_id); updateProgressPriodNumber(lesson_id); return ResultBean.setOk(0, "添加直播课时成功", map); } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/23/1571798878_610645.png) 开启100个并发线程 当执行延迟为1s时候并不会出现并发插入多条成功的情况,延迟为0s时候最多出现并发插入成功5条,实际场景虽然出现延迟0s的几率很少,但仍不能根本解决问题.

spring SimpleJdbcTemplate多条件查询的最佳实践.

大家好. 最近在研究jqgrid,其中牵扯到了多条件查询,而且是很高级的多条件查询. 如下图 [img]http://dl.iteye.com/upload/attachment/422393/383f4d08-c689-3219-8a37-22e66fc807b3.png[/img] 但是这就有个问题了 spring的官方文档中有查询所有字段,更新,添加 ,删除,根据某个字段进行条件查询的最佳实践例子. 但是就是没有SimpleJdbcTemplate的多条件查询字段的最佳实践例子. 目前我用到的方法如下: 随便找的一个例子 [code="java"] public List<OperatorSimple> getAllOperator(int toPage, int pageSize, String login, String name, String oper_group_id, int state) { String sql = "select p.id, p.login,p.password,p.name,p.email,p.tel,g.name,p.create_time,p.state,p.withdraw_time from oper_person_info as p " + "left join oper_group_info as g on p.oper_group_id = g.id where 1 = 1 "; Object[] params = new Object[4]; int index = 0; if (!login.equals("")) { sql += " and p.login like ? "; params[index] = login; index++; } if (!name.equals("")) { sql += " and p.name like ? "; params[index] = "%" + name + "%"; index++; } if (!oper_group_id.equals("")) { sql += " and p.oper_group_id like ? "; params[index] = oper_group_id; index++; } if (state == 1 || state == 0) { sql += " and p.state = ? "; params[index] = state; index++; } Object[] paramsEnd = new Object[index]; System.arraycopy(params, 0, paramsEnd, 0, index); int start = MysqlPaginationUtils.getStart(toPage, pageSize); sql = MysqlPaginationUtils.paginationSQLForMySQL(sql, start, pageSize); return super.getJdbcTemplate().query(sql, paramsEnd, new OperatorSimpleMapper()); }[/code] 但是这个方法我感觉好像不是最佳实践. 一来如果按照jqgrid提供的高级多条件查询,不是要写很多个if判断吗?(实际上我最高记录写了40多个...) 二来 这样也不好进行重构. 请问大家有什么好的多条件查询最佳实践吗?

JAVA中文件操作使用lastindexof获得后缀名的问题

代码如下,我输入E:\Application software\AUTO专杀.rar,追踪index函数返回的是6,也就是我的suffix是plication software\AUTO,试了很多别的文件路径,都找不到最后的那个".",请高手指教下为什么,是E:\的问题吗? ``` package javaapplication1; import java.io.*; import java.text.DateFormat; import java.util.Date; import javafx.scene.shape.Path; public class One { public static void main(String[] args) throws Exception { String path, Fsuffix; int index; Date d = new Date(); String s; s = DateFormat.getDateInstance(DateFormat.DEFAULT).format(d); BufferedReader bin = new BufferedReader(new InputStreamReader(System.in, "gb2312")); path = bin.readLine(); File f1 = new File(path); //System.out.println(path); //index = f1.getName().lastIndexOf("."); //Fsuffix = Path. File f2 = new File("d:\\" + s+"" +".rar"); if (f2.exists()) { f2.delete(); } f2.createNewFile(); RandomAccessFile RR = new RandomAccessFile(f1, "r"); RandomAccessFile RW = new RandomAccessFile(f2, "rw"); TH_FILE_RW p1=new TH_FILE_RW(RR,RW,0,(long)(f1.length()/2)); TH_FILE_RW p2=new TH_FILE_RW(RR,RW,1+(long)(f1.length()/2),f1.length()); p1.start(); p2.start(); } } class TH_FILE_RW extends Thread { RandomAccessFile RR; RandomAccessFile RW; long begin, end; public TH_FILE_RW(RandomAccessFile RR, RandomAccessFile RW, long begin, long end) { this.RR = RR; this.RW = RW; this.begin = begin; this.end = end; } long num = 0; byte bt[] = new byte[1024]; public void run() { while (true) { try{ int count=RR.read(bt); num+=count; if(count<=0) { break; } if(num>=(end-begin)) { count=count-(int)(num-(end-begin)); RW.write(bt, 0, count); break; } RW.write(bt, 0, count); }catch (Exception e) { e.printStackTrace(); } } } } ```

有好的方法可以替代 if else 和switch吗?

[code="java"]if(name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")||name.equals("name")) &nbsp;&nbsp;switch (name) { case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; case "name": break; } }[/code] 我现在前台有很多种name值,大概有60多个不同name,每个name既可以对应不同值也可以多name值组合成一个值。 我现在一个方法中条件语句判断用了大概40多个变量来判断,但是这样用if else 来判断性能显得不高。大家有什么好的方法替代if else 吗?

java中for循环没有跳出

大家好,下面的代码中Cal.size()是1,for循环应该只执行一次,但是有时却执行了多次,System.out.println("H是:"+h);打印多次都是0,循环没有跳出,很奇怪,不明白是什么问题,以下是完整代码,三个for循环是同样的问题 //每五秒钟自动遍历一次数据库,将策略数据发送至指定集中控制器 Runnable send = new Runnable() { @Override public void run() { Mysend: //for无限循环 for(;;) { try{ //byte[] cllx={1,2,3}; Convertion con=new Convertion(); gettacticsdata data=new gettacticsdata(); //读取存储在Map中已登录用户ID Map<String, SocketChannel> map = Mymap.getChannels(); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String key = it.next(); SocketChannel obj = map.get(key); //判断当前客户是否在线,如果在线就传数据,不在就删除存储在Map中的登录信息 if(obj.isActive()==true) { //查询需要下发的策略B数据 ArrayList Bal = new ArrayList(); Bal=data.GetBdata(key); //判断是否有需要下发的策略 if(Bal.size()>0) { for(int i=0;i<Bal.size();i++) { System.out.println("I是:"+i); tacticsBdata Bl=(tacticsBdata) Bal.get(i); byte[] Bdata=con.GetBdata(Bl); //SocketChannel obj = map.get(key); if(Bdata.length==32) { ByteBuf Bsend =Unpooled.copiedBuffer(Bdata); obj.writeAndFlush(Bsend); } } } //查询需要下发的策略C数据 ArrayList Cal = new ArrayList(); Cal=data.GetCdata(key); //判断是否有需要下发的策略 if(Cal.size()>0) { for(int h=0;h<Cal.size();h++) { System.out.println("H是:"+h); tacticsCdata Cl=(tacticsCdata) Cal.get(h); byte[] Cdata=con.GetCdata(Cl); //SocketChannel obj = map.get(key); if(Cdata.length==18){ ByteBuf Csend =Unpooled.copiedBuffer(Cdata); obj.writeAndFlush(Csend); } } } //查询需要下发的策略A数据 ArrayList Aal = new ArrayList(); Aal=data.GetAdata(key); //判断是否有需要下发的策略 if(Aal.size()>0) { for(int j=0;j<Aal.size();j++) { System.out.println("J是:"+j); tacticsAdata Al=(tacticsAdata) Aal.get(j); byte[] Adata=con.GetAdata(Al); if(Adata.length==14){ ByteBuf Asend =Unpooled.copiedBuffer(Adata); obj.writeAndFlush(Asend); } } } }else { System.out.println("此ChannelID已掉线: " + obj); map.remove(key); obj.close(); } } } catch(Exception e) { break Mysend; } try { //线程休眠10秒钟后再次启动 Thread.sleep(10000); } catch (InterruptedException e) { //e.printStackTrace(); } } } }; new Thread(send).start();

java中 File对象是一张图片 但是isFile()方法去返回false

目录是对的 因为试过另一张图片 显示true 唯一不同的就是true的图片比false的图片小很多(KB)

java 移动矩形的画法,求例子

我现在需要用java Swing来实现移动已有的矩形。我的问题就是我如何去判断我选中的是哪儿个矩形,而且移动以后我又如何更新(消除移动前的矩形)。这个问题我研究了很长时间,因为本身没有学过SWING,所以我真的是要崩溃了。如果谁知道希望能指点一下 [b]问题补充:[/b] 原理我明白确实不难,但是实现的时候,矩形这个对象的判断总是会出错,因为是多个矩形,所以判断选择矩形也很困难。最好是有代码帮我说明一下,谢谢了 [b]问题补充:[/b] 我差不多用的也是这个方法:我是设置的Vector<Rectangle>,然后每次画矩形,就把这个对象添加进去。但是出现问题就是,添加后的元素覆盖了之前的元素,长度的是正确的,但是元素全部都是最后一次添加的元素。 还有我用的是mouseDraggeds监听事件,应该是没有关系的吧,判断条件和你说的差不多。 [b]问题补充:[/b] 没有写if,不是这个问题。同样的我使用List也是这个问题。

大家线上Java应用的热更新都是怎么实现的?

热更新的时候需要注意哪些点呢? 下面是从网上找到的两种解决方法: 解决方案一 : 自定义类加载器。 首先需要明白一点,class相等的判断条件不仅仅是类名相同,还需要加载它的ClassLoader相同。JVM内部规定一个ClassLoader不可以重复定义类,也就是说想要重定义一个类,就必须使用一个全新的ClassLoader。 JVM内部class被卸载的条件及其苛刻,甚至没有明确的方法可以直接调用,只有当加载该类型的类加载器实例为unreachable状态时,也就是没有任何实例,class才有可能被卸载。(启动类加载器实例永远为reachable状态,由启动类加载器加载的类型可能永远不会被卸载) ``` public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class<?> clazz = null; // 首先检查请求的类型是否已经被这个类装载器装载到命名空间中了,如果已经装载,直接返回;否则继续。 if (name.startsWith("com.wafer") || name.contains("Service")) { if (resolve) { resolveClass(clazz); // 链接指定的 Java 类 } // 如果class类被修改过,则重新加载 MoeLoader hcl = new MoeLoader(url); clazz = customLoad(name, hcl); return (clazz); } // 如果类的包名为"java."开始,则有系统默认加载器加载 try { // 得到系统默认的加载cl ClassLoader system = ClassLoader.getSystemClassLoader(); clazz = system.loadClass(name); // 加载名称为 name的类 if (clazz != null) { if (resolve) resolveClass(clazz); return (clazz); } } catch (ClassNotFoundException e) { // Ignore } return customLoad(name, this); } ``` 此范例的核心在于缓存自己已经加载的class,当再次需要加载时,如果发生变更,则可以new一个ClassLoader,这样新的字节码便可以即时生效。 JRbel是一种热更新的方案,它实现的方式是通过在启动参数中添加javaagent,即JVM底层提供的Instrumentation技术,来改变生成对象的方式。 解决方法二: java.lang.instrument这个类很早就出了,redefineClasses这个方法可以更新方法级别的代码,但是不会触发一个类的初始化方法。游戏服务器的bug基本上只需要方法级别的更新就可以了,因为很多重大的bug基本在测试阶段被修复了,少量偶线的bug出现之后有些时候仅仅只需要改动一行代码却有时不得不需要重启所有应用程序,代价都似乎有点大。 现在开始从instrument入手 ``` public static void premain(String agentArgs, Instrumentation inst); public static void agentmain(String agentArgs, Instrumentation inst); ``` 这两个方法都可以获取到Instrumentation对象,通过redefineClasses方法就可以更新对应的方法了 如果是调用premain这个方法 则需要在程序启动的时候指定对应的jar 同时项目里必须引用这个jar 因为获取到这个引用 java -javaagent:agent.jar -jar xx.jar 例如这样 执行这条命令后程序会查找 agent.jar 里的MANIFEST.MF文件里的Premain-Class参数 设置对应的代理类路径就行。例如:Premain-Class: com.test.JavaAgent 还需要加上 Can-Redefine-Classes: true这个参数才能调用redefineClasses方法。同时 可以拦截对应的类添加标记 做性能分析 agentmain 是通过指定对应的进程pid来加载对应的agent.jar 很典型的jconsule jvisualvm都是通过选择java进程来做一个简单的内存 和cpu分析 ,线程dump .Agent-Class 和上面一样 ``` package com.test; import java.lang.instrument.Instrumentation; public class JavaAgent { public static Instrumentation INST = null; public static void premain(String agentArgs, Instrumentation inst){ INST = inst; } } ``` 这里保存下引用就可以了 ,单独打成agent.jar ``` package com.test; import java.io.FileInputStream; import java.lang.instrument.ClassDefinition; public class Test { public static void main(String[] args) { getInfo(); testhot(); } public final static void testhot(){ new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(true){ try { if(JavaAgent.INST != null){ FileInputStream is = new FileInputStream("/Users/xxxx/Downloads/Student.class"); byte[] array = new byte[is.available()]; is.read(array); is.close(); Class cls = Class.forName("com.test.Student"); JavaAgent.INST.redefineClasses(new ClassDefinition(cls,array)); } Thread.sleep(1000); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } public final static void getInfo(){ new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(true){ //System.out.println("=============="+JavaAgent.INST); new Student().getName(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } } ``` 上面就是一个很简单的例子,一个线程在不停的循环检测更新这个类,另外的一个线程在不停的输出这个对象对应的方法输出信息。 测试之后可以发现 ,方法的输出信息已经改变了。

java的阻塞while如何避免并发量大时不掉数据呢

在做一个socket的小应用,在监听是否有数据输入时使用了while,其中有Thread.sleep(10),主要是为了防止cpu满负载。因为服务器是单CPU的,之前就出现了这个情况,如果直接while没有sleep的话,CPU很快就100%了。 如果我Socket socket = server.accept();包裹在一个while里,那是否在并发量多的时候,就一定会有一些连接丢失? while(!stop){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } String con = null; try { con = is.readUTF(); } catch (IOException e1) { e1.printStackTrace(); stop = true; } if(con!=null)putRevData(con);//putRevData是一个ArrayList,将收到的数据先存入队列里等待处理 } 这里的readUTF好像也是阻塞的,应该不会丢失。 但是如果是 while(true){ Thread.sleep(10); socket = server.accept(); if(socket != null){ //做处理。这里将开启新的线程,并将其放入一个HashMap中,等待其他连接进入 } } 如果是这样的话,那是否在并发多的时候,就会有sokcet接收不到了呢? 我自己做了一个测试,用for不断的输入数据,在阻塞接收中有很多数据就掉了。 如果放入数据的线程sleep大于接收数据的sleep,就能全接收到数据,但是一旦小于就会不通程度的丢失数据。 class TestSleep extends Thread{ private ArrayList<String> a = new ArrayList<String>(); String rev = null; boolean stop,start = false; public synchronized void push(){ this.a.add(rev); rev = null; } public void shut(){ this.stop = true; } public synchronized void put(String a){ this.rev = a; } public synchronized void setRevNull(){ this.rev = null; } public void show(){ System.out.println(a); } public boolean isStart(){ return this.start; } public void run(){ while(!stop){ if(!this.start) this.start = true; try { Thread.sleep(5); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } if(rev!=null){ push(); } } show(); } } class putA extends Thread{ TestSleep ts = null; String con = null; putA(TestSleep a){ this.ts = a; } void setStr(String a){ con = a; } public void run(){ ts.put(con); } } public class TempTest { public static void main(String[] args) throws JSONException, IOException, InterruptedException { TestSleep a = new TestSleep(); a.start(); Map<Integer,putA> map = new HashMap<Integer,putA>(); for(int i = 0;i<10;i++){ Thread.sleep(4); putA b = new putA(a); b.setStr("num"+i); map.put(i, b); b.start(); } System.out.println(map.size()); Iterator<Map.Entry<Integer, putA>> entries = map.entrySet().iterator(); while(map.size()!=0){ while(entries.hasNext()){ Map.Entry<Integer, putA> entry = entries.next(); if(!entry.getValue().isAlive())entries.remove(); } } a.shut(); } } 这是一个很矛盾的事情。因为while里必须得用一个sleep才能避免cpu负载的问题,但是如果一旦加了sleep,在并发量大的时候一定会有数据掉的。 想到了可以用java.nio的包来监听。但是好像Nio的包也只是对传统阻塞io做了另一个封装而已,那实现原理呢? 请大神指点一下。

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

将一个接口响应时间从2s优化到 200ms以内的一个案例

一、背景 在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧… 本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。 二、步骤 2.1 定位 定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。 2.1.1 工具监控 就工具而言,推荐使用 arthas ,用到的是 trace 命令 具体安装步骤很简单,大家自行研究。 我的使用步骤是...

学历低,无法胜任工作,大佬告诉你应该怎么做

微信上收到一位读者小涛的留言,大致的意思是自己只有高中学历,经过培训后找到了一份工作,但很难胜任,考虑要不要辞职找一份他能力可以胜任的实习工作。下面是他留言的一部分内容: 二哥,我是 2016 年高中毕业的,考上了大学但没去成,主要是因为当时家里经济条件不太允许。 打工了三年后想学一门技术,就去培训了。培训的学校比较垃圾,现在非常后悔没去正规一点的机构培训。 去年 11 月份来北京找到了一份工...

JVM内存结构和Java内存模型别再傻傻分不清了

JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关,本文针对这两个总是被混用的概念展开讲解。 JVM内存结构 JVM构成 说到JVM内存结构,就不会只是说内存结构的5个分区,而是会延展到整个JVM相关的问题,所以先了解下

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Google 与微软的浏览器之争

浏览器再现“神仙打架”。整理 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从 IE 到 Chrome,再从 Chrome 到 Edge,微软与...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

立即提问
相关内容推荐