目录
1 为什么使用集合
数组和集合的特点比较
- 相同点
二者中存放的都是对象的地址
- 不同点
1 数组 长度 固定,集合长度可变
2 数组只能存同一种对象,集合在泛型限定前,可存储任意类型的元素
2 主要类型
Colloection
【1】
共性方法
- 操作元素
增加元素 add(E e)
删除元素 remove(Obj o)
查询元素 contains(Obj o)
遍历元素
Collection 接口继承了Iterable接口,所以对于实现了Collection接口的类,
- 可以获取到集合的迭代器
ArrayList arr=new ArrayList();
Iterator it=arr.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
- 可以使用增强for循环
ArrayList arr=new ArrayList();
arr.add("java1");
arr.add("aband");
arr.add("aband");
arr.add(3);
for(Object s:arr)
System.out.println(s);
- 操作子集
增 addAll(Collection<?> c)
删 clear()
差集removeAll(Collection<?> c )
交集 retainAll(Collection<?> c)
打印 System.out.println( )
主要子接口
类型 | 元素有序性 | 元素可重复型 |
---|---|---|
List | 有序 | 可重复 |
Set | 无序 | 不可重复 |
-
List
-
特点:
逻辑结构:线性表
有序性:指按照输入元素的先后顺序排列元素
有角标,可以通过角标进行操作允许多个null和重复元素
-
共性方法
-增,删,改,查:
特有迭代器:ListIterator 接口 -
主要实现子类
名称 | 存储结构 | 线程安全性 | 适用场景 | 出现版本 |
---|---|---|---|---|
ArrayList | 顺序表(数组) | 不安全 | 修改查询元素 | jdk1.2 |
LinkedList | 链表 | 不安全 | 增删元素 | jdk1.2 |
Vector | 数组 | 安全 | jdk1.0 |
ArrayList 和LinkedList相对于Vector的优点,是快!
-
LinkedList
-
增
addFirst() (JDK1.2) offerFirst() (JDK1.6 下同)
区别 二者返回值类型不同,前者返回void,后者返回boolean型
addLast() offerLast() -
删
removeFirst() pollFirst()
removeLast() pollLast() -
查
getFirst() peekFirst()
peekFirst returns null if the list is empty and getFirst throws a NoSuchElementException if the list is empty,to reduce the xception Handling while development【2】getLast() peekLast()
-
Vector
Enumeration enum=vector.elements()
枚举是vector特有的迭代元素的方法 【3】【4】
-
-
Set
set中不能存储相同的元素,只能存储一个null
主要实现子类
名称 | 数据结构 | 存入Set 元素是否相同的比较方式 |
---|---|---|
TreeSet | 树 | A TreeSet存储的 元素类 实现Comparable接口, 重写compareTo(Obj obj)方法: B 新建类实现Comparator接口的compare(obj1,obj2)方法。 初始化TreeSet对象时,构造函数传入比较器, |
HashSet | hash表 | 哈希值不同,则元素不同,保存该元素到集合; hash值相同,但元素内容相同,不保存; hash值相同,但元素内容不同,在同一hash值下再挂一个元素 对hash和值的判断自定义时,需要重写hashCode()方法和equals()方法 |
元素实现比较接口
class Student implements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
//当主要条件相同时,一定判断一下次要条件。
return this.name.compareTo(s.name);
}
return -1;
/**/
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
自定义比较器
class Student implements Comparable
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
String getName()
{
return name;
}
int getAge()
{
return age;
}
//复写的方法权限不能小于原方法
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
{
throw new RuntimeException("不是学生对象");
}
Student s=(Student)obj;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
else
{
return this.age-s.age;
}
}
}
class TreeSetDemo_2
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet(new MyComparator());
ts.add(new Student("刘能",44));
ts.add(new Student("赵本山",60));
ts.add(new Student("毕老师",50));
ts.add(new Student("赵本水",50));
ts.add(new Student("赵本山",60));
ts.add(new Student("赵本山",50));
for(Iterator it=ts.iterator();it.hasNext();)
{
Student stu=(Student)it.next();
System.out.println(stu.getName()+" "+stu.getAge());
}
}
}
//自定义比较器
class MyComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1=(Student)o1;
Student s2=(Student)o2;
int res = s1.getName().compareTo(s2.getName());
if(res==0)
{
return s1.getAge()-s2.getAge();
// return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
else
return res;
}
}
Map
注意:Map不是Collection的子接口
存储结构:索引存储结构,键值对
键具有唯一性(不可重复)
不允许有重复的 键值对
新增键值对时,如果集合中已经含有该键,则新存入的值覆盖原有的值,
返回原有的值
共性方法
-
增
put(key,value)
新增键值对时,如果集合中已经含有该键,则新存入的值覆盖原有的值,
返回原有的值 -
删
clear();\nremove(key) -
取
get(key)
values() entrySet() keySet()
entrySet() 返回Map.Entry类型的集合.
Set<Map.Entry<String,String>>=map.entrySet() -
查
containsKey(key)
containsValue(value) -
遍历
1 获取map的键的Set集合,遍历键的每个元素
public void demo1()
{
Map<String, String> map=new LinkedHashMap<String, String>();
map.put("1", "aa");
map.put("2", "bb");
map.put("3", "cc");
Set<String> set=map.keySet();
Iterator<String> it=set.iterator();
while(it.hasNext()){
String key=it.next();
String value=map.get(key);
System.out.println(value);
}
}
2 将map的键值对 作为项(Entry【5】) 获取为集合形式,遍历集合的每个项
public void demo2()
{
Map<String, String> map=new LinkedHashMap<String, String>();
map.put("1", "aa");
map.put("2", "bb");
map.put("3", "cc");
//返回映射中包含的映射关系的 Set 视图。
Set<Entry<String, String>> set=map.entrySet();
Iterator<Entry<String,String>> it=set.iterator();
while(it.hasNext()){
Map.Entry<String, String> entry=it.next();
String value=entry.getValue();
System.out.println(value);
}
}
3 方法1 的增强for循环形式
public void demo3()
{
Map<String, String> map=new LinkedHashMap<String, String>();
map.put("1", "aa");
map.put("2", "bb");
map.put("3", "cc");
for(Object obj:map.keySet())
{
String key=(String)obj;
String value=map.get(key);
System.out.println(value);
}
}
4 方法2的增强for循环形式
public void demo4()
{
Map<String, String> map=new LinkedHashMap<String, String>();
map.put("1", "aa");
map.put("2", "bb");
map.put("3", "cc");
for(Object obj:map.entrySet())
{
Map.Entry entry=(Entry)obj;
String value=(String)entry.getValue();
System.out.println(value);
}
}
名称 | 存储结构 | 键和值 | 线程同步性 | 出现版本 | 备注 |
---|---|---|---|---|---|
HashMap | (JDK1.7)哈希表+索引 (JDK1.8)红黑树 [6] | 允许 null | 不同步 | 后出现 | |
TreeMap | 红黑树 [7]+索引 | 允许 null | 不同步 | 后出现 | 可以对键排序 |
Hashtable | 哈希表+索引 | 不能为null | 线程同步 | 先出现 |
3 参考文献
【1】链接: java collection framework.
【2】链接: StackOverFlow:What is the difference between getFirst() and peekFirst() in Java’s LinkedList?.
【3】链接 Iterator 和 Enumeration区别.
【4】链接 fail-safe fail-fast知多少.
【5】Map.Entry
作为一个接口,Map.Entry如何被实例化
【6】面试官再问你 HashMap 底层原理,就把这篇文章甩给他看
【7】 Java集合,TreeMap底层实现和原理 https://my.oschina.net/90888/blog/1626065