有人可以解释一下java中与StringBuffer相关的代码吗?

时间:2016-03-13 18:06:05

标签: java increment stringbuffer

StringBuffer sb=new StringBuffer("A");

现在增加字母A我写下面代码 -

if (sb.charAt(0)=='A') {
    sb.setCharAt(0, 'B');
} else {
    sb.setCharAt(0, 'C');
}

但在某处,我读到这可以通过以下代码完成(并且它有效!)

sb.setCharAt(0, (char)(sb.charAt(0) + 1));

有人可以解释上面的代码吗?

4 个答案:

答案 0 :(得分:1)

执行时char + int char被解释为int,表示Unicode表中已使用字符的索引。

因此,当您执行sb.charAt(0) + 1时,它与'A' + 1相同,并被评估为65 + 1,等于66(并且Unicode表中的character indexed with that value为{{ 1}})。

既然B期望作为第二个参数setCharAt,你必须(强制转换) charint,这会让你回归{{1} }}和char只是在StringBuffer中的'B'位置设置该字符。

答案 1 :(得分:0)

如果第一个字符是A,则将第一个字符更改为B。否则,将第一个字符设置为C。您修改后的版本

sb.setCharAt(0, (char) (sb.charAt(0) + 1));

只能以相同的方式分别输入AB(因为它会增加StringBuffer中的第一个字符。)

答案 2 :(得分:0)

pubEntry将检索第一个字符。所以if (Meteor.isClient) { Template.adminPublicationsEdit.helpers({ // ... isChecked: function(type) { return (this.type === type) ? "checked" : ""; } // ... }); } 会将第一个字符加1(将A转换为B,将B转换为C等)。所以,假设第一个字符是A.然后<template name="adminPublicationsEdit"> <!-- ... --> <div class="form-group js-radios"> <label for="Outlet" class="col-sm-2 control-label">Outlet</label> <div class="col-sm-10"> <label class="radio-inline"> <input type="radio" name="outlet-type" id="wp" value="wp" {{isChecked 'wp'}}>Working Paper</label> <label class="radio-inline"> <input type="radio" name="outlet-type" id="pp" value="pp" {{isChecked 'pp'}}>Published Paper</label> <label class="radio-inline"> <input type="radio" name="outlet-type" id="bk" value="bk" {{isChecked 'bk'}}>Book</label> <label class="radio-inline"> <input type="radio" name="outlet-type" id="bc" value="bc" {{isChecked 'bc'}}>Book Chapter</label> </div> </div> <!-- ... --> </template> 所以你的方法是sb.charAt(0)等。

答案 3 :(得分:0)

这是因为隐式转换。您可能知道,每个角色都有ASCII数字表示。例如,字母'A'是数字64.当你写

sb.setCharAt(0, (char) (sb.charAt(0) + 1));

它会自动将(隐式)字符转换为整数,因为它需要向其添加1。因此,您的结果变为64+1 = 65.在此之后,您显式调用类型转换运算符(char),将整数65转换为它代表的char,并且它是B.