簡體   English   中英

如何在 Java 中連接兩個字符串?

[英]How do I concatenate two strings in Java?

我正在嘗試在 Java 中連接字符串。 為什么這不起作用?

public class StackOverflowTest {  
    public static void main(String args[]) {
        int theNumber = 42;
        System.out.println("Your number is " . theNumber . "!");
    }
}

您可以使用+運算符連接字符串:

System.out.println("Your number is " + theNumber + "!");

theNumber被隱式轉換為字符串"42"

java 中的連接運算符是+ ,而不是.

在開始之前閱讀本文(包括所有小節)。 試着停止思考 php 的方式;)

為了拓寬您在 Java 中使用字符串的觀點 - 字符串的+運算符實際上(由編譯器)轉換為類似於以下內容的內容:

new StringBuilder().append("firstString").append("secondString").toString()

這個問題有兩個基本答案:

  1. [簡單] 使用+運算符(字符串連接)。 "your number is" + theNumber + "!" (如別處所述)
  2. [不太簡單]:使用StringBuilder (或StringBuffer )。
StringBuilder value;
value.append("your number is");
value.append(theNumber);
value.append("!");

value.toString();

我建議不要像這樣堆疊操作:

new StringBuilder().append("I").append("like to write").append("confusing code");

編輯:從 java 5 開始,字符串連接運算符被編譯器轉換為StringBuilder調用。 因此,上述兩種方法是相同的。

注意:空間是一種有價值的商品,正如本句所示。

警告:下面的示例 1 生成多個StringBuilder實例並且效率低於下面的示例 2

示例 1

String Blam = one + two;
Blam += three + four;
Blam += five + six;

示例 2

String Blam = one + two + three + four + five + six;

當您嘗試實現時,您有3 種開箱即用的方法將變量的值注入到String中:

1.最簡單的方法

您可以簡單地在String和任何對象或原始類型之間使用運算符+ ,它會自動連接String

  1. 如果是對象,則String.valueOf(obj)的值對應於Stringnull ”,如果objnull否則為obj.toString()的值。
  2. 在原始類型的情況下,等效於String.valueOf(<primitive-type>)

null對象示例:

Integer theNumber = 42;
System.out.println("Your number is " + theNumber + "!");

輸出:

Your number is 42!

帶有null對象的示例:

Integer theNumber = null;
System.out.println("Your number is " + theNumber + "!");

輸出:

Your number is null!

原始類型示例:

int theNumber = 42;
System.out.println("Your number is " + theNumber + "!");

輸出:

Your number is 42!

2. 顯式方式,可能是最有效的方式

您可以使用StringBuilder (或StringBuffer線程安全過時的對應物)使用append方法構建您的String

例子:

int theNumber = 42;
StringBuilder buffer = new StringBuilder()
    .append("Your number is ").append(theNumber).append('!');
System.out.println(buffer.toString()); // or simply System.out.println(buffer)

輸出:

Your number is 42!

在幕后,這實際上是最近的 Java 編譯器如何轉換使用運算符+完成的所有String連接,與以前的方式唯一的區別是您擁有完全的控制權

實際上,編譯器將使用默認構造函數,因此默認容量( 16 ),因為他們不知道要構建的String的最終長度是多少,這意味着如果最終長度大於16 ,則容量必然是擴展,在性能方面有價格。

因此,如果您事先知道最終String的大小將大於16 ,那么使用這種方法來提供更好的初始容量會更有效率。 例如,在我們的示例中,我們創建了一個長度大於 16 的String ,因此為了獲得更好的性能,應該將其重寫為:

優化示例:

int theNumber = 42;
StringBuilder buffer = new StringBuilder(18)
    .append("Your number is ").append(theNumber).append('!');
System.out.println(buffer)

輸出:

Your number is 42!

3.最易讀的方式

您可以使用String.format(locale, format, args)String.format(format, args) ,它們都依賴於Formatter來構建您的String 這允許您通過使用將被參數值替換的占位符來指定最終String的格式。

例子:

int theNumber = 42;
System.out.println(String.format("Your number is %d!", theNumber));
// Or if we need to print only we can use printf
System.out.printf("Your number is still %d with printf!%n", theNumber);

輸出:

Your number is 42!
Your number is still 42 with printf!

這種方法最有趣的方面是,我們清楚地知道最終的String是什么,因為它更易於閱讀,因此更易於維護。

Java 8 方式:

StringJoiner sj1 = new StringJoiner(", ");
String joined = sj1.add("one").add("two").toString();
// one, two
System.out.println(joined);


StringJoiner sj2 = new StringJoiner(", ","{", "}");
String joined2 = sj2.add("Jake").add("John").add("Carl").toString();
// {Jake, John, Carl}
System.out.println(joined2);

您必須是一名 PHP 程序員。

使用+號。

System.out.println("Your number is " + theNumber + "!");

對於兩個字符串的精確連接操作,請使用:

file_names = file_names.concat(file_names1);

在您的情況下,請使用+而不是.

為了獲得更好的性能,請使用str1.concat(str2)其中str1str2是字符串變量。

“+”代替“。”

使用+進行字符串連接。

"Your number is " + theNumber + "!"

這應該工作

public class StackOverflowTest
{  
    public static void main(String args[])
    {
        int theNumber = 42;
        System.out.println("Your number is " + theNumber + "!");
    }
}

在java連接符號是“ + ”。 如果您在使用 jdbc 時嘗試連接兩個或三個字符串,請使用以下命令:

String u = t1.getString();
String v = t2.getString();
String w = t3.getString();
String X = u + "" + v + "" + w;
st.setString(1, X);

這里的 "" 僅用於空格。

String.join( delimiter , stringA , stringB , … )

從 Java 8 及更高版本開始,我們可以使用String.join

