相关疑难解决方法(0)

StringBuilder vs Java中toString()的字符串连接

鉴于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 string performance stringbuilder concatenation

889
推荐指数
12
解决办法
34万
查看次数

过时的Java优化提示

有许多性能提示被Java编译器淘汰,尤其是Profile-guided优化.例如,这些平台提供的优化可以极大地(根据来源)降低虚拟函数调用的成本.VM还能够进行方法内联,循环展开等.

你现在使用的其他性能优化技术有哪些,但实际上已经被更现代的JVM中的优化机制淘汰了?

java optimization performance

42
推荐指数
4
解决办法
2万
查看次数

在Java中,如何更有效地附加字符串?

我写了一个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 arrays string

39
推荐指数
3
解决办法
19万
查看次数

StringBuilder/StringBuffer与"+"运算符

我正在阅读" 更好,更快,更轻的Java "(由Bruce Tate和Justin Gehtland撰写)并且熟悉敏捷类型团队的可读性要求,例如Robert Martin在其清晰的编码书中所讨论的内容.在我现在的团队中,我被告知明确不使用+运算符,因为它在运行时创建了额外的(和不必要的)字符串对象.

但是这篇文章,写于04年,讨论了对象分配是关于10个机器指令的.(基本上免费)

它还讨论了GC如何帮助降低此环境中的成本.

什么是使用之间的实际性能的权衡+,StringBuilder还是StringBuffer?(就我而言,它StringBuffer仅限于Java 1.4.2.)

StringBuffer对我来说导致丑陋,不太可读的代码,正如Tate的书中的几个例子所示.而且StringBuffer是线程同步的,这似乎有它自己的成本是大于中使用了"危险" +操作.

思想/意见?

java performance readability

35
推荐指数
3
解决办法
3万
查看次数

连接运算符(+)与concat()

对于字符串连接,我们可以使用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)

java string-concatenation

27
推荐指数
3
解决办法
4万
查看次数

构建和验证Gigya签名

我根据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)

java base64 encoding gigya

10
推荐指数
3
解决办法
2414
查看次数

java和内存管理中的对象生命周期?

对于程序中的以下语句,将在堆内存和字符串常量池中创建多少个对象?

我需要明确对象创建.我读过的许多资料都没有详细说明.当对象被破坏时我很困惑.

String a="MAM"+"BCD"+"EFG"+"GFE";
Run Code Online (Sandbox Code Playgroud)

将创建多少个对象?

我正在寻找有关对象,方法和类的生命周期的良好材料,以及JVM在动态更改和修改时如何处理它们.

java string object heap-memory

10
推荐指数
3
解决办法
2559
查看次数

在Java中,我应该何时更喜欢String而不是StringBuilder?

我知道StringBuilder应优先于String,因为String将保存在常量字符串池中,并为其分配新值不会覆盖以前的值.但是,StringBuilder是一个覆盖其先前值的对象.

  • 在什么情况下我应该使用String over StringBuilder反之亦然.
  • 另外如果我在Hibernate的支持类中有String类型的变量,我应该使用StringBuilder吗?怎么样?

    ...
    Result result = (Result) criteria.list().get(0);
    
    
    class Result{
       String name;
       String fname;
       ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

java orm stringbuilder hibernate jpa

9
推荐指数
1
解决办法
1202
查看次数

在toString实现中捕获通用异常-错误的做法?

我有一个域模型类,该类具有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()甚至需要进行此检查的事实对我来说都是不良设计的征兆。但我的一位同事,究竟是错捕的一般要求ExceptiontoString(),因为抓住了Exception进一步传播。

我认为它至少违反了KISS原则,因为这样的简单方法toString()表示需要特殊的异常处理。

那么在toString()中包含一个包罗万象的块是否有代码味道?

我发现的答案是针对捕获通用的一般情况,Exception而我大多数人都同意,如果您正在执行通用错误处理机制或批处理,那么它有望适用于通用异常。这个论点在我们的讨论中没有说服力,所以我很好奇其他观点。

java exception tostring

8
推荐指数
1
解决办法
152
查看次数

Java,如何实现移位密码(Caesar Cipher)

我想实现一个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 encryption

5
推荐指数
3
解决办法
10万
查看次数

StringBuilder是否应始终用于字符串操作?

可能重复:
何时在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)

java

2
推荐指数
1
解决办法
597
查看次数

如何在同一个类中将splitbuilder与splitbuilder一起使用?

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 stringbuilder split

2
推荐指数
1
解决办法
2万
查看次数

如何获取String,从1开始到n结尾?

怎么做,当用户inputs n=4 那么它应该生成一个像str="1234"

java string int

0
推荐指数
2
解决办法
80
查看次数