Collection
在集合的继承体系中,collection可以说是最大的,它下面有list和set(子孙类),因此,collection中定义的方法规定是list和set都有的。
集合中只能存储单个元素,且只能保存引用数据类型的数据,保存Object ,又因为多态,相当于什么都可以保存。
collection针对所有集合有的方法
boolean add() 添加元素
void clear() 清空集合
boolean remove() 删除mo一个元素
boolean isEmpty() 判断集合是否为空
boolean contains() 是否包含mo个元素
int size() 元素个数
object[] toArray() 把集合转换为数组
代码奉上:
//创建集合
Collection c=new ArrayList();
//自动装箱为Integer类型,然后向上转型 为Object类型,发生多态
c.add(1);
c.add(1);
c.add(1.3);
c.add(true);
c.add(new Collection_01());
c.add(new Object());
System.out.println(c.size());
System.out.println(c.isEmpty());
c.remove(1.3);
System.out.println(c.size());
//直接遍历集合
for(Object object:c) {
System.out.println(object);
}
//把集合转换为Object数组,再遍历
Object[] arr=c.toArray();
for(Object object:arr) {
System.out.println(object);
}
c.clear();
System.out.println(c.size());
注意
在这些方法中判断包含(contains)和删除(remove)都是需要调用equals方法,因为要计较的是值,而保存的是引用数据类型,如果不用equals而用=,那么最终比较的是地址。不符合自己的需求。
而在八种基本数据类型的包装类中都覆写了equals,不需要我们覆写,但是,存入的不是八种基本数据类型的包装类,记得要覆写equals方法。
list
list特性:有序,可重复,存入顺序和取出顺序一致,可以有多个重复值。
list下有ArrayList和LinkedList
ArrayList
底层是数组,所以随机查询相对较快,随机增删相对较慢,是非线程安全。
LinkedList
底层是双向链表,所以随机增删相对较快,随机增删相对较慢。
链表
链表中保存节点
节点中有三个元素, 自身对象(添加到元素),下一个节点地址, 上一个节点地址
LiskedList 就是基于双向链表实现的
链表是没有下标的,所以查询慢,当然我们可以通过get方法使用下标去找到数据。但在get方法中也是通过循环,从首节点或者尾节点 或正向或逆行 一步步找到的
不像ArrayList 底层是数组,有下标
链表首尾添加元素示例
// 尾部添加 成功返回true
li.add(1);
// 头部添加
li.push(3);
// 头部添加
li.addFirst(3);
// 头部添加 成功返回true
li.offerFirst(3);
// 尾部添加
li.addLast(5);
// 尾部添加 成功返回true
li.offer(9);
// 尾部添加 成功返回true
li.offerLast(7);
// 上述添加方法本质就是调用linkLast和linkFirst两个方法,没有什么区别
// [3, 3, 3, 1, 5, 9, 7]
System.out.println(li);
// 获取指定下标对应的元素
System.out.println(li.get(3));
// 获取首位元素
System.out.println(li.getFirst());
// 获取最后一个元素
System.out.println(li.getLast());
// 获取首位元素,并删除该元素,如果没有首位元素 报错java.util.NoSuchElementException
System.out.println(li.pop());
set
set特性:无序 不可重复,添加顺序和取出顺序不一定一致
set下有SortedSet,而TreeSet是SortedSet的唯一实现类,保存的元素按照一定规则自动排序
数字:从小到大
日期:自然天数
字符串:每一位的ASCLL值
注意:TreeSet中元素类型必须统一,因为要排序。
set下还有HashSet,HashSet 就是HashMap的一个封装,这个写到Map时会介绍,是散列表,依靠hash算法在查询方面很有优势,但是本身不能直接排序。
所以我们在不要求排序,查询功能有要求时选择HashSet;在要求排序时最好选用TreeSet。
集合遍历
代码奉上:
//直接遍历集合
for(Object object:c) {
System.out.println(object);
}
//把集合转换为Object数组,再遍历
Object[] arr=c.toArray();
for(Object object:arr) {
System.out.println(object);
}
当然我们也可以通过迭代器遍历。