本问题已经有最佳答案,请猛点这里访问。

我容易出现"如果条件综合症",这意味着我倾向于一直使用if条件。 我很少使用三元运算符。 例如:

//I like to do this:

int a;

if (i == 0)

{

a = 10;

}

else

{

a = 5;

}

//When I could do this:

int a = (i == 0) ? 10:5;

我使用哪个有关系吗? 哪个更快? 是否有明显的性能差异? 尽可能使用最短的代码是更好的做法吗?

没关系,您应该更关注干净的代码而不是性能。在这种情况下,我认为三元运算符更干净。

另外,您可以像这样if(i == 0) a = 10; else a = 5;

不进行概要分析就显示明确需求的过早优化是不好的,不好的,不好的。使用您的未来自己将在6个月后最能理解的代码。

我同意@Niklas,但是如果您真的不喜欢三元运算符,并且您不关心真正的琐碎的性能差异,则可以将变量初始化为默认值(大概为5),并且仅使用" if"而不使用" else"重新分配它。

@Hovercraft:您自己和您的同事,很想在这里添加。

在少数情况下,三元运算符会编译为没有分支的代码序列。但是在大多数情况下,没有性能差异(或者如果存在,则可以忽略不计)。使用最容易理解的内容以及使程序逻辑更清晰的内容。

恕我直言,三元运算符太可怕了!

Does it matter which I use?

是!第二个更具可读性。您正在交易一条线,用九行有效的杂乱简洁地表达您想要的内容。

Which is faster?

都不是。

Is it a better practice to use the shortest code whenever possible?

不是"只要有可能",而是肯定只要有可能而不会造成不利影响。较短的代码至少可能更具可读性,因为它专注于相关部分而不是附带影响("样板代码")。

易读,并不意味着它重要。

如果我算对的话,甚至9行,因为那里也有太多的空白。

@Jon:是的,确实如此。可读性是有效的一切。

@Jon如果唯一的区别是可读性,那么可读性就是一切。

好了,在我提供的示例中,使用三元会更明智。

如果您可以使用较短的方法避免使用临时变量,则在内存消耗和执行时间上会有所不同。

@ xdevs23您能解释一下这个意思吗,最好举个例子吗?因为我了解您的方式绝对是错误的。

int blabla = someStaticNumber; if(blabla < 3) blabla += 3; return blabla;。相反,您可以这样做:return someStaticNumber < 3 ? someStaticNumber + 3 : someStaticNumber;

@ xdevs23(1)这些不是等效的;您不需要带if语句的临时变量,并且如果将其删除,则这两种选择是相同的。 (2)我不特别了解Java,但通常来说,任何不错的编译器都会为您的两个不相同的语句生成相同的机器代码。 —因此,不,使用if语句和条件运算符之间没有区别。

好吧,我不确定编译器是否真的摆脱了临时变量……这是一个非常糟糕的例子。大声笑

我想补充一点,三元并不总是更具可读性。考虑maxSpeed = isParkingLot() ? 5 : ( isInnerCity() ? 50 : 100);与if链或switch语句的对比。另外,当表达式变长(maxSpeed = map.getStreetType(car.getLocation()) == MapType.PARKING_LOT ? TrafficRules.getMaxSpeed(MapType.PARKING_LOT) : TrafficRules.getMaxSpeed())时,可能很难读取。

@Giszmo但是if在任何情况下都不容易阅读。长条件可以与临时变量分开。可以通过跨行中断链接的条件语句来使其变得可读。这是一种非常完善的模式,是根据多种编程语言中的条件进行分派的惯用方式。

可读性是主观的。可以达成普遍共识,但没有个别协议。因此,在这里辩论是没有意义的。

如果有任何性能差异(我怀疑),则可以忽略不计。专注于编写最简单,最易读的代码。

话虽如此,请尝试克服对条件运算符的厌恶-尽管当然有可能过度使用它,但在某些情况下它确实很有用。在您提供的特定示例中,我肯定会使用条件运算符。

为什么在这里使用条件式?我会用三元清洁。

@Jon:条件运算符是您所说的三元运算符的实际名称。它是一个三元运算符,因为它有3个操作数,但它的名称是条件运算符。

好的,谢谢您的澄清。我以为您是指显式if-else语法。

三元运算符示例:

