黑马程序员--第十四天:集合框架

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

 

/*14-2
1.add方法的参数类型是Object,以便于接收任意类型的对象。
2.集合中存储的都是对象引用

迭代器:
就是集合取出元素的方式。
*/

import java.util.ArrayList;
import java.util.Iterator;


class  Demo
{
	public static void main(String[] args) 
	{
		ArrayList al = new ArrayList();
		
		//1.增加元素
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		
		ArrayList al1 = new ArrayList();
		
		//1.增加元素
		al1.add("java01");
		al1.add("java02");
		al1.add("java05");
		al1.add("java04");
		
		
		//al1.retainAll(al);//取交集,al只会保留与al1相同的元素。
		al1.removeAll(al);//去交集。
		sop(al1);

		sop(al);
		al.remove(al);
		//al.clear();
		
		sop("java03是否存在:"+al.contains(al));
		sop("集合是否为空:"+al.isEmpty());
		//2.获取个数,集合长度。
		sop("size: " + al.size());
		
		sop(al);
		
		
		/*Iterator it = al.iterator();
		while(it.hasNext()){
			sop(it.next());
		}*/
		
		for (Iterator it = al.iterator(); it.hasNext();){
			sop(it.next());
		}
		
	}
	
	public static void sop (Object obj){
		System.out.println(obj);
	}
}

//14-3_6
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;


/*
collection
	|--List: 元素是有序的,元素可以重复。因为该集合体系有索引。
		|--ArrayList: 底层的数据结构使用 数组:特点在与查询速度快。但是增删较慢。线程不同步。
		|--LinkedList:底层的数据结构使用的是 链表:特点:增删快,查询慢。
		|--Vector:底层的数组结构是数组。线程同步。增删,查询都较慢。被ArrayList替代。
	|--Set:  元素是无序的,元素不可以重复。
	
	
List:特有的方法。凡是可以操作角标的方法都是该体系特有的方法。

增:
	add(index,element);
	addAll(index,Collection);
删:
	remove(index);
改:
	set(index,element);
查:
	get(index);
	subList(from,to);
	listIterator();
	
	
List 集合特有的迭代器:ListIterator是Iterator的子接口。

在迭代是,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。

所以 在迭代器时,只能用迭代器的方法操作元素。可是Iterator 的方法 有限,
只能进行 判断,取出,删除的操作。
如果想要用其他的操作 如添加,修改等,就需要使用子接口。ListIterator.

该接口只能通过List集合的listIterator方法获取。
	
*/


class Demo{
	public static void main(String [] args){
		ArrayList al = new ArrayList();
		
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		
		sop("原集合是:" + al);
		al.add(1,"java05");
		
		sop("原集合是:" + al);
		al.remove(3);
		sop("原集合是:" + al);
		
		al.set(2, "java06");
		
		sop("get(1)="+al.get(1));
		
		sop(al);
		
		for(int x=0;x<al.size();x++){
			sop(al.get(x));
		}
		
		/*for(Iterator it = al.iterator(); it.hasNext(); ){
			sop(it.next());
		}*/
		
		//通过indexOf获取对象的位置
		sop("index="+al.indexOf("java01"));
		
		List sub = al.subList(1, 3);
		
		sop("sub=" + sub);
		
		
		//*******************
		//演示列表迭代器
		sop(al);
		Iterator it = al.iterator();
		
		while(it.hasNext()){
			Object obj = it.next();
			if(obj.equals("java03"))
				//al.add("java003");//不可以同时用迭代器和ArrayList同时对同一个对象进行操作。
				it.remove();
			sop("obj=" + obj);
		}
		
		sop(al);
		
		
		//ListIterator*******************************
		ListIterator li = al.listIterator();
		
		while(li.hasNext()){
			Object obj = li.next();
			if(obj.equals("java03"))
				//li.remove();
				//li.add("java0");
				li.set("java0");
			sop("obj=" + obj);
		}
		
		sop(li.hasNext());
		sop(li.hasPrevious());
		
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}

//14-7

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;


/*
枚举就是Vector 特有的取出方式。

发现枚举和迭代器很像。
其实枚举和迭代是一样的。

因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。枚举郁郁而终了。

	
*/


class Demo{
	public static void main(String [] args){
		Vector v = new Vector();
		v.add("java01");
		v.add("java02");
		v.add("java03");
		v.add("java04");
		
		Enumeration en = v.elements();
		
		while(en.hasMoreElements()){
			sop(en.nextElement());
		}
		
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}

/*14-8
LinkedList 特有方法
addFirst();
addLast();

getFirst();
getLast();
获取元素,但不删除。
removeFirst();
removeLast();
获取并删除元素,如果集合中没有元素,会出现NoSuchElementException.

在JDK 1.6 出现了替代方法。
offerFirst();
offerLast();

peekFirst();
peekLast();

pollFirst();
pollLast();
获取并删除元素,如果集合中没有元素,返回null。
*/

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;


class Demo{
	public static void main(String [] args){
		LinkedList ll = new LinkedList();
		ll.addFirst("java01");
		ll.addFirst("java02");
		ll.addFirst("java03");
		ll.addFirst("java04");
		
		
			sop(ll);
		
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}


//14-9
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;


/*
使用LinkedList模拟一个堆栈或者队列数据结构

堆栈:先进后出
队列:先进先出
*/

class Queue{
	private LinkedList link;
	
	Queue(){
		link = new LinkedList();
	}
	
