String.format在Java中使用和字符串连接之间是否存在明显的差异?
我倾向于使用,String.format但偶尔会滑倒并使用concat.我想知道一个人是否比另一个好.
我看到它的方式,String.format给你"格式化"字符串更多的权力; 和连接意味着您不必担心意外地添加额外的%s或丢失一个%s.
String.format 也更短.
哪一个更具可读性取决于你的头部如何工作.
我们必须一直为日志输出构建字符串等等.在JDK版本中,我们学会了何时使用StringBuffer(许多追加,线程安全)和StringBuilder(许多追加,非线程安全).
有什么建议使用String.format()?它是否有效,或者我们是否被迫坚持连接性能很重要的单线?
例如丑陋的旧式,
String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";
Run Code Online (Sandbox Code Playgroud)
与整洁的新风格(可能很慢),
String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);
Run Code Online (Sandbox Code Playgroud)
注意:我的具体用例是我的代码中的数百个"单行"日志字符串.它们不涉及循环,所以StringBuilder太重量级了.我String.format()特别感兴趣.
java string performance string-formatting micro-optimization
StringBuilder sb = new StringBuilder();
// Send all output to the Appendable object sb
Formatter formatter = new Formatter(sb, Locale.US);
// Explicit argument indices may be used to re-order output.
formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
// -> " d c b a"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么2附加到$?
我需要将十进制值格式化为一个字符串,其中我总是显示至少2位小数,最多4位.
所以例如
"34.49596" would be "34.4959"
"49.3" would be "49.30"
Run Code Online (Sandbox Code Playgroud)
可以使用String.format命令完成吗?或者在java中有更简单/更好的方法来做到这一点.
我想知道为什么Java 5及以上版本在String类中使用静态方法提供了printf样式的格式化程序,如下所示:
public static String format(String format, Object... args)
Run Code Online (Sandbox Code Playgroud)
代替
public String format(Object... args)
Run Code Online (Sandbox Code Playgroud)
这样我们就可以写出"%02d".format(5)让05代替String.format("%02d", 5).
我想如果我可以修改String类,我可以添加:
public String format(Object... args) {
return format(this, args)
}
Run Code Online (Sandbox Code Playgroud)
得到相同的结果.
我发现在C#中,还使用静态方法而不是实例方法.
我想知道为什么他们决定这样做,但我没有得到解释.实例方法trim并substring返回一个新的string实例,所以他们应该做同样的事情format.
此外,该DateFormat课程还使用了这个:
public final String format(Date date)
Run Code Online (Sandbox Code Playgroud)
用于格式化日期.因此,如果我们将DateFormat的实例视为格式化程序,则String的实例也可以用作格式化程序.
有任何想法吗?
这个问题几乎与java的.Net问题相同.
你如何逃避java string.format中的%1 $字符?
我需要这样做的原因是我正在构建一个字符串,以后会有更多信息插入其中.我曾经想过让其中一个args只是"%1 $",但这似乎不是很优雅?
对不起,如果这很明显我的java有点生疏了.
我可以知道java中两者有什么区别?我正在读一本书,它可以使用它来显示字符串.
您使用哪些类来使字符串占位符起作用?
String template = "You have %1 tickets for %d",
Brr object = new Brr(template, {new Integer(1), new Date()});
object.print();
Run Code Online (Sandbox Code Playgroud) 我正在使用缓冲读取器从文本文件中一次抓取一行.我也试图使用跟踪整数从文本文件中获取行号.不幸的是BufferedReader正在跳过空行(只有/ n或回车).
有没有更好的方法来解决这个问题?会使用扫描仪吗?
示例代码:
int lineNumber = 0;
while ((s = br.readLine()) != null) {
this.charSequence.add(s, ++lineNumber);
}
Run Code Online (Sandbox Code Playgroud) 我需要用破折号将String填充到一定长度,例如:
cow-----8
cow-----9
cow----10
...
cow---100
Run Code Online (Sandbox Code Playgroud)
字符串的总长度需要为9.前缀"cow"是常量.我正在迭代输入数字.我可以用丑陋的方式做到这一点:
String str = "cow";
for (int i = 0; i < 1000; i++) {
if (i < 10) {
str += "-----";
}
else if (i < 100) {
str += "----";
}
else if (i < 1000) {
str += "---";
}
else if (i < 10000) {
str += "--";
}
str += i;
}
Run Code Online (Sandbox Code Playgroud)
我可以用字符串格式更干净地做同样的事吗?
谢谢
我必须以hh:mm格式显示时间选择器点击编辑文本.所以我使用了下面的代码.
MainActivity.java:
e6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm");
Calendar mcurrentTime = Calendar.getInstance();
int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
int minute = mcurrentTime.get(Calendar.MINUTE);
TimePickerDialog mTimePicker;
mTimePicker = new TimePickerDialog(AddFlight.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
e6.setText(selectedHour + ":" + selectedMinute);
}
}, hour, minute, true);//Yes 24 hour time
mTimePicker.setTitle("Select Time");
mTimePicker.show();
}
});
Run Code Online (Sandbox Code Playgroud)
它运行良好并显示时间选择器.但我的问题是,当我选择时间戳中的04:15时,它显示4:15.它之前不包括0.我需要在hh中显示时间选择器:mm格式.
任何人都可以帮助我.谢谢.