int a = (i == 0) ? 10 : 5;

您不能使用if / else这样进行分配:

// invalid:

int a = if (i == 0) 10; else 5;

这是使用三元运算符的一个很好的理由。如果您没有作业:

(i == 0) ? foo () : bar ();

if / else没那么多代码:

if (i == 0) foo (); else bar ();

在性能至关重要的情况下:进行测量。如果存在瓶颈,请使用目标计算机,目标JVM和典型数据进行测量。否则会增加可读性。

嵌入上下文中,简短形式有时非常方便:

System.out.println ("Good morning" + (p.female ?"Miss" :"Mister") + p.getName ());

使用三元运算符还有另一个原因-它使您能够处理所有情况。

@MikeDunlavey:如果想到哦,别忘了第二种情况!让我们使用三元运算符,也可以开始编写其他操作,不要忘记它,如果您的大脑非常不可靠,则可以在编写语句的几秒钟内忘记它。

这不仅是编写" else"的问题,还包括您输入的内容。

@MikeDunlavey:我以为你的主张是,使用? :应该有助于避免忘记其他部分,这会引发问题,怎么办? :应避免忘记它。也许是因为在大多数情况下,如果没有它,生成的代码将不正确,从而引发编译器错误?好了,可以先编写else-keyword来存档。区别在哪里?

是的,这很重要,但不是因为代码执行性能。

与简单的语法构造相比,更快的(性能)编码与循环和对象实例化更相关。编译器应该进行优化(所有代码都是相同的二进制文件!),因此您的目标应该是"从头到尾"的效率(人永远是软件的瓶颈)。

Josh Bloch在Parleys.com上的"性能焦虑"演讲

引用9行而不是1行的答案可能会误导您:更少的代码行并不总是等于更好。

在有限的情况下,三元运算符可能是一种更简洁的方法(您的例子就是一个很好的例子)。

但是它们经常被滥用以使代码不可读(这是一个主要的罪过)=不要嵌套三元运算符!

还请考虑将来的可维护性,if-else易于扩展或修改:

int a;

if ( i != 0 && k == 7 ){

a = 10;

logger.debug("debug message here" );

}else

a = 3;

logger.debug("other debug message here" );

}

int a = (i != 0 && k== 7 ) ? 10 : 3;  // density without logging nor ability to use breakpoints

附:是非常完整的stackoverflow答案,是三元还是非三元?

我不同意这一点:例如,嵌套条件语句是惯用的且可读的,特别是在测试多个案例(如return x == 1 ?"one" : x == 2 ?"two" :"many";中)时。适当的缩进和分成多行在这里有帮助。

三元运算符只是简写。它们将编译为等效的if-else语句,这意味着它们将完全相同。

同样,三元运算符启用"可选"参数的形式。 Java不允许在方法签名中使用可选参数,但是当为参数值提供null时,三元运算符使您可以轻松地内联默认选项。

例如:

public void myMethod(int par1, String optionalPar2) {

String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)

.trim()

.toUpperCase(getDefaultLocale());

}

在上面的示例中,将null作为参数String传递给您默认字符串值,而不是NullPointerException。它简短而有趣,我想说,它可读性强。而且,正如已经指出的,在字节码级别上,三元运算符和if-then-else之间确实没有区别。如以上示例所示,选择哪个选项的决定完全基于可读性。

此外,此模式使您可以通过重载以下方法使String参数真正可选(如果认为这样做有用):

public void myMethod(int par1) {

return myMethod(par1, null);

}

对于给定的示例,由于特定原因,我更喜欢三元或条件运算符(?):我可以清楚地看到分配a不是可选的。 通过一个简单的示例,扫描if-else块以查看在每个子句中分配了a并不是很困难,但是可以想象每个子句中有多个分配:

if (i == 0)

{

a = 10;

b = 6;

c = 3;

}

else

{

a = 5;

b = 4;

d = 1;

}

a = (i == 0) ? 10 : 5;

b = (i == 0) ? 6  : 4;

c = (i == 0) ? 3  : 9;

d = (i == 0) ? 12 : 1;

我更喜欢后者,这样您就知道您没有错过任何作业。

尝试使用switch case语句,但通常这不是性能瓶颈。

