tôi có một int
mảng không có phần tử và tôi đang cố kiểm tra xem nó có trống không.
Ví dụ, tại sao điều kiện của câu lệnh if trong đoạn mã dưới đây không bao giờ đúng?
int[] k = new int[3];
if (k == null) {
System.out.println(k.length);
}
tôi có một int
mảng không có phần tử và tôi đang cố kiểm tra xem nó có trống không.
Ví dụ, tại sao điều kiện của câu lệnh if trong đoạn mã dưới đây không bao giờ đúng?
int[] k = new int[3];
if (k == null) {
System.out.println(k.length);
}
Câu trả lời:
Có một sự khác biệt chính giữa một null
mảng và một mảng trống. Đây là một thử nghiệm cho null
.
int arr[] = null;
if (arr == null) {
System.out.println("array is null");
}
"Rỗng" ở đây không có ý nghĩa chính thức. Tôi đang chọn định nghĩa trống là có 0 phần tử:
arr = new int[0];
if (arr.length == 0) {
System.out.println("array is empty");
}
Một định nghĩa khác của "trống" là nếu tất cả các yếu tố là null
:
Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
if (arr[i] != null) {
empty = false;
break;
}
}
hoặc là
Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
if (ob != null) {
empty = false;
break;
}
}
obj !- null
, có lẽ có nghĩa làobj != null
null
thuộc loại khác.
ArrayUtils.isNotEmpty(testArrayName)
từ gói org.apache.commons.lang3
đảm bảo Array không rỗng hoặc trống
Nhìn vào chiều dài của nó:
int[] i = ...;
if (i.length == 0) { } // no elements in the array
Mặc dù an toàn hơn để kiểm tra null cùng một lúc:
if (i == null || i.length == 0) { }
Tôi đến từ .net nền. Tuy nhiên, java / c # giống nhau hơn / ít hơn.
Nếu bạn khởi tạo một kiểu không nguyên thủy (mảng trong trường hợp của bạn), nó sẽ không có giá trị.
ví dụ: int[] numbers = new int[3];
Trong trường hợp này, không gian được phân bổ & mỗi phần tử có giá trị mặc định là 0.
Nó sẽ là null
, khi bạn không new
lên.
ví dụ
int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
System.out.println("yes, it is null. Please new it up");
}
numbers
chưa được khởi tạo. "Uninitialized" và null
không giống nhau.
int[] numbers
thay đổi thành int[] numbers == null
; Trong c #, nó không phải là trường hợp.
Một mảng int được khởi tạo bằng 0 nên nó thực sự sẽ không chứa null. Chỉ các mảng của Object sẽ chứa null ban đầu.
Điểm ở đây rất đơn giản là biến k không null vì nó trỏ đến mảng. Nó không quan trọng rằng bản thân mảng trống. Kiểm tra null trong bài đăng của bạn sẽ chỉ đánh giá là đúng nếu biến k không trỏ đến bất cứ điều gì.
Tôi đã thử nghiệm như dưới đây. Hy vọng nó giúp.
Integer[] integers1 = new Integer[10];
System.out.println(integers1.length); //it has length 10 but it is empty. It is not null array
for (Integer integer : integers1) {
System.out.println(integer); //prints all 0s
}
//But if I manually add 0 to any index, now even though array has all 0s elements
//still it is not empty
// integers1[2] = 0;
for (Integer integer : integers1) {
System.out.println(integer); //Still it prints all 0s but it is not empty
//but that manually added 0 is different
}
//Even we manually add 0, still we need to treat it as null. This is semantic logic.
Integer[] integers2 = new Integer[20];
integers2 = null; //array is nullified
// integers2[3] = null; //If I had int[] -- because it is priitive -- then I can't write this line.
if (integers2 == null) {
System.out.println("null Array");
}
Một int
mảng không có phần tử là không cần thiết null
. Nó sẽ chỉ là null
nếu nó chưa được phân bổ. Xem hướng dẫn này để biết thêm thông tin về mảng Java.
Bạn có thể kiểm tra độ dài của mảng:
void foo(int[] data)
{
if(data.length == 0)
return;
}
public boolean empty() {
boolean isEmpty = true;
int i = 0;
for (int j = 0; j < array.length; j++) {
if (array[j] != 0) {
i++;
}
}
if (i != 0) {
isEmpty = false;
}
return isEmpty;
}
Điều này gần giống như tôi phải kiểm tra xem một mảng int có trống không. Mặc dù điều này sẽ không hoạt động khi số nguyên trong mảng thực sự bằng không. Nó sẽ hoạt động cho {1,2,3} và nó vẫn trả về false nếu {2,0} nhưng {0} sẽ trả về true
Trong Java 8+, bạn đạt được điều này với sự trợ giúp của phương thức stream allMatch.
Đối với nguyên thủy:
int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)
Đối với đối tượng:
Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)