开心一笑
【一带孩的妈说,她最喜欢的状态是:
枯藤老树昏鸦,空调WiFi西瓜。
葛优同款沙发、夕阳西下,我就往那一趴!一趴!一趴!谁也别叫我!
最不想听到有人叫我“妈……”】
视频教程
大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……
视频地址:http://edu.csdn.net/lecturer/994
兰花.png
提出问题
项目开发过程中集合应该注意的几点???
解决问题
前言
集合作为java开发工作中一个非常重要的组成部分,基本和java字符串使用频率一样高。
我看过很多的代码,但对于集合来说,大部分都没有使用的很好。因此,我根据我们公司的项目,总结了以下几点建议,希望可以帮助各位学员彻底掌握如何使用集合。
1.集合的简单回顾
- List 集合的元素是有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。
- LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
- Vector线程同步,ArrayList、LinkedList线程不同步。
- Map 中需要输入两个值:KEY 和 Value,其中 Key 值是唯一的,不能重复,Value 值是可以重复的,Key和Value 都可以当作泛型自由传递引用数据类型,运用比较灵活。
2.Java集合与null需要注意的几点
-
List.add(null):将向集合新增一个null元素,允许存在多个null元素
-
Set.add(null):将向集合新增一个null元素,但只允许存在一个null元素
-
Map.put(null, Object):将向集合新增一个Key为null的元素,但只允许存在一个Key为null元素
-
List.addAll(null):将抛NullPointerException异常。
-
Set.addAll(null):将抛NullPointerException异常。
-
Map.putAll(null):将抛NullPointerException异常。
**3.谨慎使用原生态集合类型 **
这一点,之前在讲解数组的时候,就已经提过了。
例如:
public static void main(String[] args) {
int[] nums = new int[] { 1, 2, 3, 4, 5 };
List list = Arrays.asList(nums);
System.out.println(list.size());
// 此时输出的size为1
}
例如:
@Test
public void test(){
//禁止写原生集合
List list = new ArrayList();
Set set = new HashSet<>();
Map map = new HashMap<>();
}
4.设置集合的容量参数提高性能
//不设置容量参数
List<String> list = new ArrayList<>();
如果像上面这样使用默认的构造方法,初始容量被设置为10。当ArrayList中的元素超过10个以后,会重新分配内存空间,使数组的大小增长到16。可以通过调试看到动态增长的数量变化:10->16->25->38->58->88->...
也可以使用下面的方式进行声明:
List arrayList = new ArrayList(4);
将ArrayList的默认容量设置为4。当ArrayList中的元素超过4个以后,会重新分配内存空间,使数组的大小增长到7。可以通过调试看到动态增长的数量变化:4->7->11->17->26->...
那么容量变化的规则是什么呢?请看下面的公式:
((旧容量 * 3) / 2) + 1
一旦容量发生变化,就要带来额外的内存开销,和时间上的开销。所以,在已经知道容量大小的情况下,推荐使用下面方式进行声明:
List arrayList = new ArrayList(CAPACITY_SIZE);
即指定默认容量大小的方式。
5.集合判空的优雅方式
@Test
public void test(){
List<String> list = new ArrayList<>();
//第一种方法
if(null != list && list.size() > 0){
}
//第二种方法:简洁和优雅
if(CollectionUtils.isNotEmpty(list)){
}
}
结论:推荐大家使用第二种方法。
CollectionUtils工具类
出自 import org.apache.commons.collections.CollectionUtils;
CollectionUtils在真实项目中,是一个非常好用的工具类,使用非常频繁。它可以使代码更加简洁和安全。
6.空集合的优雅获取方式
错误的方式:
@Test
public List<String> test(){
//处理相关的业务
//......
//最后返回空的集合
return new ArrayList<>();
}
正确的方式:
@Test
public List<String> test(){
//处理相关的业务
//......
//最后返回空的集合
return Collections.EMPTY_LIST;
}
对于Set:
Collections.EMPTY_SET
对于Map:
Collections.EMPTY_MAP
7.java常用集合性能比拼
ArrayList,LinkedList,或者Map在真实项目中要学会选择,不要清一色的使用ArrayList。根据具体的业务来使用集合,才可以体现一个程序员的高超处理水平。
8.其他类型Map的熟悉和使用
- 线程安全的map:ConcurrentMap,是线程安全的。更多的例子可以百度。
- 双向map:DualHashBidiMap:DualHashBidiMap可以通过key找到value,也可以通过value找到key
- 一对多map:MultiMap 一个key不在是简单的指向一个对象,而是一组对象
固定大小map:LRUMap大小固定。它不是同步的,也不是线程安全的,新增的元素个数大于允许的最大集合个数时,则会执行LRU淘汰算法。 所有的元素在LRUMap中会根据最近使用情况进行排序。最近使用的会放在元素的最前面(LRUMap是通过链表来存储元素内容). 所以LRUMap进行淘汰时只需要删除链表最后一个即可(即header.after所指的元素对象)
影响元素的使用情况的操作:
1.put 当新增加一个集合元素对象,则表示该对象是最近被访问的
2.get 操作会把当前访问的元素对象作为最近被访问的,会被移到链接表头
注:当执行containsKey和containsValue操作时,不会影响元素的访问情况。
-
多个关键字经过组合映射map:MultiKeyedMap
-
允许Key重复的Map:IdentityHashMap
我们应该根据具体的业务场景使用相应的Map,而不是清一色的使用HashMap等等。这些都是一些真实的工作经验总结,希望大家以后在使用Map的时候可以多考虑,多现在合适的Map类型。
结束语
今天讲了很多关于集合的问题,由于时间问题,有一些知识点没办法深入下去,希望各位学员课下可以自己去研究学习。
读书感悟
来自鬼脚七《没事别随便思考人生》
- 一千万次前思后想,也赶不上一次说干就干。
- 我们最容易犯的错误是以己养鸟,用自己最喜欢的方式来对待别人。出发点是好的,但对方不一定会接受,有时候反而是种伤害。
- 快乐只存在于当下,一切的追求,都是对当下的否定,也是对快乐的抹杀。
- 懦夫为自己的失败找到了100个借口,但他还是个懦夫。
- 人生只有两件事情是公平的,一件是死亡,因为每个人都会死亡;另一件是时间,因为每个人每天都只有24小时。每个人时间分配不同,就会有不同的收获,也会有不同的人生道路。
- 所有的成功,只存在于别人的评价里。所有的失败,只存在于自己的眼光里。
经典故事
【有三个人要被关进监狱三年,监狱长给他们三个一人一个要求。
美国人爱抽雪茄,要了三箱雪茄。
法国人最浪漫,要一个美丽的女子相伴。
而犹太人说,他要一部与外界沟通的电话。
三年过后,第一个冲出来的是美国人,嘴里鼻孔里塞满了雪茄,大喊道:“给我火,给我火!原来他忘了要火了。
接着出来的是法国人。只见他手里抱着一个小孩子,美丽女子手里牵着一个小孩子,肚子里还怀着第三个。
最后出来的是犹太人,他紧紧握住监狱长的手说:“这三年来我每天与外界联系,我的生意不但没有停顿,反而增长了200%,为了表示感谢,我送你一辆劳施莱斯!”
【学习啦】心得:什么样的选择决定什么样的生活。今天的生活是由三年前我们的选择决定的,而今天我们的抉择将决定我们三年后的生活。我们要选择接触最新的信息,了解最新的趋势,从而更好的创造自己的将来。 】
大神文章
无
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!
网友评论