通常可以避免使用switch块的解决方案。就其性质而言,switch适用于固定数量的允许状态。由于"允许状态"通常是一个移动目标,因此产生了软件维护责任。例如,使用enum类的解决方案通常比基于switch块的解决方案更好,更优雅。

最好使用任何读起来更好的东西-实际效果之间,性能之间存在0差异。

在这种情况下,我认为最后一个语句比第一个if语句读起来更好,但要注意不要过度使用三元运算符-有时它确实会使事情变得不太清楚。

java 三元 代替 if_关于性能:Java中的三元运算符比“ if”条件快吗?相关推荐

  1. java 多线程性能_Java中多线程的性能比较

    java 多线程性能 Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndI ...

  2. java怎么加定时器_JAVA WEB程序中添加定时器

    JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...

  3. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  4. java linkedlist 查找_Java中LinkedList真的是查找慢增删快

    测试结果 废话不多说,先上测试结果.作者分别在ArrayList和LinkedList的头部.尾部和中间三个位置插入与查找100000个元素所消耗的时间来进行对比测试,下面是测试结果 (感谢@Hosa ...

  5. java io使用哪些设计模式_JAVA IO中的设计模式

    在java语言 I/O库的设计中,使用了两个结构模式,即装饰模式和适配器模式. 在任何一种计算机语言中,输入/输出都是一个很重要的部分.与一般的计算机语言相比,java将输入/输出的功能和使用范畴做了 ...

  6. 成为Java GC专家(5)—Java性能调优原则

    2019独角兽企业重金招聘Python工程师标准>>> 这是"成为Java GC专家"系列的第五篇文章.在第一篇深入浅出Java垃圾回收机制中,我们已经学习了不同 ...

  7. java反射的优化_请问Java反射的性能为什么比直接调用慢一个数量级左右?

    Method.invoke()本身要用数组包装参数:而且每次调用都必须检查方法的可见性(在Method.invoke()里),也必须检查每个实际参数与形式参数的类型匹配性(在NativeMethodA ...

  8. java split()方法_Java编程性能优化一些事儿

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the t ...

  9. JAVA中常用的逻辑运算符_Java中常用的运算符

    运算符是一种"功能"符号,用以通知 Java 进行相关的运算,Java 语言中常用的运算符可分为如下几种: 算数运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符. 一.算数运 ...

最新文章

  1. 小时和分钟的正则表达式
  2. OCM备考 三. Managing Database Availability 之RMAN高级操作
  3. spring的aop整理
  4. cocos2d-x 帧动画
  5. [css] 遇到overflow: scroll不能平滑滚动怎么解决?
  6. html5 header和group
  7. 作为技术人员,经常遇到没有接触过的技术,有时是点滴的小技能,有时可能是大的一个研究课题,那么我们如何进行技术研究呢?
  8. 大数据到底在用什么姿势塑造我们?
  9. 计算机英语句子及翻译,英文的唯美句子带翻译 最火英文句子带翻译
  10. 毕业生推荐表特长计算机专业,优秀毕业生推荐表个人简历怎么写
  11. 冰点文库下载器,免积分下载百度文库文档
  12. VMware Workstation 激活密码
  13. neo4j图数据库导入scv文件
  14. 驴妈妈旅游携手法大大,打造分销商签约新体验
  15. H5唤起APP指南(附开源唤端库)
  16. 解决0x00000FD:Stack overflow(参数:0x00000000,0x002F2000)栈溢出问题
  17. 聊天机器人之知识图谱 Freebase 简介
  18. 基本数据类型在传参中的自顶向下和自底向上;this;访问权限修饰符
  19. 安装TensortFlow并配置到PyCharm中
  20. Vue基础语法知识(自用,完整版)

热门文章

  1. 量化交易中如何判断趋势
  2. 【数据结构与算法知识】—动态规划之01背包问题
  3. 答来信 读书和实践哪个更重要
  4. 两种学习模式---贺老师
  5. MATLAB读取BP原始数据
  6. 紫光华宇拼音4.0(Fourier) 试验版m1内部版 build 5001
  7. 第五讲 安装Ubuntu(4)
  8. SpringBoot mybatis org.apache.ibatis.io.ResolverUtil
  9. 最新彩虹云商城完整系统源码6.9.0+无需授权
  10. 正规现货白银中的技术分析是科学还是玄学?