2017-10-17 19 views
9

Để hiểu biết của tôi sau chương trình nên in 0,0 làm đầu ra.Hành vi đặc biệt của split() của chuỗi lớp

Tuy nhiên, khi tôi chạy chương trình này, tôi nhận được 1,0 làm đầu ra.

public class Test1 { 
    public static void main(String[] args) { 
     System.out.println("".split(";").length); //1 
     System.out.println(";".split(";").length);//0 
    } 
} 

Hãy giúp tôi hiểu điều gì đang xảy ra ở đây?

+0

Đây là cùng một câu hỏi được gắn thẻ với Scala: https://stackoverflow.com/questions/4964484/why-does-split-on-an Câu trả lời của Rok Kralj-empty-string-return-a-empty-array của Rok Kralj giải quyết sự mâu thuẫn đặc biệt này: https://stackoverflow.com/questions/4964484/why-does-split-on-an-empty-string-return- một mảng không-rỗng # 37796531 –

+1

@ nullpointer - Vui lòng kiểm tra loại lang, nó cho scala !!!! Bạn có nghĩ cả scala và java đều giống nhau không ??? –

+1

@LoneWolf Nó có tạo sự khác biệt không? Bạn có bất kỳ vấn đề áp dụng điều này để Java? –

Trả lời

5

đang relavant

 // If no match was found, return this 
     if (off == 0) 
      return new String[]{this}; 

     // Add remaining segment 
     if (!limited || list.size() < limit) 
      list.add(substring(off, value.length)); 
+0

Đây thực sự là câu trả lời cho câu hỏi. – shinjw

+0

Tôi sẽ thả các dòng ở trên 'if (off == 0)' để biết thêm ngữ cảnh. – shinjw

3

Bạn tìm thấy một trường hợp cạnh mát: Nếu một chuỗi không chứa char bạn chia nó bằng một mảng chỉ chứa chuỗi được trả về

Nếu char tách là trong chuỗi sau đó bạn sẽ có được một mảng chứa tất cả chia, trừ các chuỗi rỗng.

Vì vậy, trong trường hợp thứ hai kết quả phải là một mảng có hai chuỗi rỗng, nhưng hàm tách sẽ loại bỏ chúng. Trong trường hợp đầu tiên, kể từ khi chia tách đã không thực sự phân chia bất cứ điều gì, và nó không loại bỏ bất cứ điều gì.

+0

'" ;;;; ". length' cho 0, và' ";;; 1; ".length' cho 3. Trường hợp thứ hai là một hành vi rất điên rồ và bất ngờ. – clemens

+0

Cảm ơn người dùng .... :) để biện minh cho –

5

Trong trường hợp đầu tiên, bởi vì đơn giản là không phù hợp, chuỗi sẽ được trả theo phần này của Javadoc:

Nếu biểu thức không phù hợp với bất kỳ một phần của đầu vào sau đó các mảng kết quả chỉ có một phần tử, cụ thể là chuỗi này.

Đối với trường hợp thứ hai của bạn, trong trường hợp một sự chia rẽ không xảy ra, các chuỗi rỗng trailing sẽ được gỡ bỏ:

Nếu n là zero thì mô hình sẽ được áp dụng nhiều lần càng tốt, mảng có thể có độ dài bất kỳ và các chuỗi trống sau sẽ bị loại bỏ.

(tôi nhấn mạnh)

Nguồn: Javadoc

Các vấn đề liên quan