java基础学习-集合

集合就是将若干用途、性质相同或者相近的“数据”组合而成一个整体

java集合可分为以下两大类:

Collection:Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements),实现它的有ListSet。List 是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式,Set  不能包含重复的元素。
Map :包含了key-value对。Map不能包含重复的key。

List

特点:可重复、有序,拥有实现类  ArrayList与LinkedList

1)ArrayList

a)用法 List(接口)去new 具体用法源码
b)集合中存放的依然是对象的引用而不是对象本身。
c)ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。
d)如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。 
e)对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。

2)LinkedList

a)LinkedList底层采用双向链表实现
b)链表介绍链表可以拥有 pre  next两个属性,有单向链表,双向链表,循环链表

3)关于ArrayList与LinkedList的比较分析

a)ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。
b)当执行插入或者删除操作时,采用LinkedList比较好。ArrayList改变一个需要动到整个List
c)当执行搜索操作时,采用ArrayList比较好。LinkedList查询需要从第一个开始
d)当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层所维护的数组当中;当向LinkedList中添加一个对象时,实际上LinkedList内部会生成一个
Entry对象,该Entry对象的结构为: 
Entry { Entry previous; 
  Object element; 
  Entry next; 

其中的Object类型的元素element就是我们向LinkedList 中所添加的元素,然后Entry又构造好了向前与向后的引用previous、next,最后将生成的这个Entry对象加入到了链表当中。换句话说,LinkedList中所维护的是一个个的Entry对象。

Set

特点:无重复、无序。拥有实现类HashSet、LinkedHashSet、TreeSet、SortedSet

1) HashSet 无序

a) 底层是使用HashMap实现的。当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象
b) 当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash  code值是否与增加的对象的hash  code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。
c) 如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。
d) 如果是两个对象加入set,除非引用自同一个对象,否则就是两个,如 add(new People(“cmy”))执行两次加两个,但是String例外,是比较字符串 ,new String(‘a’)加几次也只有一个。

2) LinkedHashSet

优点是按照插入顺序排列,速度略慢, Hash的实现上添加了Linked的支持

3) SortedSet 

 具体看继承者TreeSet的介绍,父子关系

4) TreeSet

实现排序需要将排序Comparator 带入实例化构造函数
实现时 正序返回正,一样返回0,负数倒序
TreeSet set = new TreeSet(new PersonComparator());
class PersonComparator implements Comparator{
	public int compare(Object arg0, Object arg1)	{
		Person p1 = (Person) arg0;
		Person p2 = (Person) arg1;
		return p2.score - p1.score;
	}
}

Map

接口,-HashMap、SortedMap、TreeMap
Map的keySet()方法会返回key的集合,因为Map的键是不能重复的,因此keySet()方法的返回类型是Set;而Map的值是可以重复的,因此values()方法的返回类型是Collection,可以容纳重复的元素。

1)HashMap

HashMap类使用散列表实现Map接口。
底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中这允许一些基本操作如get()和put()的运行时间保持恒定,即便对大型集合,也是这样的。 我们向HashMap中所放置的对象实际上是存储在该Entry数组当中; 
当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。 
如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。

2)SortedMap

SortedMap接口扩展了Map,它确保了各项按关键字升序排序

3)TreeMap 

继承SortedMap

4)Map的遍历

方式一:
Set set = map.keySet();
 for(Iterator iter = set.iterator(); iter.hasNext();){
   String key = (String)iter.next();
   String value = (String)map.get(key);
  }
方式二:
Set set = map.entrySet();
  for(Iterator iter = set.iterator(); iter.hasNext();){
   Map.Entry entry = (Map.Entry)iter.next();
   String key = (String)entry.getKey();
   String value = (String)entry.getValue();
   System.out.println(key +" :" + value);
  }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值