一,如何判断List是否为空,也就是list.isEmpty()和list.size() == 0 有何区别?

就功能的实现来说,两者之间没有什么区别,都可以用来判断集合是否为空。

我们来看API文档说明

* Returns the number of elements in this list. If this list contains * more than <tt>Integer.MAX_VALUE</tt> elements, returns * <tt>Integer.MAX_VALUE</tt>. * @return the number of elements in this list int size(); * Returns <tt>true</tt> if this list contains no elements. * @return <tt>true</tt> if this list contains no elements boolean isEmpty(); API文档给我们提供了这样2个方法,区别更多的是返回值不同,因此我们可以结合项目特点,采用合适的方法。如果我们需要返回值是Boolean类型,可以调用 list.isEmpty();如果我们需要返回值是字符串或者整形,可以调用 list.size() == 0。

二,如何判断字符串为空?

现在有一个字符串:

String testString = "YANGCQ";
我们有以下几种方法来判断:

1,equals方法

"".equals(testString);//安全的写法,推荐
testString.equals("");//不安全的写法
2,StringUtils Apache工具类包中的StringUtils工具类
StringUtils.isEmpty(testString);
StringUtils.isBlank(testString);

上面这2种方法,应该是我们经常使用的2种方法了。

首先从功能上来说,2种方法都是没有什么问题的,都可以实现我们想要实现的功能。然后就是StringUtil是null安全的,也就是说如果testString为null,也不会抛出NullPointerException异常。但是如果我们用equals方法,如果不注意的话,就可能会抛出NullPointerException异常。例如这种写法:testString.equals(""); 如果testString为null,显然就会出现NullPointerException异常了。


