if(null == list || list.size() ==0 ){
}

list.isEmpty()和list.size()==0 没有区别


 

isEmpty()判断有没有元素

而size()返回有几个元素

如果判断一个集合有无元素

建议用isEmpty()方法.这清晰,简明

list!=null跟!list.isEmpty()有什么区别?

这就相当与,你要喝水,

前面就是判断是不是连水杯都没有,

后面就是判断水杯里面没有水,

连盛水的东西都没有,

这个水从何而来?

所以一般的判断是

if(list!=null && !list.isEmpty()){

这个里面取list中的值

}else{

做其他处理

}





public static boolean isEmpty(Object str) {
return (str == null || "".equals(str));
}


 




public static void main(String[] args) {
String a = new String();
String b = "";
String c = null;
if (a.isEmpty()) {
System.out.println("String a is empty");
}
if (b.isEmpty()) {
System.out.println("String b is empty");
}
if (c == null) {
System.out.println("String c = null");
}
if (null == a) {
// 编译器直接就提示了Dead code,a指向了一个新对象,肯定不是null了
System.out.println("String a =null");
}
if (a == "") {
System.out.println("a = ''");
}
if (a.equals("")) {
//由于a是字符串,字符串的比较需要用equals,不能直接用 ==
System.out.println("a = ''");
}
/*if (c.isEmpty()) {
// 这里会报空指针,即null不能使用此方法
System.out.println("c == null and c.isEmpty");
}*/

List<String> list = new ArrayList<>();
//list.add("");
if (list.isEmpty()) {
System.out.println("list is empty");
}
System.out.println(list.size());
}
/*Output:
String a is empty
String b is empty
String c = null
equals:a = ''
list is empty
0
*/


 


 




在java中,我们如何判断一个未排序数组中是否包含一个特定的值?这在java中是一个频繁非常实用的操作。那么什么样的方法才是最高效的方式?当然

,这个问题在Stack Overflow也是得票率非常高的一个问答。得票率排在最前的几个答案给出集中不同的方法,但是他们的时间复杂度却相差甚远。

本文将详细的探讨主流的方法,并给出他们各自的时间损耗。

四种方法



List
public static boolean useList(String[] arr,String value){
return Arrays.asList(arr).contains(value);
}
Set
public static boolean useSet(String[] arr,String value){
return sets.contains(value)
}
loop
public static boolean useLoop(String[] arr,String value){
for(String s:arr){
if(s.equals(value))
return true;
}
return false;
}
binarySearch
public static boolean useBinarySearch(String[] arr,String value){
int result=Arrays.binarySearch(arr,value);
if(result>0)
return true;
else
return false;
}


 

此方法是不正确的,因为Arrays的binarySearch方法必须应用于有序数组。

性能对比

如果读者熟悉以上java代码片段中出现的集中数据结构,那么可以利用时间复杂度计算标准,

先推算这四种方式的性能对比的大致结果。当然,我们这里不采用这种方式,而是直接运用

如下测试代码对比这四种方式的时间损耗情况。为了使得我们的测试结果更具有代表性,我们

针对不同的数据量做了多组测试。也许,这个测量方式并不精确,但是测量结果是清晰和可

信任的。测试的示例代码如下:

public static void main(String[] args) {

String[] arr = new String[] { “www.”, “tiantian”, “bian”, “ma”, “.com”};

long startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

// use list

useList(arr, “天天编码”);

// use set

//useSet(arr, “天天编码”);

// use loop

//useLoop(arr, “天天编码”);

// use binarySearch

//useBinarySearch(arr, “天天编码”);

long endTime = System.nanoTime();

long duration = endTime = startTime;

System.out.pri}

数组长度     方法       运行耗时      数组长度     方法       运行耗时

5          list          13        100              list         50

5         set        72       100       set         668
5         loop       5        100        loop          47
5          binarySearch   100      inarySearch    8
1k        list         112       10k        list       1590
1k       set         2055      10k          set 23819
1k        loop        99       10k         loop 1526
1k       binarySearch   12       10k        binarySearch   12
总结
参照这个表格,结论已经很明显了。最简单的Loop方法比其他任何使用集合容器的方法都更加高效。
很多的开源项目代码显示,很多Java开发者喜欢使用第一种方法(list),实际上,该方法的性能并不好。
该方法把一个数组的元素转移到一个新的集合容器中,显然,在所有的元素转移完成之前,新的集合容器处于不可用的状态。

