1.集合的概念
集合是包含多个对象的简单对象,所包含的对象称为元素。集合里面可以包含任意多个对象,数量可以变化;同时对对象的类型也没有限制,也就是说集合里面的所有对象的类型可以相同,也可以不同。
2.集合与数组的特点对比
集合:数量不限、类型不限
数组:定长、类型单一
“集合框架”由一组用来操作对象的接口组成,不同接口描述不同类型的组。
3.数据存储结构分类
(1)顺序存储 (2)链式存储 (3)树形存储
(4)散列存储Hash (5)Map映射存储
4.集合框架:
接口 | 实现 | 历史集合类 |
Set | HashSet |
|
TreeSet |
| |
List | ArrayList | Vector |
LinkedList | Stack | |
Map | HashMap | Hashtable |
TreeMap | Properties |
5.集合框架中各接口的特点
Collection接口是一组允许重复的对象。
Set接口 继承Collection,无序但不允许重复。
List接口继承Collection,有序但允许重复,并引入位置下标。
Map接口既不继承Set也不继承Collection,是键值对
Collection接口
Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。
Iterator接口:主要用来枚举集合中的元素。
可理解成集合的查寻组件,迭代器又称枚举器,就是把集合中的元素一个个枚举出来。
组操作:Collection接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。
方法摘要 | ||
boolean | ||
boolean | addAll(Collection<? extendsE> c) | |
void | clear() | |
boolean | ||
boolean | containsAll(Collection<?> c) | |
boolean | ||
int | hashCode() | |
boolean | isEmpty() | |
iterator() | ||
boolean | ||
boolean | removeAll(Collection<?> c) | |
boolean | retainAll(Collection<?> c) | |
int | size() | |
Object[] | toArray() | |
| toArray(T[] a) |
Set接口
按照定义,Set接口继承Collection接口,而且它不允许集合中存在重复项。所有原始方法都是Collection中现成的,没有引入新方法。
具体的Set实现类依赖添加的对象的equals()方法来检查等同性。
HashSet类和TreeSet类
“集合框架”支持Set接口两种普通的实现:HashSet和TreeSet。在更多情况下,会使用HashSet存储重复自由的集合。考虑到效率,添加到HashSet的对象需要采用恰当分配散列码的方式来实现hashCode()方法。当需要从集合中以有序的方式抽取元素时,TreeSet实现会有用处。为了能顺利进行,添加到TreeSet的元素必须是可排序的。
public class SetDemo {
public static void main(String[] args) {
Set set=new HashSet();
set.add(new String("java"));
set.add(new String("c"));
set.add(new Integer(100));
set.add(123.45);
//Set添加元素时,一定会执行被添加元素的HashCode方法,而list不会
set.add(new Person("Jack",22));
set.add(new Person("Tom",23));
//读取
Iterator it=set.iterator();
while(it.hasNext()){
Object obj=it.next();
if(obj instanceof String){
System.out.println("字符串:"+obj);
}
if(obj instanceof Integer){
System.out.println("Integer:"+obj);
}
if(obj instanceof Double){
System.out.println("Double:"+obj);
}
if(obj instanceof Person){
System.out.println("Person"+obj);
}
}
}
}
方法摘要 | ||
---|---|---|
boolean | add(E e) 向列表的尾部添加指定的元素(可选操作)。 | |
void | add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。 | |
boolean | addAll(Collection<? extendsE> c) 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。 | |
boolean | addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 | |
void | clear() 从列表中移除所有元素(可选操作)。 | |
boolean | contains(Object o) 如果列表包含指定的元素,则返回 true。 | |
boolean | containsAll(Collection<?> c) 如果列表包含指定 collection 的所有元素,则返回 true。 | |
boolean | equals(Object o) 比较指定的对象与列表是否相等。 | |
E | get(int index) 返回列表中指定位置的元素。 | |
int | hashCode() 返回列表的哈希码值。 | |
int | indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 | |
boolean | isEmpty() 如果列表不包含元素,则返回 true。 | |
Iterator<E> | iterator() 返回按适当顺序在列表的元素上进行迭代的迭代器。 | |
int | lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。 | |
ListIterator<E> | listIterator() 返回此列表元素的列表迭代器(按适当顺序)。 | |
ListIterator<E> | listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。 | |
E | remove(int index) 移除列表中指定位置的元素(可选操作)。 | |
boolean | remove(Object o) 从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。 | |
boolean | removeAll(Collection<?> c) 从列表中移除指定 collection 中包含的其所有元素(可选操作)。 | |
boolean | retainAll(Collection<?> c) 仅在列表中保留指定 collection 中所包含的元素(可选操作)。 | |
E | set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 | |
int | size() 返回列表中的元素数。 | |
List<E> | subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。 | |
Object[] | toArray() 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 | |
| toArray(T[] a) 返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |
ArrayList代码:
public class ListDemo {
public static void main(String[] args) {
List<Object> list=new ArrayList<Object>();
Person p1=new Person("1001","张三",18);
Person p2=new Person("1002","李四",17);
Person p3=new Person("1003","Lili",23);
Person p4=new Person("1004","Jack",22);
Person p5=new Person("1005","Nana",24);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
//相比set,list当中增加一些有关位置的操作
list.add(3,p5);
list.remove(1);//移除
list.set(2,"Java...");//修改
for(int i=0;i<list.size();i++){
Object obj=list.get(i);
if(obj instanceof Person){
Person p=(Person)obj;
System.out.println(p);
}else{
System.out.println(obj);
}
}
}
}
LinkList代码:
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList list=new LinkedList();
list.add("abc");
list.addFirst("232");
list.addLast("carry");
list.add(1,100);
Object ob=list.removeFirst();
for(Object obj:list){
System.out.println(obj);
}
}
}
ArrayList实现栈:
public class MyStack {
private List list=new ArrayList(0);//new 一个ArrayList对象
private int index=0;//指针指向栈的最后一个元素
public void push(Object obj){//入栈
list.add(index,obj);//把需要入栈的元素加入list中
index++;
}
public Object pop(){//出栈
index--;
Object obj=list.get(index); //弹出栈尾的元素
return list.remove(index);//把弹出去的元素移除
}
public boolean isEmpty(){
return index==0?true:false;//判断栈是否为空
}
}
ArrayList实现队列:
public class MyQue2 {
private List list=new ArrayList();//new一个arraylist对象
public void in(Object obj){//入队列
list.add(obj);//向队列中添加元素
}
public Object out(){//出队列
if(list.isEmpty()){//
return null;
}else{
Object obj=list.remove(0);//取集合的第一个元素弹出
return obj;
}
}
public boolean isEmpty(){//判断队列是否为空
return list.isEmpty();//直接判断集合是否为空
}
public int size(){
return list.size();
}
}
Person对象代码:
public class Person {
private String sno;
private String name;
private int age;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [sno=" + sno + ", name=" + name + ", age=" + age + "]";
}
public Person(String sno, String name, int age) {
super();
this.sno = sno;
this.name = name;
this.age = age;
}
}
方法摘要 | |
---|---|
void | clear() 从此映射中移除所有映射关系(可选操作)。 |
boolean | containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。 |
boolean | containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> | entrySet() 返回此映射中包含的映射关系的 Set 视图。 |
boolean | equals(Object o) 比较指定的对象与此映射是否相等。 |
V | get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null 。 |
int | hashCode() 返回此映射的哈希码值。 |
boolean | isEmpty() 如果此映射未包含键-值映射关系,则返回 true。 |
Set<K> | keySet() 返回此映射中包含的键的 Set 视图。 |
V | put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 |
void | putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。 |
V | remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 |
int | size() 返回此映射中的键-值映射关系数。 |
Collection<V> | values() 返回此映射中包含的值的 Collection 视图。 |
HashMap:
public class HashMapDemo {
public static void main(String[] args) {
HashMap map=new HashMap();
map.put("1001", "Jack");
map.put("1002","Lili");
map.put("1003","Maril");
map.remove("1001");
//查询1---key视图
Set keys=map.keySet();
Iterator it=keys.iterator();//是集合的查询组件
while(it.hasNext()){
String str=map.get(it.next()).toString();
System.out.println(str);
}
System.out.println("------");
//查询2----entrySet视图
Set entries=map.entrySet();
Iterator it2=entries.iterator();
while(it2.hasNext()){
Entry entry=(Entry) it2.next();
System.out.println("key="+entry.getKey()+",value"+entry.getValue());
}
System.out.println("----------");
}
}
TreeMap:
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap map=new TreeMap();
map.put("1002", "Jack");
map.put("1001", "Jim");
map.put("1003", "Joe");
Set entries=map.entrySet();//通过entry视图
Iterator it=entries.iterator();
while(it.hasNext()){
Map.Entry e=(Entry) it.next();
System.out.println("key="+e.getKey()+",value="+e.getValue());
}
}
}