	public void myAdd(Object obj){
		link.addFirst(obj);
	}
	
	public Object myGet(){
		return link.removeLast();
	}
	
	public boolean isNull(){
		return link.isEmpty();
	}
}
class Demo{
	public static void main(String [] args){

		Queue q = new Queue();
		q.myAdd("java--1");
		q.myAdd("java--2");
		q.myAdd("java--3");
		q.myAdd("java--4");
		
		while(!q.isNull()){
			sop(q.myGet());
		}
		
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}
//14-10
import java.util.ArrayList;
import java.util.Iterator;

/*
去除ArrayList集合中重复元素。
*/


class Demo{
	public static void main(String [] args){

		ArrayList al = new ArrayList();
		al.add("java-01");
		al.add("java-01");
		al.add("java-01");
		al.add("java-02");
		al.add("java-02");
		al.add("java-03");
		
		al = singleElement(al);
		
		sop(al);
		
	}
	
	public static ArrayList singleElement(ArrayList al){
		ArrayList newAl = new ArrayList();
		
		Iterator it = al.iterator();
		
		//it.next() 调用一次,就要用it.hasNext()判断一次。
		while(it.hasNext()){
			Object obj = it.next();
			
			if(!newAl.contains(obj)){
				newAl.add(obj);
			}
		}
		return newAl;
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}
//14-11
import java.util.ArrayList;
import java.util.Iterator;

/*
将自定义的对象作为元素存到ArrayList中,并去除ArrayList集合中重复元素。

比如:人对象:同名,同年龄的 视为同一个对象,为重复元素。

List集合判断元素是否相同依据的是equals方法。
*/


class Person{
	private String name;
	private int age;
	
	Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public String getName(){
		return name;
	}
	
	public int getAge(){
		return age;
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(!(obj instanceof Person))
			return false;
		Person p = (Person) obj;
		System.out.println(this.name+"....."+p.name);
		return ((this.age == (p.age)) && (this.name.equals(p.name)));
	}
	
	
}

class Demo{
	public static void main(String [] args){

		ArrayList al = new ArrayList();
		
		al.add(new Person("mike01",30));//al.add(Object obj);//Object obj = new Person();
		al.add(new Person("mike02",31));
		al.add(new Person("mike03",32));
		al.add(new Person("mike03",32));
		al.add(new Person("mike04",30));
		al.add(new Person("mike04",30));
		al.add(new Person("mike04",30));
		
		sop("remove mike03, 30: "+al.remove(new Person("mike03",32)));
		al = singleElement(al);
		Iterator it = al.iterator();
		
		while(it.hasNext()){
			Person p = (Person)it.next();
			sop(p.getName()+"....."+p.getAge());
		}
		
		sop(al);
		
	}
	
	public static ArrayList singleElement(ArrayList al){
		ArrayList newAl = new ArrayList();
		
		Iterator it = al.iterator();
		
		//it.next() 调用一次,就要用it.hasNext()判断一次。
		while(it.hasNext()){
			Object obj = it.next();
			
			if(!newAl.contains(obj)){
				newAl.add(obj);
			}
		}
		return newAl;
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}
//14-12
import java.util.HashSet;
import java.util.Iterator;


/*
Set: 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
	|--HashSet:底层结构是Hash表。
	|--TreeSet:
Set集合的功能和Collection是一致的。
*/

class Demo{
	public static void main(String [] args){
		HashSet hs = new HashSet();
		sop(hs.add("java-01"));
		sop(hs.add("java-01"));
		sop(hs.add("java-02"));
		sop(hs.add("java-03"));
		sop(hs.add("java-04"));
		
		Iterator it = hs.iterator();
		
		while(it.hasNext()){
			sop(it.next());
		}
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}
//14-13
package com.eclipsedemo;

import java.util.HashSet;
import java.util.Iterator;


/*
Set: 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。
	|--HashSet:底层结构是Hash表。
		HashSet 是如何保证元素的唯一性的呢?
		是通过元素的两个方法,hashCode 和 equals来完成的。
		如果元素的hashcode值相同,才会判断equals是否为true;
		如果元素的hashcode值不相同,不会调用equals。
		
		注意:对于判断元素是否存在,以及删除等操作,依赖的方法是hashcode和equals。
		
	|--TreeSet:
Set集合的功能和Collection是一致的。
*/

class Demo{
	public static void main(String [] args){
		HashSet hs = new HashSet();
		hs.add(new Person("mike",20));
		hs.add(new Person("mik",20));
		hs.add(new Person("mke",30));
		hs.add(new Person("mke",30));
		hs.add(new Person("mike",20));
		
		
		sop("a1: " + hs.contains(new Person("mike",20)));
		sop("a2: " + hs.remove(new Person("mik",20)));
		Iterator it = hs.iterator();
		
		while(it.hasNext()){
			Person p = (Person) it.next();
			System.out.println(p.getName()+"....."+p.getAge());
		}
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}

class Person{
	private String name;
	private int age;
	
	Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public String getName(){
		return name;
	}
	
	public int getAge(){
		return age;
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(!(obj instanceof Person))
			return false;
		Person p = (Person) obj;
		System.out.println(this.name+"...equals .."+p.name);
		return ((this.age == (p.age)) && (this.name.equals(p.name)));
	}

	@Override
	public int hashCode() {
		System.out.println(name + "...hashCode");
		// TODO Auto-generated method stub
		return name.hashCode() + age*20;
	}
		
	
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值