面向对象---集合

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

add(E e)
确保此 collection 包含指定的元素(可选操作)。

boolean

addAll(Collection<? extendsE> c)
将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。

void

clear()
移除此 collection 中的所有元素(可选操作)。

boolean

contains(Object o)
如果此 collection 包含指定的元素,则返回 true。

boolean

containsAll(Collection<?> c)
如果此 collection 包含指定 collection 中的所有元素,则返回 true。

boolean

equals(Object o)
比较此 collection 与指定对象是否相等。

int

hashCode()
返回此 collection 的哈希码值。

boolean

isEmpty()
如果此 collection 不包含元素,则返回 true。

Iterator<E>

iterator()
返回在此 collection 的元素上进行迭代的迭代器。

boolean

remove(Object o)
从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

boolean

removeAll(Collection<?> c)
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

boolean

retainAll(Collection<?> c)
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

int

size()
返回此 collection 中的元素数。

Object[]

toArray()
返回包含此 collection 中所有元素的数组。

<T> T[]

toArray(T[] a)
返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

 

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);
        	}
        }
        
	}
}


List接口

List接口继承了Collection接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向 位置的操作。
面向位置的操作包括插入某个元素或Collection的功能,还包括获取、除去或更改元素的功能。在List中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。
方法摘要
booleanadd(E e)
向列表的尾部添加指定的元素(可选操作)。
voidadd(int index, E element)
在列表的指定位置插入指定元素(可选操作)。
booleanaddAll(Collection<? extendsE> c)
添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
booleanaddAll(int index, Collection<? extends E> c)
将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
voidclear()
从列表中移除所有元素(可选操作)。
booleancontains(Object o)
如果列表包含指定的元素,则返回 true
booleancontainsAll(Collection<?> c)
如果列表包含指定 collection 的所有元素,则返回 true
booleanequals(Object o)
比较指定的对象与列表是否相等。
Eget(int index)
返回列表中指定位置的元素。
inthashCode()
返回列表的哈希码值。
intindexOf(Object o)
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
booleanisEmpty()
如果列表不包含元素,则返回 true
Iterator<E>iterator()
返回按适当顺序在列表的元素上进行迭代的迭代器。
intlastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
ListIterator<E>listIterator()
返回此列表元素的列表迭代器(按适当顺序)。
ListIterator<E>listIterator(int index)
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
Eremove(int index)
移除列表中指定位置的元素(可选操作)。
booleanremove(Object o)
从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。
booleanremoveAll(Collection<?> c)
从列表中移除指定 collection 中包含的其所有元素(可选操作)。
booleanretainAll(Collection<?> c)
仅在列表中保留指定 collection 中所包含的元素(可选操作)。
Eset(int index, E element)
用指定元素替换列表中指定位置的元素(可选操作)。
intsize()
返回列表中的元素数。
List<E>subList(int fromIndex, int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
Object[]toArray()
返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
<T> T[]
toArray(T[] a)
返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

注意:
1)使用List(如ArrayList)时, 不会自动调用 hashCode() 方法。因为在List中,重复了就重复了,不需判断,保证唯一性。
2)List中 添加了下标 index 的功能 ,这样对List的修改可以利用set方法对指定位置的元素直接进行替换,不需要象Set那么复杂(要转换成数组才能修改,之后还要转换回去)。
3)Collection用Iterator迭代器,而List可以用 ListIterator 表迭代器 。前者只能next(),后者不但包含next()方法,还包含previous()方法。因此,如果要用List做类似书的翻页功能,不但可以向后翻,还可以向前翻。

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;
	}
}

Map 接口
Map接口不是Collection接口的继承。而是从自己的用于维护 - 关联的接口层次结构入手。按定义,该接口描述了 从不重复的 键到值的映射
可以把这个接口方法分成三组操作: 改变查询提供可选视图
改变操作允许从映射中添加和除去键-值对。键和值都可以为null。但是, 不能把 Map 作为一个键或值添加给自身。
方法摘要
voidclear()
从此映射中移除所有映射关系(可选操作)。
booleancontainsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true
booleancontainsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true
Set<Map.Entry<K,V>>entrySet()
返回此映射中包含的映射关系的 Set 视图。
booleanequals(Object o)
比较指定的对象与此映射是否相等。
Vget(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
inthashCode()
返回此映射的哈希码值。
booleanisEmpty()
如果此映射未包含键-值映射关系,则返回 true
Set<K>keySet()
返回此映射中包含的键的 Set 视图。
Vput(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
voidputAll(Map<? extends K,? extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
Vremove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
intsize()
返回此映射中的键-值映射关系数。
Collection<V>values()
返回此映射中包含的值的 Collection 视图。

Map.Entry 接口
Map的 entrySet() 方法返回一个实现Map.Entry接口的对象 Set 集合 ,其中每个对象都是底层Map中一个特定的键-值对。



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());
        }
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值