上一次给大家分享了一些数组和动态数组的概念,说到数组,不难想到容器,数组是一种最简单的容量固定的容器,后面我们又引出了可变容量容器-------动态数组,在今天这一讲里我们主要讲集合类和集合框架。集合框架是预定义在java.util包中的一类数据结构。
集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的,数组用来存放基本类型的数据,而集合用来存放对象的引用。常用的集合有List集合(列表),Set集合和Map集合(映射),其中List与Set继承了Collection接口。
1.List:是有序的Collection,常用List实现类是:
ArrayList类
LinkedList类
Stack(栈)
Vector(向量)
1.1. ArrayList:数组序列:有序的,可重复的,长度可变的,有下标的数据结构。
优点:因为地址连续,一旦数据存储好了,查询操作效率比较高。
缺点:因为地址连续,插入和删除操作效率比较低。不是线程同步的。
例1:班上有20位同学,学号是从1001~1020,从班上抽出1个一等奖,2个二等奖,5个三等奖,8个安慰奖,
所有获奖的人不能重复。
import java.util.*; public class prize { public static void main(String []args){ ArrayList list1=new ArrayList(); for(int i=0;i<20;i++){ list1.add(2001+i); } //创建随机数对象 Random rd=new Random(); //抽取一等奖 int index=rd.nextInt(list1.size());//随机一个下标 Object obj=list1.remove(index); System.out.println("一等奖是:"+obj); //将抽到的数据移除; for(int i=0;i<2;i++){ int index1=rd.nextInt(list1.size()); Object obj1=list1.remove(index1); System.out.println("二等奖是:"+obj1); } for(int i=0;i<5;i++){ int index2=rd.nextInt(list1.size()); Object obj2=list1.remove(index2); System.out.println("三等奖是:"+obj2); } for(int i=0;i<8;i++){ int index3=rd.nextInt(list1.size()); Object obj3=list1.remove(index3); System.out.println("安慰奖是:"+obj3); } }
运行结果:
一等奖是:2012 二等奖是:2010 二等奖是:2014 三等奖是:2002 三等奖是:2004 三等奖是:2020 三等奖是:2001 三等奖是:2006 安慰奖是:2016 安慰奖是:2003 安慰奖是:2017 安慰奖是:2018 安慰奖是:2007 安慰奖是:2015 安慰奖是:2005 安慰奖是:2009
1.2. LinkedList:链表,链式序列, 有序的,可重复的,长度可变的,有下标,地址任意,各个数据之间通过引用关联
优势:由于地址是任意的,非常适合进行插入和删除的操作。
缺点:查询性能比较低。
例2.为LinkedList列表添加元素,并选择移除元素。
public class LinkedListDemo { public static void main(String[] args) { // 创建链表对象 LinkedList<String> list = new LinkedList<String>(); // 加入元素 list.add("元素一"); list.offer("元素二"); list.addLast("元素三"); list.offerLast("元素四"); list.addFirst("元素五"); list.add(0, "元素六"); list.remove(3); for(int i=0;i<list.size();i++){ String str = list.get(i); System.out.println(str); }
运行结果:
元素六 元素五 元素一 元素三 元素四
1.3. 向量Vector:Vector和ArraryList都是大小可变数组的实现,使用方法与ArraryList一样。
区别:ArraryList不是同步的
Vector是同步的,在多线程中一般采用Vector。
栈 Stack : 后进先出,最先放入的数据在栈的底部,最后放的数据在栈的底部, 每次取数据只能取到栈顶的数据.其中Stack是Vector的子类。
例3.
public class StackDemo { public static void main(String[] args) { //创建一个栈对象 Stack<String> stack = new Stack<String>(); //将数据压入栈 stack.push("张三"); stack.push("李四"); stack.push("王五"); //查看栈顶的对象 String str = stack.peek(); System.out.println(str); //获取并移除栈顶对象 将数据弹出栈 String str2 = stack.pop(); System.out.println(str2); String str3 = stack.pop(); System.out.println(str3); } } 运行结果:
王五 王五 李四
2. 集合 :Set:无重复的Collection.必须使用迭代器才能获取数据。
常用的Set实现类:
HashSet:无序的,不可重复的,长度可变的
TreeSet:根据的内容的自然顺序(阿斯克码)进行排序。
例4. 创建一个HashSet集合,并获取数据。
import java.util.*; public class Setdome { public static void main (String[]args){ HashSet set=new HashSet(); set.add("a张三"); set.add("a李四"); set.add("a王五"); //取出元素 //1.将set中的数据放入迭代器,并返回迭代器; Iterator iter=set.iterator(); //2.开始迭代 while(iter.hasNext()){ Object obj=iter.next(); System.out.println(obj); } //加强版的迭代器 // for(Object obj:set){ // System.out.println(obj); // } }
运行结果:
a王五 a李四 a张三
例5. 有一个数组,String [] tst={"小六子",“小顺子”,“张三丰”,“小六子”,“周芷若”,“赵敏”,“张三丰”,“周芷若”,“谢逊”,“伯通”};去掉重复名字在进行排序。
package com.zjx.List; import java.util.*; public class SetDemo1 { public static void main(String[]args){ //创建数组 TreeSet tst=new TreeSet(); //添加数据 tst.add("小六子"); tst.add("小顺子"); tst.add("张三丰"); tst.add("小六子"); tst.add("周芷若"); tst.add("赵敏"); tst.add("张三丰"); tst.add("周芷若"); tst.add("谢逊"); tst.add("伯通"); //方法一 Iterator iter=tst.iterator(); while(iter.hasNext()){ Object obj=iter.next(); System.out.println(obj); } } }
运行结果:
伯通 周芷若 小六子 小顺子 张三丰 谢逊 赵敏
3.映射:Map:将键映射到值得一种结构,键是一个Set,键不能重复,每个键都对应一个值。
常用的Map实现类:
HashMap:键是一个HashSet,k是一个HashSet
TreeMap: 键是一个TreeSet, k是一个TreeSet
所有的k不能重复,每个k都对应一个Value
如果在加入额外数据的时候,出现相同的key,则替换掉原来的Value
例6.创建一个HashMap类,添加数据,并获取数据
import java.util.*; public class HashMapDemo { public static void main(String[]args){ //创建HashMap对象 HashMap<Integer,String> map=new HashMap<Integer,String>(); map.put(1011, "张三"); map.put(1012, "李四"); map.put(1013, "王五"); map.put(1014, "赵六"); //取出数据 //1.取出的k Set set= map.keySet(); Iterator iter=set.iterator(); while( iter.hasNext()){ Object key =iter.next(); String value=map.get(key); System.out.println(key+""+value); } } }
运行结果:
1011张三 1012李四 1013王五 1014赵六
例7.String str =“abbbccccdddffffgg”,统计这个字符串中每个字符出现的次数,其中Map, K:字符,V:出现的次数
import java.util.*; public class mapdemo { public static void main(String []args){ HashMap<Character,Integer> map= new HashMap<Character,Integer>(); String str="abbbccccdddffffgg"; for(int i=0;i<str.length();i++){ char c=str.charAt(i); boolean b=map.containsKey(c); if(b){ int value =map.get(c); value++; map.put(c, value); }else { map.put(c, 1); } } Set<Character> set=map.keySet(); Iterator<Character> iter=set.iterator(); while (iter.hasNext()){ char key=iter.next(); int value=map.get(key); System.out.println(key+"出现:"+value+"次"); } } }
运行结果:
f出现:4次 g出现:2次 d出现:3次 b出现:3次 c出现:4次 a出现:1次