鉴于toString()
下面的两个实现,首选哪一个:
public String toString(){
return "{a:"+ a + ", b:" + b + ", c: " + c +"}";
}
Run Code Online (Sandbox Code Playgroud)
要么
public String toString(){
StringBuilder sb = new StringBuilder(100);
return sb.append("{a:").append(a)
.append(", b:").append(b)
.append(", c:").append(c)
.append("}")
.toString();
}
Run Code Online (Sandbox Code Playgroud)
?
更重要的是,鉴于我们只有3个属性,它可能没有什么区别,但你会在什么时候从+
concat 切换到 StringBuilder
?
我正在寻找一个简单的公共方法或运算符,它允许我重复一些字符串n次.我知道我可以使用for循环来编写它,但我希望在必要时避免使用循环,并且某处应该存在一个简单的直接方法.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Run Code Online (Sandbox Code Playgroud)
相关:
repeat string javascript 通过重复给定次数的另一个字符串来创建NSString
编辑
当他们不是完全必要的时候我试着避免循环,因为:
即使它们隐藏在另一个函数中,它们也会增加代码行数.
读我的代码的人必须弄清楚我在循环中做了什么.即使它被评论并且具有有意义的变量名称,它们仍然必须确保它没有做任何"聪明"的事情.
程序员喜欢把聪明的东西放在for循环中,即使我把它写成"只做它想要做的事情",这并不排除有人出现并增加一些额外的聪明"修复".
他们经常容易出错.对于涉及索引的循环,往往会产生一个错误.
For循环经常重用相同的变量,增加了很难找到范围错误的机会.
For循环增加了bug猎人必须看的地方数量.
给出一个数字:
int number = 1234;
Run Code Online (Sandbox Code Playgroud)
这将是将其转换为字符串的"最佳"方式:
String stringNumber = "1234";
Run Code Online (Sandbox Code Playgroud)
我曾尝试搜索(谷歌搜索)一个答案,但没有多少似乎"值得信赖".
我想我理解强类型,但每次我查找弱类型的例子时,我最终会找到编程语言的例子,这些语言只是自动强制/转换类型.
例如,在本文中名为Typing:Strong vs. Weak,Static vs. Dynamic表示Python是强类型的,因为如果你试图:
蟒蛇
1 + "1"
Traceback (most recent call last):
File "", line 1, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)
但是,在Java和C#中这样的事情是可能的,我们并不认为它们只是因为弱类型.
Java的
int a = 10;
String b = "b";
String result = a + b;
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
C#
int a = 10;
string b = "b";
string c = a + b;
Console.WriteLine(c);
Run Code Online (Sandbox Code Playgroud)
在另一篇名为Weakly Type Languages的文章中,作者说Perl是弱类型的,因为我可以将字符串连接到数字而反之亦然,而不进行任何显式转换.
Perl的
$a=10;
$b="a";
$c=$a.$b;
print $c; #10a
Run Code Online (Sandbox Code Playgroud)
所以同样的例子使得Perl弱类型,但不是Java和C#? …
我试图了解最佳实践是什么以及为什么连接不同情况下的字符串文字和变量.例如,如果我有这样的代码
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String).append("CCCCCCCCCCC").append(D_String)
.append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
Run Code Online (Sandbox Code Playgroud)
这是这样做的吗?从这篇文章中,我注意到+
Strings 上的运算符创建了一个StringBuilder的新实例,连接了操作数,并返回了一个String转换,这似乎比调用更多的工作.append()
; 所以,如果这是真的,那就不可能了.但那怎么样String.concat()
?.append()
每次串联使用是否合适?或者仅仅是变量,文字可以附加.concat()
吗?
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String.concat("CCCCCCCCCCC")).append(D_String
.concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
Run Code Online (Sandbox Code Playgroud)
针对这些情况的最佳实践和表现的一般规则是什么?我的假设是否正确+
,它应该真的不被使用?
String
是Java中的一个特例.这是一个类,我可以在源代码中检查它,但它也有自己的中缀运算符+
,它似乎是语法糖StringBuilder
.
例如,
"Hello " + yourName;
Run Code Online (Sandbox Code Playgroud)
可能成为
new StringBuilder().append("Hello ").append(yourName).toString();
Run Code Online (Sandbox Code Playgroud)
Java中没有用户定义的运算符,所以在哪里+
指定String
?
是否可以使用相同的机制来制作其他运算符,例如向量?
对于字符串连接,我们可以使用concat()
或concat运算符(+)
.
我尝试了以下性能测试,发现concat()
字符串连接速度更快,内存效率更高.
字符串连接比较100,000次:
String str = null;
//------------Using Concatenation operator-------------
long time1 = System.currentTimeMillis();
long freeMemory1 = Runtime.getRuntime().freeMemory();
for(int i=0; i<100000; i++){
str = "Hi";
str = str+" Bye";
}
long time2 = System.currentTimeMillis();
long freeMemory2 = Runtime.getRuntime().freeMemory();
long timetaken1 = time2-time1;
long memoryTaken1 = freeMemory1 - freeMemory2;
System.out.println("Concat operator :" + "Time taken =" + timetaken1 +
" Memory Consumed =" + memoryTaken1);
//------------Using Concat method-------------
long time3 = System.currentTimeMillis();
long freeMemory3 …
Run Code Online (Sandbox Code Playgroud) 当我看到这样的东西(伪1线):
str1 + "a" + str2
Run Code Online (Sandbox Code Playgroud)
是否比以下(伪1线)更糟(或更好/相等)?
str1 + 'a' + str2
Run Code Online (Sandbox Code Playgroud)
更新:更好的例子(由@QPaysTaxes提供)以减少关于我原始示例的混淆.
我尝试了什么:
过去10年编程Java的各种东西,但我从来没有真正看到底层的东西 - 例如我会假设第二个稍微"更快/更好",因为没有为其创建的String-Object Java的斜杠标志和/或垃圾收集器必须处理更少.我曾经为Java证书做好准备,可能本来可以在那个时候更好地争论,但是我的日常业务似乎也是关于Java的"理论"必须保持最新...我知道没有任何比我indexOf('c')
应该使用的假设更好的解释而不是indexOf("C")
我想知道是否相同的字符串连接.
我也搜索了一下,但由于我的标题可能暗示我不太好描述我正在寻找的没有例子.对此我很抱歉,这个差点的可能性只是产生了重复.
我将尝试: 基于这里接受的答案字符串连接:concat()vs"+"运算符我希望能够有一个开始看到底层的什么,有一天能够争论/回答这样的问题,深入了解.
这不好吗?
(想象它更大)
int count;
//done something to count
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count;
Run Code Online (Sandbox Code Playgroud)
或者在StringBuilder/StringBuffer中更好?
我很好奇两者之间有什么区别.
我理解字符串池的方式是这样的:
这会在字符串池中创建3个字符串对象,其中2个字符串对象将丢失.
String mystr = "str";
mystr += "end";
Run Code Online (Sandbox Code Playgroud)
这不会在字符串池中创建3个对象吗?
String mystr = "str";
mystr = mystr.concat("end")
Run Code Online (Sandbox Code Playgroud)
我知道StringBuilder和StringBuffer在内存使用方面更有效率,因为要进行大量的连接.我只是好奇,如果在内存使用方面+运算符和concat之间有任何区别.
java ×10
string ×8
performance ×2
c# ×1
coding-style ×1
int ×1
numbers ×1
operators ×1
perl ×1
python ×1
weakly-typed ×1