鉴于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?
有许多性能提示被Java编译器淘汰,尤其是Profile-guided优化.例如,这些平台提供的优化可以极大地(根据来源)降低虚拟函数调用的成本.VM还能够进行方法内联,循环展开等.
你现在使用的其他性能优化技术有哪些,但实际上已经被更现代的JVM中的优化机制淘汰了?
我写了一个Java程序,其中,我需要追加一个字符串
" u13a2"到现有的"u1234 u12de u1386 ... u15a3".
因此,弦逐渐变得越来越长.我发现每次追加所花费的时间也变得越来越长.有什么方法可以在某种程度上改善这一点吗?
我想到的实现包括:
unicodeArray += " "+unicode;
Run Code Online (Sandbox Code Playgroud)
要么
unicodeArray = unicodeArray.concat(" "+unicode);
Run Code Online (Sandbox Code Playgroud)
他们给出了类似的表现 我认为造成这些不良表现的主要原因是特殊类型String.它为每个作业创建一个新对象.如果你也这么认为,这是否意味着我最好使用另一种类型,比如字节数组?
我正在阅读" 更好,更快,更轻的Java "(由Bruce Tate和Justin Gehtland撰写)并且熟悉敏捷类型团队的可读性要求,例如Robert Martin在其清晰的编码书中所讨论的内容.在我现在的团队中,我被告知明确不使用+运算符,因为它在运行时创建了额外的(和不必要的)字符串对象.
但是这篇文章,写于04年,讨论了对象分配是关于10个机器指令的.(基本上免费)
它还讨论了GC如何帮助降低此环境中的成本.
什么是使用之间的实际性能的权衡+,StringBuilder还是StringBuffer?(就我而言,它StringBuffer仅限于Java 1.4.2.)
StringBuffer对我来说导致丑陋,不太可读的代码,正如Tate的书中的几个例子所示.而且StringBuffer是线程同步的,这似乎有它自己的成本是大于中使用了"危险" +操作.
思想/意见?
对于字符串连接,我们可以使用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) 我根据Gigya 构建签名的说明编写了一个方法来验证指定时间戳和UID的gigya 签名.这是Gigya的psuedo代码:
string constructSignature(string timestamp, string UID, string secretKey) {
// Construct a "base string" for signing
baseString = timestamp + "_" + UID;
// Convert the base string into a binary array
binaryBaseString = ConvertUTF8ToBytes(baseString);
// Convert secretKey from BASE64 to a binary array
binaryKey = ConvertFromBase64ToBytes(secretKey);
// Use the HMAC-SHA1 algorithm to calculate the signature
binarySignature = hmacsha1(binaryKey, baseString);
// Convert the signature to a BASE64
signature = ConvertToBase64(binarySignature);
return signature; …Run Code Online (Sandbox Code Playgroud) 对于程序中的以下语句,将在堆内存和字符串常量池中创建多少个对象?
我需要明确对象创建.我读过的许多资料都没有详细说明.当对象被破坏时我很困惑.
String a="MAM"+"BCD"+"EFG"+"GFE";
Run Code Online (Sandbox Code Playgroud)
将创建多少个对象?
我正在寻找有关对象,方法和类的生命周期的良好材料,以及JVM在动态更改和修改时如何处理它们.
我知道StringBuilder应优先于String,因为String将保存在常量字符串池中,并为其分配新值不会覆盖以前的值.但是,StringBuilder是一个覆盖其先前值的对象.
另外如果我在Hibernate的支持类中有String类型的变量,我应该使用StringBuilder吗?怎么样?
...
Result result = (Result) criteria.list().get(0);
class Result{
String name;
String fname;
...
}
Run Code Online (Sandbox Code Playgroud)我有一个域模型类,该类具有toString实现,如下所示:
public String toString() {
try {
return getX() + "\n"
getY() + "\n"
getZ(); //etc.
} catch(Exception e) {
throw new RuntimeException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
的方法getX(),getY()和getZ()不是简单的吸气剂,它们可以在后台预定义的键-值对的静态地图执行查找,通常查找。他们throws SomeCheckedException中有些人签名。
我的印象是,这是不好的做法,并且有“代码异味”。toString()甚至需要进行此检查的事实对我来说都是不良设计的征兆。但我的一位同事,究竟是错捕的一般要求Exception在toString(),因为抓住了Exception进一步传播。
我认为它至少违反了KISS原则,因为这样的简单方法toString()表示需要特殊的异常处理。
那么在toString()中包含一个包罗万象的块是否有代码味道?
我发现的答案是针对捕获通用的一般情况,Exception而我大多数人都同意,如果您正在执行通用错误处理机制或批处理,那么它有望适用于通用异常。这个论点在我们的讨论中没有说服力,所以我很好奇其他观点。
我想实现一个Caesar Cipher移位,将字符串中的每个字母增加3.
我收到此错误:
possible loss of precision required char; found int
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的代码:
import java.util.Scanner;
import java.io.*;
public class CaesarCipher
{
public static void main (String [] args) {
char[] letters = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z'};
char[] message = "onceuponatime".toCharArray();
char[] eMessage = new char[message.length];
char shift = 3;
//encrypting message
for(int i = 0; i <= message.length; ++i) …Run Code Online (Sandbox Code Playgroud) 可能重复:
何时在java中使用StringBuilder
如果不是这些代码中哪一个更好,为什么
public String backAround(String str) {
int len = str.length();
StringBuilder sb = new StringBuilder(str);
char chEnd = sb.charAt(len-1);
if(len > 0){
sb = sb.append(chEnd);
sb= sb.insert(0,chEnd);
str= sb.toString();
return str;
}else{ return str;}
}
Run Code Online (Sandbox Code Playgroud)
要么
public String backAround(String str) {
// Get the last char
String back = str.substring(str.length()-1, str.length());
return back + str + back;
}
Run Code Online (Sandbox Code Playgroud) StringBuilder隐藏元音:
String bienvenue_intro = " Welcome! Java First Semester: 455, java street: City (State): Country: 575757 ";
StringBuilder sb = new StringBuilder(bienvenue_intro);
String[] introduction = bienvenue_intro.split(":");
for (int i = 0; i < bienvenue_intro.length(); i++) {
char c = bienvenue_intro.charAt(i);
if ((c == 'A') || (c == 'a') ||
(c == 'E') || (c == 'e') ||
(c == 'I') || (c == 'i') ||
(c == 'O') || (c == 'o') ||
(c == 'U') || (c == 'u')) …Run Code Online (Sandbox Code Playgroud) java ×13
string ×4
performance ×3
arrays ×1
base64 ×1
encoding ×1
encryption ×1
exception ×1
gigya ×1
heap-memory ×1
hibernate ×1
int ×1
jpa ×1
object ×1
optimization ×1
orm ×1
readability ×1
split ×1
tostring ×1