警告:您必須傳遞所有StringCharSequence對象。 所以你的int變量 42 不能直接工作。 一種替代方法是使用對象而不是原始對象,然后調用toString

Integer theNumber = 42;
String output = 
    String                                                   // `String` class in Java 8 and later gained the new `join` method.
    .join(                                                   // Static method on the `String` class. 
        "" ,                                                 // Delimiter.
        "Your number is " , theNumber.toString() , "!" ) ;   // A series of `String` or `CharSequence` objects that you want to join.
    )                                                        // Returns a `String` object of all the objects joined together separated by the delimiter.
;

轉儲到控制台。

System.out.println( output ) ;

在 IdeOne.com 上實時查看此代碼

在 Java 中,連接符號是“+”,而不是“.”。

“+”不是“。”

但要小心字符串連接。 這是一個介紹來自IBM DeveloperWorks 的一些想法的鏈接。

您可以使用+運算符連接字符串:

String a="hello ";
String b="world.";
System.out.println(a+b);

輸出:

hello world.

而已

因此,從有能力的答案中,您可能已經得到了為什么您的代碼段不起作用的答案。 現在,我將添加有關如何有效執行此操作的建議。 這篇文章是作者講連接字符串的不同方式以及各種結果之間的時間比較結果的好地方

在 Java 中連接字符串的不同方式

  1. 通過使用 + 運算符 (20 + "")
  2. 通過在String類中使用concat方法
  3. 使用StringBuffer
  4. 通過使用StringBuilder

方法一:

這是一種不推薦的做法。 為什么? 當您將它與整數和字符一起使用時,您應該非常注意在附加字符串之前將整數轉換為toString() ,否則它會將字符視為 ASCI int 並在頂部執行加法。

String temp = "" + 200 + 'B';

//This is translated internally into,

new StringBuilder().append( "" ).append( 200 ).append('B').toString();

方法二:

這是內部concat方法的實現

 public String concat(String str) { int olen = str.length(); if (olen == 0) { return this; } if (coder() == str.coder()) { byte[] val = this.value; byte[] oval = str.value; int len = val.length + oval.length; byte[] buf = Arrays.copyOf(val, len); System.arraycopy(oval, 0, buf, val.length, oval.length); return new String(buf, coder); } int len = length(); byte[] buf = StringUTF16.newBytesFor(len + olen); getBytes(buf, 0, UTF16); str.getBytes(buf, len, UTF16); return new String(buf, UTF16); }

這每次都會創建一個新緩沖區,並將舊內容復制到新分配的緩沖區中。 因此,當您在更多字符串上執行此操作時,這會太慢。

方法三:

與 (1) 和 (2) 相比,這是線程安全的並且相對較快。 這在內部使用StringBuilder ,當它為緩沖區分配新內存時(假設它的當前大小為 10),它將增加 2*size + 2(即 22)。 因此,當數組變得越來越大時,這確實會表現得更好,因為它不需要每次都為每個append調用分配緩沖區大小。

 private int newCapacity(int minCapacity) { // overflow-conscious code int oldCapacity = value.length >> coder; int newCapacity = (oldCapacity << 1) + 2; if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0) ? hugeCapacity(minCapacity) : newCapacity; } private int hugeCapacity(int minCapacity) { int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; int UNSAFE_BOUND = Integer.MAX_VALUE >> coder; if (UNSAFE_BOUND - minCapacity < 0) { // overflow throw new OutOfMemoryError(); } return (minCapacity > SAFE_BOUND) ? minCapacity : SAFE_BOUND; }

方法四

StringBuilder 將是最快的String連接,因為它不是線程安全的 除非您非常確定使用它的類是單噸的,否則我強烈建議不要使用這個類。

簡而言之,在您不確定您的代碼是否可以被多個線程使用之前,請使用StringBuffer 如果您確定您的類是單例,那么繼續使用StringBuilder進行連接。

第一種方法:您可以使用“+”號來連接字符串,但這總是在打印時發生。 另一種方式:String 類包含一個連接兩個字符串的方法:string1.concat(string2);

import com.google.common.base.Joiner;

String delimiter = "";
Joiner.on(delimiter).join(Lists.newArrayList("Your number is ", 47, "!"));

這對於回答操作員的問題可能有點過頭了,但是對於更復雜的連接操作,了解它是很好的。 這個stackoverflow問題在該領域的一般谷歌搜索中排名很高,很高興知道。

您可以使用 stringbuffer、stringbuilder 以及正如我之前提到的“+”。 我不確定“+”有多快(我認為對於較短的字符串來說它是最快的),但是對於更長的時間,我認為 builder 和 buffer 大致相等(builder 稍微快一點,因為它不同步)。

這是一個在不使用第三個變量的情況下讀取和連接 2 個字符串的示例:

public class Demo {
    public static void main(String args[]) throws Exception  {
        InputStreamReader r=new InputStreamReader(System.in);     
        BufferedReader br = new BufferedReader(r);
        System.out.println("enter your first string");
        String str1 = br.readLine();
        System.out.println("enter your second string");
        String str2 = br.readLine();
        System.out.println("concatenated string is:" + str1 + str2);
    }
}

有多種方法可以做到這一點,但 Oracle 和 IBM 表示使用+是一種不好的做法,因為基本上每次連接 String 時,最終都會在內存中創建額外的對象。 它將在 JVM 中使用額外的空間,並且您的程序可能空間不足或變慢。

使用StringBuilderStringBuffer是最好的方法。 請查看上面 Nicolas Fillato 的評論,例如與StringBuffer相關的評論。

String first = "I eat";  String second = "all the rats."; 
System.out.println(first+second);

使用“+”符號可以連接字符串。

String a="I"; 
String b="Love."; 
String c="Java.";
System.out.println(a+b+c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM