集合

集合框架
Collection 接口 定义了一个容器应该具有哪些功能。
添加
add(E e)
addAll(Collection c)//参数可以是ArrayList对象、LinkedList对象、HashSet对象、LinkedHashSet对象、Vector对象、TreeSet对象。
删除
clear()
remove(Object o)
removeAll(Collection c)
是否包含
contains(Object o)
元素个数
size()
是否相等
equals(Collection c)
转换为数组
toArray()

//有的集合有序,有的集合无序
//有的集合可以重复,有的集合不允许重复

List是对Colletion的补充。也是接口
List允许重复,有序。index
增加了很多与index有关的方法。
添加元素
add(index, object)
addAll(index, collection)
修改元素
set(index, object)
删除元素
remove(index)
removeRange(fromIndex,toIndex)
获取元素
get(index)
subList(fromIndex,toIndex)
获取元素的下标
indexOf(object)
lastIndexOf(object)

ArrayList是List接口的实现类。
底层是一个数组。
优点:查询快(数组是一段连续的存储空间)
缺点:插入和删除慢(移动数据)
LinkedList是List的实现类。
底层是一个双向链表(内存不连续,逻辑连续)
优点:插入、删除快
缺点:查询慢(每次查询都是从头开始)
Vector:
它与ArrayList功能相同。在多线程下是安全的。线程同步
ArrayList是非同步的,在多线程下是不安全的。
Vector是同步的因此效率低(有等待,加锁,解锁)
ArrayList和LinkedList都是不同步的,因此效率高。
如何选择使用ArrayList、LinkedList、Vector?
看需求是否会在多线程下访问容器。
是:Vector
否:看增删多还是查询多?
增删多:LinkedList
查询多:ArrayList
没看出来:ArrayList
没看出来:ArrayList
对你而言,用谁只是new的时候,类名写谁的问题。
因为你创建对象的时候,你用的是多态
List list = new 类名();

对list进行遍历
方法一:for循环
for(int i = 0; i < list.size();i++){
System.out.println(list.get(i));
}
方法二:foreach
for(E e : list){
System.out.println(e);
}
方法三:list转为数组,对数据遍历
T[] arr = new T[list.size()];
list.toArray(arr);
for(int i = 0; i < arr.length;i++){
System.out.println(arr[i]);
}
方法四:使用迭代器Iterator
Iterator it = list.iterator();
while(it.hasNext()){
T t = it.next();
System.out.println(t);
}

Set是一个接口,继承于Collection接口。
因此一个实现类如果实现Set接口,必须实现Set和Collection里面的全部方法。
set代表的是一个无序的,不重复的容器。因此它是没有index的。
set里面并没有定义新的方法,但是它内部肯定对Collection做了无序无重复的限制。

Set的常用实现类
HashSet:无序,不重复。
添加元素
add(E e)
addAll(Colletion c)
删除元素
clear()
remove(e)
removeAll(Collection c)
判断包含
contains(e)
判断等不等
equals(Set s)
无法获取元素,没有提供get。那如何获取元素呢?
可以转换为数组 T[] array = set.toArray();
可以转换为ArrayList List list = new ArrayList(set);
HashSet是如何保证元素不重复的呢?
如果HashSet里面保存的是A类型的对象。
那么 A类必须提供 hashcode()和equals(A a)方法
HashSet会对新加入的元素进行判断,判断set中是否有和它相等数据。
何为相等:hashcode一样并且equals方法返回的true。
如果相等,就不添加,如果不等(hashcode不同或者equals为false)就添加

HashSet是无序不重复,即添加的顺序和打印的顺序不完全相同。如果想让打印数据
和添加顺序相同,使用LinkedHashSet。
LinkedHashSet继承于HashSet。没有添加任何新的方法,只是在内部实现上做了调整,添加了链表结构,从而保证了添加顺序。
TreeSet也是一种容器,这种容器能对内部元素排序。也就是说,你放进去之后,元素就是有序的。(这里的有序,不是你放入的顺序,而是元素内容顺序)。TreeSet采用树形(红黑树)结构存储数据。它对每一个要加进来的元素进行比较,确定其在树形结构中的位置。--因此,元素必须是可比较的。也就是说元素要有比较方法。元素所属的类必须实现Comparable接口。TreeSet排除重复靠的是compareTo返回的结果是不是0,结果是0,表示元素相同,结果不是0,表示新元素。TreeSet排序靠的是compareTo返回的结果是正还是负。

TreeSet除了能使用内部比较器(元素所属的类实现Comparable接口,即元素所属的类实现compareTo(another)方法)比较之外,还提供外部比较器。外部比较器,即提供一个单独的与set元素所属类无关的类,这个类提供了比较2个对象的方法。即compare(object1,object2)方法。创建TreeSet的时候,指定外部比较器。每当往set中放元素的时候,treeSet就会借助外部比较器逐一比较已有元素和新添元素的关系。进而放到相应的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值