Java集合框架部分体系结构
集合框架图
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
其中,Collection 是一组无序、可重复的数据,Map接口是键-值对象,实现一一对应。
Collection接口包含了List和Set两大分支,其中:
1、List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
2、Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问。
Map
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
Collection接口
Collection接口中的方法如下:
1、add()方法是添加一个元素到集合中;
2、addAll()方法将指定集合中的所有元素添加到集合中;
3、contains()方法检测集合中是否包含指定的元素;
4、toArray()方法返回一个表示集合的数组。
Iterator()函数:主要作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合
Iterator itr=newsLIst.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
List接口:
实现List接口的集合主要有:ArrayList、LinkedList
(1)ArrayList接口
ArrayList是一个动态数组,它的特点是内部元素的随机访问速度快。
每一个ArrayList都有一个初始容量,该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。
ArrayList常用方法
示例:
public class TestNews {
News[] allNews=new News[10];
//一旦超过了,就需要数组扩容
//一旦过少,就需要截取多于的部分
public static void main(String[] args) {
ArrayList newsLIst=new ArrayList();
News news1=new News(1,"我好困","sam");
News news2=new News(2,"我好饿","sam");
News news3=new News(3,"我好渴","sam");
News news4=new News(4,"我好累","sam");
newsLIst.add(news);//在集合中增加元素
System.out.println(newsLIst.size());
newsLIst.remove(news);//从集合中删除元素
newsLIst.add(news);
System.out.println(newsLIst.get(0));//根据下标查找元素
newsLIst.set(0,1);//根据下标修改元素
System.out.println(newsLIst.get(0));
newsLIst.add(news1);
newsLIst.add(news2);
newsLIst.add(news3);
newsLIst.add(news4);
System.out.println(newsLIst.size());
}
}
//for方法
for (int i = 0; i < newsLIst.size(); i++) {
System.out.println(newsLIst.get(i));
}
//增强for
int i=1;
for (Object obj:newsLIst){
System.out.println("第"+i+++"条"+obj);
}
//迭代器遍历
Iterator itr=newsLIst.iterator();
while(itr.hasNext()){
System.out.println(itr.next()+"!!!");
}
(2)LinkedList
LinkedList基于双向链表实现,它对元素的随机访问性能差,但是在插入和删除元素时表现出色。
由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表。
LinkedList的常用方法
public class TestLink {
public static void main(String[] args) {
LinkedList list=new LinkedList();
News news1=new News(1,"我好困","sam");
News news2=new News(2,"我好饿","sam");
News news3=new News(3,"我好渴","sam");
News news4=new News(4,"我好累","sam");
list.add(news1);
list.addLast(news2);
list.addFirst(news3);
list.add(news4);
list.remove();//等同于removeFirst()
list.element();//等同于getFirst()
list.offer(1);//等同于add(1)
list.peek();//等同于getFirst(),不同点在于当前为空就返回空
list.poll();//弹出首元素,相当于removeFirst
list.pop();//等同于removeFirst()
list.push("abc");//等同于addFirst()
for (Object o: list){
System.out.println(o);
}
ArrayList arr=new ArrayList();
arr.addAll(list);
}
}
ArrayList和LinkedList的特点:
(1)ArrayList底层是可变数组,遍历元素更快,改变值也更快
(2)LinkedList底层是双向链表,插入、删除更快。
Set接口
Set集合是一种不允许有重复元素的集合。与List一样,它同样允许null的存在但是仅有一个。Set判断元素是否相同的依据是调用元素的equal方法,即如果有e1.equals(e2)==true,那么e1和e2不能同时存在于一个Set集合中。
Set接口如何判断加入对象是否已经存在呢?
采用对象的equals()方法比较两个对象是否相等
示例:
public class TestSet {
public static void main(String[] args) {
HashSet set=new HashSet();
set.add(1);
set.add("abc");
set.add("hello");
set.add(1);
set.add("abc");
set.add(2);
System.out.println(set.size());
}
}
Map接口
与Collection集合不同,Map集合是由一系列键值对组成的集合,它提供了key到value的一对一映射,集合中的key不能重复。
HashMap
以哈希表的数据结构实现,查找对象时通过哈希函数计算其位置,查询速度快。可以使用null作为key或者value。
HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表.
TreeMap:
如果使用自定义的类来作为TreeMap中的key值,且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0。
示例:
public int compareTo(Object o) {
if (o instanceof News){
News obj=(News)o;
//自定义比较规则
// return obj.newsId-this.newsId;//降序
return this.newsId-obj.newsId;//升序
}
return 0;
}