- 集合
- Collection接口
- Collection方法
- 迭代器
- List接口
- ArrayList
- Vector
- LinkedList
- Set接口
- HashSet
- LinkedHashSet
- TreeSet
- List和Set的区别
- Collection接口
集合
集合主要是两组(单列集合,双列集合),
Collection接口有两个重要的子接口List Set,他们的实现子类都是单列集合,存放单个的数据
Map接口的实现子类都是双列集合,存放的键值对
继承关系:
Collection接口
Collection方法
- add:添加单个元素
- remove:删除指定元素
- contains:查找元素是否存在
- size:获取元素个数
- isEmpty:判断是否为空
- clear:清空
- addAll:添加多个元素
- containsAll:查找多个元素是否都存在
- removeAll:删除多个元素
迭代器
所有实现了Collection接口的集合类都有一个iterator方法,用于返回一个实现了Iterator接口的对象,即可以返回一个迭代器。
- 先用一个Iterator对象接收集合中的iterator迭代器
- hasNext方法用于判断是否有下一个对象
- next方法用于切换到下一个对象
while循环时快捷键itit
示例如下
ArrayList list=new ArrayList();
list.add("红楼梦");
list.add("三国");
list.add("asfas");
list.add(1232);
System.out.println("list="+list);
Iterator iterator= list.iterator();
int number=0;//序号
while (iterator.hasNext()) {//快捷键按itit
number++;
Object object = iterator.next();
System.out.println(number+" 为 "+object);
}
增强for循环:
基本语法:
for(元素类型 元素名:集合名和数组名){
访问元素
}
快捷键:大写的I
List接口
List接口是Collection接口的子接口。
实现了List的集合类中元素有序,且可重复,且支持索引(用来替换或删除)。
常用的方法有:
- void add(int index,object ele)即支持按索引增加
- Object remove(int index)删除指定index位置的元素,并返回此元素
- Object set(int index,Object ele)设置指定index位置的元素为ele,即替换(改)
- Object get(int index)获取指定index位置的元素
ArrayList list = new ArrayList();
list.add(new Book("红楼梦",15,"曹雪芹"));
list.add(new Book("红楼梦213",115,"曹雪芹"));
list.add(new Book("红楼梦124241",75,"曹雪芹"));
for(int i=0;i<list.size()-1;i++)
{
for(int j=0;j<list.size()-1-i;j++)
{
Book book1=(Book) list.get(j);
Book book2=(Book) list.get(j+1);
if(book1.price>book2.price)
{
list.set(j,book2);
list.set(j+1,book1);
}
}
}
for (Object o:list)
{
System.out.println(o);
}
ArrayList
底层原理:
- ArrayList中维护了一个Object类型的数组elementData用于储存数据
- 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加后扩容容量为10,如需再次扩容,则扩容为1.5倍。
- 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
增删的效率较低,数组扩容,改查的效率较高
线程不安全
Vector
Vector底层也是一个对象数组,Object类型的数组elementData用于储存数据
Vector是线程安全的
扩容每次2倍
LinkedList
实现了双向链表,有first和last两个属性,可以指向链表中的first对象和last对象。
线程不安全
无须扩容,对象间通过next连接,增删的效率较高,改查的效率较低,不浪费空间
Set接口
set接口的实现类的特点:
- 无序(即添加的顺序和取出的顺序不一致),但取出的顺序是固定的
- 没有索引,即不能通过get方法获取对象
- 不能重复,所以只能有一个null
Set Set = new HashSet();
Set.add("jack");
Set.add("john");
Set.add("john");//Set里只会有一个john
Set.add(null);
Set.add(null);
System.out.println("Set="+Set);
Iterator iterator = Set.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
HashSet
HashSet底层是HashMap,HashMap底层是数组+链表+红黑树
根据Set接口的特点,我们知道HashSet里的对象不能重复,这里的判断是否重复,是先判断hash值是否相等,再调用equals方法,判断是否是同一个对象等。
可以用alt+insert快捷键重写hashcode方法和equals方法,自定义判断机制,即自定义判断对象是否重复的标准。
如:当Car类对象的name和price属性一样时,返回相同的hashcode,equals返回true
LinkedHashSet
LinkedHashSet底层是LinkedHashMap,LinkedHashMap底层是数组+双向链表
是HashSet的子类
看起来是有序的,加入顺序和取出顺序一致
与HashSet一样,不能重复
TreeSet
有序,可以自定义排序规则
List和Set的区别
- List集合存储的数据有序可以重复,Set集合存储的数据无序不可以重复。
- List是一个有序的容器,可以保证每一个插入元素的顺序,输出顺序就是输入顺序。
- List可以插入多个null值,而Set只能插入一个null值。