java从0开始学习第九课--集合是程序员是基本素养(2)
好,我们讲完了一些虚的概念,直接来搞些实的玩意,我相信大家看完我这篇文章,并且按照我的例子都跑了一遍之后,会发现自己原来是多么的牛逼!!!
我们先从最常用的list说起吧,我们先学一个方法:add方法,我们通过一个小程序来看看,arrayList,linkedlist,vector到底谁是博尔特!我们直接看代码吧,代码非常非常简单,就是同时执行
1000000次的添加动作,谁用的时间少,谁最快。let's go!
public class Test {
public static void main(String[] args) {
int times=1000000;
arrayList(times);
//linkedList(times);
//vector(times);
}
private static void arrayList(int times){
Date begin=new Date();
List arrayList=new ArrayList<Object>();
for(int i=0;i<times;i++){
arrayList.add(new Object());
}
Date end=new Date();
double time=end.getTime()-begin.getTime();
System.out.println("arrayList先生花了:"+time);
}
private static void linkedList(int times){
Date begin=new Date();
List linkedList=new LinkedList<Object>();
for(int i=0;i<times;i++){
linkedList.add(new Object());
}
Date end=new Date();
double time=end.getTime()-begin.getTime();
System.out.println("linkedList先生耗时:"+time);
}
private static void vector(int times){
Date begin=new Date();
List vector=new Vector<Object>();
for(int i=0;i<times;i++){
vector.add(new Object());
}
Date end=new Date();
double time=end.getTime()-begin.getTime();
System.out.println("vector先生用了:"+time);
}
}
由于他们一起跑会出现资源分配不均匀的问题(只有1条跑道,会拥挤),我们分别跑他们(一次跑一个,把另外2个注释掉)。结果为:
linkedList先生耗时:1355.0
vector先生用了:78.0
arrayList先生花了:47.0
没有错,arraylist是百米冠军,不过他领先第二名vector先生并不多,可能vector先生今天状态不好,大家多跑几次会发现有时候是vector先生胜出的。但是,他们是遥遥得把linkedlist先生甩到了脑后。
原来是这样的,vector,ArrayList是基于动态数组的,LinkedList基于链表的。我们用脚指头想一下,链表是什么的东西?
所以,在末尾添加一个d的时候,首先要把c的信息放到d的车头,然后把d的信息放到c的车尾,能不慢吗?
但是,这意味着获取中间元素或者删除修改某个元素的时,linkedlist的速度要比其他两个都快。
我这么幸苦画图,大家能不能在留言区赞美我两句?
然后有一点很重要,这个vector的实现机制跟List是一样的,但是人家vector是线程安全的,这一点,关于线程安全,以后再讲。
接下来,我们讲一下list的一些重要的招式,依然会非常非常爽,大家打开你的eclipse跟着我左手右手一个慢动作···
第一个动作:添加 add,上面已经有了,不再啰嗦
第二个动作:删除 remove,可以删除某个位置的元素,也可以直接删除某个元素,不清楚?看代码!!
public static void main(String[] args) {
List list=new ArrayList<String>();
String a="1.你好啊大神!";
String b="2.你好啊小鬼!";
String c="3.给个评论呗?";
String d="4.滚····";
list.add(a);
list.add(b);
list.add(c);
list.add(d);
System.out.println("一开始是这样的:"+list.toString());
list.remove(2);
System.out.println("remove(2)之后呢:"+list.toString());
list.remove(b);
System.out.println("reomver(a)之后就:"+list.toString());
list.removeAll(list);
System.out.println("removeAll就是:"+list.toString());
}
一开始是这样的:[1.你好啊大神!, 2.你好啊小鬼!, 3.给个评论呗?, 4.滚····]
remove(2)之后呢:[1.你好啊大神!, 2.你好啊小鬼!, 4.滚····]
reomver(a)之后就:[1.你好啊大神!, 4.滚····]
removeAll就是:[]
第三个动作:获取长度,size
第四个动作:获取第几个元素 list.get(i);这个方法相当相当常用,我们可以用来遍历list,来我们一起来搞一波!!兄弟们,一定要多敲代码,只有多干,才能够泡到白富美(````),如果已经泡到了,更应该多干····
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
String a="1.你好啊大神!";
String b="2.你好啊小鬼!";
String c="3.给个评论呗?";
String d="4.滚····";
list.add(a);
list.add(b);
list.add(c);
list.add(d);
System.out.println(list.size());
for(int i=0;i<list.size();i++){
String str=list.get(i);
System.out.println("第"+i+"个元素是:"+str);
}
}
list的其他方法,我就不讲了,大家有兴趣可以去看看。现在我们要讲Map了,这个Map也是非常常用的,面试也是屡屡问到。我们先来讲一下什么map,有同学问这是地图的意思,难道大佬琛今天要给我们讲怎么做地图软件吗?我上去就是一巴掌! map,在java中,不是地图,而是,传说中的键值对。大家看我这句代码:
Map map=new HashMap();
map.put("name","大佬琛");
map.put("age","18");
大家看到没有,这个就是咱们的map类,可以用来存放多个资料,但是不能重复,如果我再加一条
map.put("age","17");那么就会把之前的18岁给覆盖掉了。哎呀,一不小心就暴露了人家的年龄··
我们先看看map一些操作,尤其是遍历map,大家可以认真学一下,很给力
Map map= new HashMap();
map.put("a", "我要升职加薪");
map.put("b", "出任ceo");
map.put("c", "迎娶白富美");
map.put("d", "走向人生的巅峰");
map.put("d", "走向人生的巅峰2");
for(Object obj : map.keySet()){ //遍历map
Object value = map.get(obj );
System.out.println(value);
}
System.out.println(map.containsKey("a"));//有没有该key
System.out.println(map.containsValue("出任ceo"));//有没有该value
System.out.println(map.isEmpty());//是不是空的
System.out.println(map.size());//map里有多少个元素
System.out.println(map.remove("c"));//删掉key=c的元素
System.out.println(map.size());
运行结果是这样的:
走向人生的巅峰2
出任ceo
迎娶白富美
我要升职加薪
true
true
false
4
迎娶白富美
3
我们可以看到,第一遍历并显示的时候,他是无序的,所以,大家记住一点,map是无序的,还有map中很重要的一个知识点,大家要了解一下 :hashmap和hashtable的区别:千万要记住哦,不记住的话,要打屁股的哦···
1、hashtable是同步的(线程安全),hashMap不是,性能上hashmap会好,但是hashtable可以处理多线程问题
2、hashmap运行出现为null的key(空键值),hashtable不可以
3、Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap
好了,讲完了list,map,我们还有一个set,就能把集合收尾了,这个set也没什么可说的,主要有一点,
Set最大的特性就是不允许在其中存放的元素是重复的。
所以,我们通常把map的key存放在set中,而上面的代码中,我们其实已经用到了set,map.keySet()这个方法恰好返回的是set对象。
上一篇: 深度学习中常见的损失函数