该表格还反映出一个事实:Arrays.binarySearch()方法的性能是最好的,特别是对于数组长度很大的数组。

但是该方法要求数组必须有序,这限制住了该方法的使用场景,本文实例代码中的数组并不是有序的,

所以不应该使用该方法。

实际上,如果你确实需要高效地检查某个特定值是否被包含在某些数组或者集合容器中,

你应该考虑使用有序列表或有序树,这些集合容器查找特定值的时间复杂度是 O(log(n))。

当然,如果使用哈希集合,时间复杂度下降为 O(1)。


 



在java中,我们如何判断一个未排序数组中是否包含一个特定的值?这在java中是一个频繁非常实用的操作。那么什么样的方法才是最高效的方式?当然

,这个问题在Stack Overflow也是得票率非常高的一个问答。得票率排在最前的几个答案给出集中不同的方法,但是他们的时间复杂度却相差甚远。

本文将详细的探讨主流的方法,并给出他们各自的时间损耗。

四种方法



List
public static boolean useList(String[] arr,String value){
return Arrays.asList(arr).contains(value);
}
Set
public static boolean useSet(String[] arr,String value){
return sets.contains(value)
}
loop
public static boolean useLoop(String[] arr,String value){
for(String s:arr){
if(s.equals(value))
return true;
}
return false;
}
binarySearch
public static boolean useBinarySearch(String[] arr,String value){
int result=Arrays.binarySearch(arr,value);
if(result>0)
return true;
else
return false;
}


 

此方法是不正确的,因为Arrays的binarySearch方法必须应用于有序数组。

性能对比

如果读者熟悉以上java代码片段中出现的集中数据结构,那么可以利用时间复杂度计算标准,

先推算这四种方式的性能对比的大致结果。当然,我们这里不采用这种方式,而是直接运用

如下测试代码对比这四种方式的时间损耗情况。为了使得我们的测试结果更具有代表性,我们

针对不同的数据量做了多组测试。也许,这个测量方式并不精确,但是测量结果是清晰和可

信任的。测试的示例代码如下:

public static void main(String[] args) {

String[] arr = new String[] { “www.”, “tiantian”, “bian”, “ma”, “.com”};

long startTime = System.nanoTime();

for (int i = 0; i < 100000; i++) {

// use list

useList(arr, “天天编码”);

// use set

//useSet(arr, “天天编码”);

// use loop

//useLoop(arr, “天天编码”);

// use binarySearch

//useBinarySearch(arr, “天天编码”);

long endTime = System.nanoTime();

long duration = endTime = startTime;

System.out.pri}

数组长度     方法       运行耗时      数组长度     方法       运行耗时

5          list          13        100              list         50

5         set        72       100       set         668
5         loop       5        100        loop          47
5          binarySearch   100      inarySearch    8
1k        list         112       10k        list       1590
1k       set         2055      10k          set 23819
1k        loop        99       10k         loop 1526
1k       binarySearch   12       10k        binarySearch   12
总结
参照这个表格,结论已经很明显了。最简单的Loop方法比其他任何使用集合容器的方法都更加高效。
很多的开源项目代码显示,很多Java开发者喜欢使用第一种方法(list),实际上,该方法的性能并不好。
该方法把一个数组的元素转移到一个新的集合容器中,显然,在所有的元素转移完成之前,新的集合容器处于不可用的状态。

该表格还反映出一个事实:Arrays.binarySearch()方法的性能是最好的,特别是对于数组长度很大的数组。

但是该方法要求数组必须有序,这限制住了该方法的使用场景,本文实例代码中的数组并不是有序的,

所以不应该使用该方法。

实际上,如果你确实需要高效地检查某个特定值是否被包含在某些数组或者集合容器中,

你应该考虑使用有序列表或有序树,这些集合容器查找特定值的时间复杂度是 O(log(n))。

当然,如果使用哈希集合,时间复杂度下降为 O(1)。