Java集合框架(List、Set、Map、Queue)

Java集合框架:Java.util

                               ---------》List接口---------》ArrayList实现类、LinkedList实现

collection接口

      ----------》Set接口---------》HashSet实现类、TreeSet实现类


     ----------》HashMap实现类

Map接口

                            -----------》TreeMap实现类

ArrayList用法:

特点:有序可重复,底层实现是数组,线程不安全,效率高,查询快,修改、删除、插入慢

/**
 * 测试ArrayList
 */
import java.util.ArrayList;
import java.util.List;

public class TestArraylist {

	public static void main(String[] args) {
		Dog ouou = new Dog("欧欧", "雪纳瑞");
		Dog yaya = new Dog("丫丫", "拉布拉多");
		Dog meimei = new Dog("美美", "雪纳瑞");
		Dog feifei = new Dog("菲菲", "土狗");
		Penguin qiqi = new Penguin("奇奇", "帝企鹅");
		List pets = new ArrayList();//创建ArrayList对象
		pets.add(ouou);//添加对象
		pets.add(yaya);
		pets.add(meimei);
		pets.add(2, feifei);
		pets.add(qiqi);
		// 删除前
		System.out.println(pets.size());//获取列表元素个数
		System.out.println("分别是:");
		for (int i = 0; i < pets.size(); i++) {
			Pet pet = (Pet) pets.get(i);
			if (pet instanceof Dog) {
				Dog dog = (Dog) pet;//默认为Object类型
				System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
			} else {
				Penguin penguin = (Penguin) pet;
				System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
			}
		}
		pets.remove(0);//移除
		System.out.println(pets.size());
		System.out.println("分别是:");
		for (int i = 0; i < pets.size(); i++) {
			Pet pet = (Pet) pets.get(i);
			if (pet instanceof Dog) {
				Dog dog = (Dog) pet;
				System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
			} else {
				Penguin penguin = (Penguin) pet;
				System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
			}
		}
		pets.remove(feifei);
		System.out.println(pets.size());
		// 删除后

		System.out.println("分别是:");
		for (int i = 0; i < pets.size(); i++) {
			Pet pet = (Pet) pets.get(i);
			if (pet instanceof Dog) {
				Dog dog = (Dog) pet;
				System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
			} else {
				Penguin penguin = (Penguin) pet;
				System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
			}
		}
		if (pets.contains(ouou)) {
			System.out.println("存在");
		} else {
			System.out.println("不存在");

		}
	}

}

LinkedList用法:

特点:有序可重复,底层实现是链表,线程不安全,效率高,查询慢,修改、删除、插入快

import java.util.LinkedList;


/**
 * 测试LinkedList
 * 
 * @author 30869
 *
 */
public class TestLinkedList {


public static void main(String[] args) {
Dog ouou = new Dog("欧欧", "雪纳瑞");
Dog yaya = new Dog("丫丫", "拉布拉多");
Dog meimei = new Dog("美美", "雪纳瑞");
Dog feifei = new Dog("菲菲", "土狗");
Penguin qiqi = new Penguin("奇奇", "帝企鹅");
LinkedList pets = new LinkedList();
pets.add(ouou);
pets.add(yaya);
pets.addFirst(meimei);
pets.add(2, feifei);
pets.addLast(qiqi);
System.out.println("分别是:");
for (int i = 0; i < pets.size(); i++) {
Pet pet = (Pet) pets.get(i);
if (pet instanceof Dog) {
Dog dog = (Dog) pet;
System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
} else {
Penguin penguin = (Penguin) pet;
System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
}
}
Dog dog = (Dog) pets.getFirst();
System.out.println("查看第一条内容:" + dog.getName() + "\t" + dog.getStrain());
Penguin penguin = (Penguin) pets.getLast();
System.out.println("查看最后一条内容:" + penguin.getName() + "\t" + penguin.getStrain());
pets.removeFirst();// 删除第一条
System.out.println("删除第一条");
for (int i = 0; i < pets.size(); i++) {
Pet pet = (Pet) pets.get(i);
if (pet instanceof Dog) {
dog = (Dog) pet;
System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
} else {
penguin = (Penguin) pet;
System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
}
}
pets.removeLast();// 删除最后一条
System.out.println("删除最后一条");
for (int i = 0; i < pets.size(); i++) {
Pet pet = (Pet) pets.get(i);
if (pet instanceof Dog) {
dog = (Dog) pet;
System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
} else {
penguin = (Penguin) pet;
System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
}
}
}


}

