一,如何判断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
<String>
list
= new Array
List
<String>();
System.out.println("
list
.
isE
mpty
():" +
list
.
isE
mpty
());
System.out.println("
list
.
size
() > 0:" + (
list
.
size
() > 0...
2、
list
.
isE
mpty
() 和
list
.
size
()==0 有啥
区别
呢
答案:没有
区别
。
isE
mpty
()
判断
有没有元素,而
size
()返回有几个元素, 如果
判断
一个集合有无元素 建议用
isE
mpty
()方法.比较符合逻辑用法。
3、
list
!=null 跟 !
list
.
isE
mpt...
首先我们先看
List
<>的部分源码,通过注释我们可以理解
isE
mpty
()方法是
判断
list
中有没有元素,
list
.
size
()
判断
list
中元素的个数。
所以
list
.
isE
mpty
和
list
.
size
()==0意思是相同的。
* Returns the number of elements in this
list
. If this
list
cont...