然后从效率上来说,equals方法的效率要高于StringUtils.isBlank。这一点很好理解,经过封装的isBlank的效率显然要低一些。但是一般情况下,字符串判断是否为空不会消耗太多的资源,所以我们也不用特别在意。 以上观点为个人观点,请谨慎参考。 Linear List (int Max List Size = 10);//构造函数 Linear List (Linear List <T>& L);//复制构造函数 ~Linear List () { delete[] element; }//析构函数 bool IsE mpty () const { return length == 0; }// 判断 线性表 是否为空 int Length() const { return length; }//返回数组长度 void SetLength(int SetLength) { length = SetLength; }//设置数组长度 int Max Size _ret() const { return Max Size ; }//返回数组最大长度 int Current_ret(void) const { return current; } bool Find(int k, T& x);//返回第k个元素至x中 int Search(const T& x) const;//返回x所在位置 Linear List <T>& Delete(int k, T& x);//删除第k个元素并将它返回至x中 Linear List <T>& Insert(int k, const T& x);//在第k个元素之后插入x Linear List <T>& Insert(const T& x);//在表尾插入x void Output(ostream& out) const; void Self_adaption_Linear List _ Size (void); void Reverse(void); bool Half(void); Linear List <T>& Alternate(Linear List <T>& A, Linear List <T>& B); Linear List <T>& Merge(Linear List <T>& A, Linear List <T>& B); Linear List <T>& Merge_1(Linear List <T>& A, Linear List <T>& B); void Split(Linear List <T>& A, Linear List <T>& B); Linear List <T>& Sort(void); /*关于前移和后移*/ void Reset(void) { current = 1; } //置current为0 T Current(void) { return element[current-1]; }//返回当前元素 bool End(void);//当且仅当当前元素为表的最后一个元素时,返回true bool Front(void);//当且仅当当前元素为表的第一个元素时,返回true void Next(void);//移动current至表中的下一个元素,如果操作失败则引发一个异常 void Previous(void);//移动current至表中的前一个元素,如果操作失败则引发一个异常 private: int length;//线性表长度 int Max Size ;//线性表最大可容纳的长度 int current;//记录线性表当前的位置 T* element;//一维动态数组 因为在遍历 list 时,会获取个锁来保证遍历的原子性,如果其他线程正在修改 list ,则 size ()方法需要等待该锁被释放才能继续执行,这可能导致阻塞。最后,组内的大佬说,可能是 list . size ()的问题, list . size ()查看大小的时候也是阻塞的,可能别的线程还在插入, list . size ()查看的时候把 list 阻塞了。今天导师在群里问下面这段代码, list 也改了线程安全的 List ,循环一万次往 list 里塞元素,为什么看 size 都是小于一万的,而且每次的值都是不一样的?仔细看了代码,确实也感觉奇怪。 Java 2集合框架图  集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。  抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。  实现类:8个实现类(实线表示),对接口的具体实现。  在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。  · Collection 接口是一组允许重复的对象。  · Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。  · List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。  · Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。  · 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。 Java 2简化集合框架图  集合接口  1.Collection 接口  用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。  (1) 单元素添加、删除操作:   boolean add(Object o):将对象添加给集合   boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o  (2) 查询操作:   int size () :返回当前集合中元素的数量   boolean isE mpty () : 判断 集合中是否有任何元素   boolean contains(Object o) :查找集合中是否含有对象o int list _ ise mpty (struct list * list ); void list _clear(struct list * list ); int list _count(struct list * list ); int list _get(struct list * list , int index); int list _remove(struct list * list , int index); void list _set(struct list * list , int index, int value); void list _add(struct list * list , int index, int value); int list _lookup(struct list * list , int value); int list _indexof(struct list * list , int value); #endif /* __ LIST _H__ */ 文章目录1 List 接口1.1 Array List 1.2LInked List 2.collections类2.1是一个集合工具类,内部保存的是静态方法2.2可变参数3.set接口3.1set接口的特点3.2hashSet3.3LinkedHashSet3.4TreeSet. 1 List 接口 List 接口继承Collection接口,元素有序,有索引,可重复 collection接口有八种常见的方法 add remove size contains clear isE mpty toArray Iterator 没有特有方法 list 特有方法 add 添加 remove删除 set修改 get查找 在实际的 开发 中经常要操作 list ,而为了避免空指针异常,我们经常需要进行判空操作。一般的写法是: if( list !=null && list . size >0){ //进行集合的操作 方法一(数据量大,效率低): if( list !=null && list . size ()>0){ 方法二(数据量大,效率高): if( list !=null &... 故: list . isE mpty ()和 list . size ()==0 没有 区别 建议 判断 一个集合有无元素   用 isE mpty ()方法.这个方法清晰,简明,一目了然! list !=null 和 ! list . isE mpty () 有什么 区别 ? public static void main(String[] args) { List < List <String>> string List s = new Array List <>(); System.out.println(string List s. size ()); System.ou 使用mybatis中的聚合函数(max()、avg())查询SQL语句,返回结果装入 List 集合 使用了以下方法 判断 空值: if (CollectionUtils.isNotE mpty ( list )) { return xxx; 结果是,无论是否从数据库中查询到值, 返回都不为空。 进一步debug发现, list . size () = 1,但 List 中值为空, 显示All elements are null 问题原因: 使用了MySQL中的聚合函数,分别是求和函数SUM()、求平均函数 List &lt;String&gt; list = new Array List &lt;String&gt;(); System.out.println(" list . isE mpty ():" + list . isE mpty ()); System.out.println(" list . size () &gt; 0:" + ( list . size () &gt; 0... 2、 list . isE mpty () 和 list . size ()==0 有啥 区别 呢     答案:没有 区别 isE mpty () 判断 有没有元素,而 size ()返回有几个元素, 如果 判断 一个集合有无元素 建议用 isE mpty ()方法.比较符合逻辑用法。 3、 list !=null 跟 ! list . isE mpt... 首先我们先看 List &lt;&gt;的部分源码,通过注释我们可以理解 isE mpty ()方法是 判断 list 中有没有元素, list . size () 判断 list 中元素的个数。 所以 list . isE mpty list . size ()==0意思是相同的。 * Returns the number of elements in this list . If this list cont...