HashSet的用法:

特点:无序,不可重复,可以存储相同的元素,但是size()和Iterator.next()方法只返回不同元素的个数和值,底层实现是HashMap,

    add()方法的参数作为HashMap的key,Value为常量

优点:查询效率比较高
/**
 * 测试HashSet
 */
import java.util.HashSet;
import java.util.Set;


public class TestHashSet {


public static void main(String[] args) {
Dog ouou = new Dog("欧欧", "雪纳瑞");
Dog yaya = new Dog("丫丫", "拉布拉多");
Dog meimei = new Dog("美美", "雪纳瑞");
Dog feifei = new Dog("菲菲", "土狗");
Penguin qiqi = new Penguin("奇奇", "帝企鹅");
Set pets = new HashSet();
pets.add(ouou);
pets.add(yaya);
pets.add(meimei);
pets.add(feifei);
pets.add(qiqi);
for (Object pet : pets) {
if (pet instanceof Dog) {
Dog dog = (Dog) pet;
System.out.println("名字:" + dog.getName() + "\t品种:" + dog.getStrain());
} else {
Penguin penguin = (Penguin) pet;
System.out.println("名字:" + penguin.getName() + "\t品种:" + penguin.getStrain());
}
}
}


}



HashMap用法:

特点:存储方式为key-value(键值对),key无序,不可重复,value无序,可重复,底层实现是数组+链表(每个索引位置包含一个链表)

优点:查询指定元素效率比较高



/**
 * 测试HashMap
 */
import java.util.HashMap;
import java.util.Map;


public class TestHashMap {


public static void main(String[] args) {
Map countrys = new HashMap();
countrys.put("CN", "中国");
countrys.put("FN", "法国");
countrys.put("AN", "美国");
System.out.println("CN对应的是:" + countrys.get("CN"));
System.out.println("FN对应的是:" + countrys.get("FN"));
System.out.println("元素个数:" + countrys.size());
System.out.println("是否包含AN键:" + countrys.containsKey("AN"));
countrys.remove("AN");
System.out.println("移除之后是否包含AN键:" + countrys.containsKey("AN"));
System.out.println("键:" + countrys.keySet());
System.out.println("值:" + countrys.values());
System.out.println("是否为空:" + countrys.isEmpty());
countrys.clear();
System.out.println("清空后是否为空:" + countrys.isEmpty());
}


}

 

HashTableHashMap的区别:

1、HashMap 线程不安全,非同步,效率相对高

      HashTable线程安全,同步,效率先对低

2、HashMap父类是AbstractMap

      HashTable父类是Dictionary

3、HashMap键可以有一个null,值可以有多个null

      HashTable键值都不能为null


关于WeakHashMap的特点:

强引用类型:字符串常量   String str="xxx";

弱引用类型:字符串对象   String str=new String("xxx");

如果key弱引用类型,通知gc则立即回收,适合用于内容过多,需要释放内存的Map

gc回收方法:

System.gc();

System.runfinalization();



关于 IdentityHashMap的特点:

key比较的是地址、去重

如果key为常量池的字符串,则value会覆盖

IdentityHashMap<String, String> iHashMap=new IdentityHashMap<String,String>();
iHashMap.put("a", "a1");
iHashMap.put("a", "a2");
iHashMap.put("a", "a3");
System.out.println(iHashMap.size());//结果是1
System.out.println(iHashMap.get("a"));

//输出结果是a3



IdentityHashMap<String, String> iHashMap=new IdentityHashMap<String,String>();
iHashMap.put(new String("a"), "a1");
iHashMap.put(new String("a"), "a2");
iHashMap.put(new String("a"), "a3");
System.out.println(iHashMap.size());//结果是3
}


