【问题标题】:String Contatenation with primitives in java字符串连接与java中的原语
【发布时间】:2015-08-01 02:27:27
【问题描述】:

我最近刚开始学习 Java 基础知识,并且正在测试通过连接原始变量来初始化字符串变量。

public class Main{
    public static void main(String[] args){
        byte lbyte = 3;
        short lshort = 1;
        int lint = 1;
        long llong = 0;
        float lfloat = 2.0f;
        double ldouble = lfloat;
        char lchar = 'H';
        boolean lbool = true;
        String lstring = " w0r1d ";
        String lOutput = lchar+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;
        System.out.println(lOutput);
    }
}

在这段代码中,我的目标是创建一个可以输出的字符串:

H3110 w0r1d 2.0 真

但是,当我运行它时,输出是:77 w0r1d 2.0 true

意外的结果是 77,而其余的都很好。即使我假设会添加数字变量,它也只会是 5。变量 lchar 显然也被“吸收”到数字中。

77 是从哪里来的,lchar 中的 H 是怎么回事?

编辑:目标是在连接中使用尽可能多的原始变量。

Edit2:感谢所有有用的答案。

【问题讨论】:

  • 恰巧H + 5 = 77。
  • 作弊的方法是在连接行的lchar 之前添加""+,但这只是一个解决方案而不是原因的答案。
  • @ChiefTwoPencils 括号会有所帮助吗?是的,你是对的。 chars 具有 int 值 CNomad,当您最终组合 ints 和其他 primitive data 时,会发生强制转换,还是仅使用 += 运算符而不仅仅是 +

标签: java string variables concatenation primitive


【解决方案1】:

'H' 的 ASCII / Unicode 值是 72。加法是从左到右处理的,所以 lchar + lbyte'H' + (byte) 3 等于 72 + 3

如果操作数之一是字符串,您只会从+ 获得字符串结果。直到您最终连接 lstring 才会发生这种情况,这解释了为什么将所有数字(和 char)变量加在一起得到 77。lstring 右侧的所有内容都被一一连接起来,每个转换为字符串,因为所有这些 +s 的左侧操作数在那时都是字符串。

一个快速的解决办法是从"" 开始强制所有的事情都用字符串来完成。

String lOutput = ""+lchar+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;

【讨论】:

    【解决方案2】:

    77 来自您添加字符时。添加字符时,它会添加它们的值,因为它们的行为类似于整数。其他数字变量也可能加在一起。 'H' = Java 中的 72 和 72 + 3 = 75 和 75 + 1 = 76,最后是 76 + 1 = 77。

    要解决此问题,您可以将“”放在构建字符串的开头。

    修复:

    String lOutput = ""+lchar+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;
    

    【讨论】:

    • 这比必要的工作量要多得多...正如 John Kugelman 所提到的,简单地在开头放置一个空字符串将导致值连接到字符串。
    【解决方案3】:

    Java 从左到右计算表达式,所以发生的情况是,您告诉 Java 将一个字符和一个字节相加,然后 Java 将获取字符的整数值 (72) 并将整数值相加字节 (3) 到它。

    所以你真正告诉 Java 是这样做:

    String lOutput = (72+3+1+1+0)+" w0r1d"+2.0+' '+true;
    

    当 Java 使用 +" w0r1d" 时,它会将第一部分转换为字符串并将它们连接起来,但在此之前,您要添加类型,其中 + 被定义为加法,因此 Java 会将它们加起来为 77。

    要获得所需的行为,您需要从一个字符串开始,所以这样做会按照您的意愿工作:

        String lOutput = String.valueOf(lchar)+lbyte+lshort+lint+llong+lstring+ldouble+' '+lbool;
    

    【讨论】:

      【解决方案4】:

      这是用于自动类型转换。在 ASCI 图表中,大写字母“H”的整数表示为 72。首先,“H”从 char 升级为 int,然后与string 没错

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-04
        • 2012-08-28
        • 1970-01-01
        • 2014-01-23
        相关资源
        最近更新 更多