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());
}
}
HashTable与HashMap的区别:
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); } } }