关于EnumMap:

import java.util.EnumMap;

/**
 * 测试EnumMap
 * @author 30869
 *要求key必须是枚举值
 */
public class TestEnumMap {

	public static void main(String[] args) {
		EnumMap<Season, String> enumMap=new EnumMap<Season, String>(Season.class);
		enumMap.put(Season.SPRING, "春困");
		enumMap.put(Season.SUMMER, "夏无力");
		enumMap.put(Season.AUTUMN, "秋乏");
		enumMap.put(Season.WINTER, "冬眠");
		System.out.println(enumMap.size());
	}

}
/**
 * 季节枚举
 * @author 30869
 *
 */
enum Season{
	SPRING,SUMMER,AUTUMN,WINTER
}



TreeSet:





public class Person {
private final String name;//名字   final类型,TreeSet元素排序后不可更改
private final int handsome;//帅气指数 
public Person() {
name=null;
handsome=0;
}
public Person(String name, int handsome) {
super();
this.name = name;
this.handsome = handsome;
}
public String getName() {
return name;
}

public int getHandsome() {
return handsome;
}

@Override
public String toString() {
return "姓名:"+this.name+",帅气指数:"+this.handsome+"\n";//重写toString,为了打印输出直观
}
}




import java.util.TreeSet;


/**
 * TreeSet容器  使用解耦方式 实现业务排序类
 * 数据特点:去重(不可重复)
 * 不要修改数据,可能造成数据重复
 * @author 30869
 *
 */


public class TreeSet_Test_function1 {


public static void main(String[] args) {
Person persons1=new Person("李林",1000);
Person persons2=new Person("杨洋",999);
Person persons3=new Person("陈学冬",1001);
Person persons4=new Person("鹿晗",1002);
Person persons5=new Person("王俊凯",999);
//将数据放进TreeSet中
TreeSet<Person> treeSet=new TreeSet<Person>(
//需要使用排序的业务类(匿名内部类)
new java.util.Comparator<Person>(){


public int compare(Person o1, Person o2) {
return o1.getHandsome()-o2.getHandsome();
}

}
);
//TreeSet在添加数据是排序
treeSet.add(persons1);
treeSet.add(persons2);
treeSet.add(persons3);
treeSet.add(persons4);
treeSet.add(persons5);

System.out.println(treeSet);
/* //改变数据,排序顺序依然不变(因为TreeSet是在添加时进行排序)
persons2.setHandsome(10000);
//修改数据造成重复
persons4.setHandsome(10000);
persons4.setName("杨洋");
System.out.println(treeSet);*/

}


}




import java.util.TreeSet;


/**
 * TreeSet 实体类实现Comparable的应用
 * @author 30869
 *
 */
public class TreeSet_Test_function2 {


public static void main(String[] args) {
Worker w1=new Worker("垃圾回收员",12000);
Worker w2=new Worker("程序员",6000);
Worker w3=new Worker("架构师",15000);
Worker w4=new Worker("工厂职员",5000);
TreeSet<Worker> workers=new TreeSet<Worker>();
workers.add(w1);
workers.add(w2);
workers.add(w3);
workers.add(w4);
System.out.println(workers);

}


}

TreeMap:


import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;


public class TreeMap_Test_function1 {
/**
* TreeMap容器  使用解耦方式 实现业务排序类(匿名内部类)
* 数据特点:去重(不可重复)
* 不要修改数据,可能造成数据重复
* @author 30869
*
*/
public static void main(String[] args) {
Person persons1=new Person("李林",1000);
Person persons2=new Person("杨洋",999);
Person persons3=new Person("陈学冬",1001);
Person persons4=new Person("鹿晗",1002);
Person persons5=new Person("王俊凯",999);
//将数据放进TreeMap中
TreeMap<Person,String> treeMap=new TreeMap<Person,String>(
//需要使用排序的业务类(匿名内部类)
new java.util.Comparator<Person>(){


public int compare(Person o1, Person o2) {
return o1.getHandsome()-o2.getHandsome();
}

}
);
//TreeMap在添加数据时排序
treeMap.put(persons1,"李林");
treeMap.put(persons2,"李林");
treeMap.put(persons3,"李林");
treeMap.put(persons4,"李林");
treeMap.put(persons5,"李林");
Set<Person> persons=treeMap.keySet();//查看键
System.out.println(persons);


}


}






import java.util.Set;
import java.util.TreeMap;


/**
 * TreeMap 实体类实现Comparable的应用
 * @author 30869
 *
 */
public class TreeMap_Test_function2 {


public static void main(String[] args) {
Worker w1=new Worker("垃圾回收员",12000);
Worker w2=new Worker("程序员",6000);
Worker w3=new Worker("架构师",15000);
Worker w4=new Worker("工厂职员",5000);
TreeMap<Worker, String> treeMap=new TreeMap<Worker, String>();
treeMap.put(w1, "李林");
treeMap.put(w2, "李林");
treeMap.put(w3, "李林");
treeMap.put(w4, "李林");
Set<Worker> workers=treeMap.keySet();//查看键
System.out.println(workers);
}


}


Queue:

特点:分为单向队列和双向队列

单向:

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * 测试队列Queue接口,单向队列ArrayDeque,FIFO(先进先出)
 * 模拟银行存款
 * @author 30869
 *
 */
public class TestQueue {

	public static void main(String[] args) {
		Queue<Request> queue=new ArrayDeque<Request>();//创建Queue接口的实现类ArrayDeque对象
		//办理业务
		for(int i=0;i<10;i++){
			final int num=i;//匿名内部类只能访问常量属性,所以用num接收i即可
			queue.offer(new Request() {//这里相当于创建一个实现Request接口的匿名类对象,将对象插入ArrayDeque
				
				@Override
				public void deposit() {//实现接口的抽象存款方法
					System.out.println("第"+(num+1)+"个人办理业务,存款金额"+(Math.random()*10000));
				}
			});
		}
		dealwith(queue);//调用静态方法处理业务,传入队列对象
	}
	/**
	 * 处理业务,也就是获取并移除queue中的元素,使用ArrayDeque的poll()方法
	 * @param queue 队列
	 */
	public static void dealwith(Queue<Request> queue){
		Request request=null;//需要定义一个对应的空属性接收
		while(null!=(request=queue.poll())){
			request.deposit();//调用对象的方法,输出信息
		}
	}

}
interface Request{//请求
	void deposit();//存款
}

双向:

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 使用双向队列实现自定义堆栈(1、弹栈 ,2、压栈、3、获取头)
 * @author 30869
 *
 * @param <E>
 */
public class MyStack<E> {
	private Deque<E> deque=new ArrayDeque<E>();//存储字符串的双向队列
	private int cap;//队列容量
	/**
	 * 压栈
	 * @return  超出容量返回false,否则添加元素至最后位置
	 */
	public boolean push(E e){
		if(deque.size()+1>cap){
			return false;
		}
		return deque.offerLast(e);
	}
	/**
	 * 弹栈
	 * @return  获取并移除的最后一个元素
	 */
	public E pop(){
		return deque.pollLast();
	}
	/**
	 * 获取头
	 * @return 
	 */
	public E peek(){
		return deque.peekLast();
	}
	/**
	 * 获取队列元素个数
	 * @return
	 */
	public int size(){
		return deque.size();
	}
	public MyStack() {
	}
	
	/**
	 * 构造方法只需要指定容量
	 * @param cap
	 */
	public MyStack(int cap) {
		super();
		this.cap = cap;
	}
}




/**
 * 测试使用双向队列Deque接口自定义的堆栈
 * @author 30869
 *
 */
public class TestMystack {

	public static void main(String[] args) {
		MyStack<String> myStack=new MyStack<String>(3);//容量为3的堆栈
		myStack.push("www.baidu.com");
		myStack.push("www.google.com");
		myStack.push("www.sina.com");
		myStack.push("www.lilin.com");//指定了容量,所以这条信息不会压
		System.out.println("大小:"+myStack.size());
			String str=null;//接收弹栈信息
			int count=0;
			while(null!=(str=myStack.pop())){
				System.out.println(str);
		}
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值