JAVA集合
来源:互联网 发布:联通网络电话卡 编辑:程序博客网 时间:2024/05/16 06:50
首先需要清楚JDK类库给我们提供了Java集合,所有的Java集合都位于java.unti包中。与Java数组不同,Java集合不能存放基本类型数据,而只能存放对象的引用。
一、了解集合框架
1.1集合概念
集合有时称为容器,是一个包含很多元素的对象。集合可用来存储,检索和操作数据。
1.2集合框架
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。所有的集合框架包含:接口、实现以及算法。
二、接口与实现
集合接口封装了不同的,collection接口是集合框架的基础,如图:
Set是一种特殊的Collection,SortedSet又是一种特殊的Set,Map不属于Collection。所有的Collection接口都是支持泛型的。
public interface Collection<T>,但是当要定义一个Collection实例的时候,需引入指定在该集合中包含的对象的类型。这可让编译器在编译时明确放入该集合的元素是那种类型的,减少了运行时错误的发生。
在理解了怎样使用这些接口后,也就理解了Java集合的框架,会根据实际情况选择哪一种集合接口。
下面简单介绍一下集合接口。
Collection接口是一组允许重复的对象。
Set接口继承Collection,但不允许重复,使用自己内部的一个排列机制。
List接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
Map接口是一组成对的键—值对象,即所持有的是key_value pairs.Map中不能有重复的Key。
三,接口中的方法
3.1 Collection接口
Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用此接口,可以把集合转换成任何其他的对象组。但是,不能直接把集合转换成基本数据类型的数组,因为集合必须持有对象。
1.单元素的添加、删除操作boolean add(Object o):将对象添加给集合;boolean remove(Object o):如果集合中有与o相匹配的对象,则删除对象o;2.查询操作int size():返回当前集合中元素的个数boolean isEmpty();boolean contains(Object o):查找集合中是否有对象oIterator iterator():返回一个迭代器,用来访问集合中各个元素3.组操作boolean containsAll(Collection c):查找集合中是否含有集合c中的所有元素boolean addAll(Collection c):将集合c中所有元素添加到该集合void RemoveAll(Collection c):删除void retainAll(Collection c):从集合中删除集合c不包含的元素4.遍历集合两种方式:(1)通过for_each结构for(Object o:collection){System.out.println(o);}(2)使用迭代器迭代器是一种能遍历集合并且能从集合删除元素的对象。可以通过调用Collection接口中的Iterator方法创建该对象。下面是Iterator接口的定义:public interface Iterator<T>{ boolean hasNext(); T next(); void remove(); }如何使用迭代器:Iterator<T> it = list.iterator(); while(it.hasNext()){ T data = it.next(); System.out.print(data + " "); }Collection转换为Object数组Object[] toArray():返回一个内含集合所有元素的arrayObject[]toArray(Object[] a)返回一个内含集合所有元素的array,运行期返回的array和参数a的类型相同,需要转化为正确的类型。
3.2 List接口
List接口继承了Collection接口,可以定义一个有重复项的有序集合。
1.面向位置的操作包含Collection的功能,还包括获取、除去或更改元素的功能。在List中搜索元素可以从列表的头部或者尾部开始,如果找到,返回元素的位置。void add(int index,Object elenemt)boolean addAll(int index,Collection c);Object get(int index)返回List中指定位置的元素int indexOf(Object o)返回第一个出现o的位置2.处理集合的子集ListIterator listIterator():返回一个列表迭代器,用来访问列表中的元素
ArrayList和LinkedList
Java平台包含两种常用List实现:ArrayList和LinkedList。使用两种List的哪一种取决于特定的需要。如果要支持随机访问,而不必在尾部任何位置插入或者去除元素,那么,ArrayList提供了可选的集合。但如果要频繁的从列表的中间位置添加和去除元素,而只要顺序地访问列表中的元素,那么LinkedList实现更好。
LinkedList的方法:getFirst() getLast()获取元素,但不删除,操作失败,抛出异常(NoSuchElementException);peekFirst()peekLast()获取元素,但不删除,失败返回null;add:队尾入 remove:对头出 element:查看对头元素 失败抛异常 NoSuchElementExceptionoffer:队尾入 poll 对头出 peek 失败返回null
练习代码:public static void testArrayList(){ //需要一个数组序列容器,=》ArrayList ArrayList<Integer> list1 = new ArrayList<Integer>(); for(int i=0; i<10; ++i){ list1.add((int)(Math.random()*100)); } printList(list1); list1.add(0, 100); printList(list1); //list1.add(100, 200); int index = 0; if((index = list1.indexOf(100)) != -1){ list1.remove(index); } printList(list1); list1.set(0, -2); printList(list1); Object[] array1 = list1.toArray(); System.out.println(Arrays.toString(array1)); Integer[] array2 = new Integer[1];//将容器元素返回到数组中 array2 = list1.toArray(array2); //此处可以推到数组元素的类型的 System.out.println(Arrays.toString(array2)); List<Integer> list2 = Arrays.asList(array2); for(int val : list2){ System.out.print(val + " "); } System.out.println(); System.out.println(list1.retainAll(list2)); System.out.println(list1.addAll(list2)); System.out.println(list1.containsAll(list2)); }
练习代码:public static void testLinkedList(){ LinkedList<Integer> list1 = new LinkedList<Integer>(); for(int i=0; i<10; ++i){ list1.add((int)(Math.random()*100)); } printList(list1); list1.addFirst(10); printList(list1); list1.addLast(20); printList(list1); list1.add(30); printList(list1); list1.remove(); printList(list1); list1.offer(40); printList(list1); list1.poll(); printList(list1); System.out.println(list1.peek()); list1.clear(); System.out.println(list1.peek()); //对于所有的Java集合容器,都支持普通的额向后遍历的迭代器 //但对于LinkedList,还提供的双向迭代器 ListIterator<Integer> list = list1.listIterator(); System.out.println(list.hasPrevious()); }
**重点内容**ArrayList和LinkedList的区别?
(1)都是Llist接口实现的,但是LinkedList还实现了Deque;
(2)但是ArrayList底层是个数组,LinkedList底层是个双向循环链表;
(3)LinkedList提供了双向迭代器,ArrayList只有普通的向后遍历的迭代器;
(4)LinkedList便于删除插入,ArrayList便于查找;
(5)需要链表、栈、队列时最好实现LinkedList;
3.3 Queue接口
Queue接口除了可以使用Collection的方法,还提供了加入(offer())、删除(poll())等操作;
需要注意的是:Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获并移除元素。他们的优点是通过返回值可以判断成功与否;
练习:创建ArrayList对象,加入10000个随机整数,整数的范围是0-20000请在最短时间内打印出最大的前10个元素!(PriorityQueue()小跟堆)请在最短时间内打印出最小的前10个元素!(PriorityQueue()大根堆来实现)代码如下:class TestList{public static void testPriorityQueue(){ //最小前10个元素(利用大根堆,将要插入的元素与堆根元素比较,堆根元素大于要插入的元素,这移出堆根元素,将新元素插入) PriorityQueue<Integer> queue= new PriorityQueue<Integer>(10,new Comparator<Integer>(){//利用构造函数变成大根堆 @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub int res=o1-o2; return res>0?-1:(res==0?0:1); } }); ArrayList<Integer> list=new ArrayList<Integer>(); for(int i=0;i<10000;i++){ list.add((int)(Math.random()*20000)); } int size=10; for(int i=0;i<size;i++){ queue.add(list.get(i)); } for(int i=size;i<10000;i++){ int value=list.get(i); int data=queue.peek(); //返回头部元素 if(data>value){ queue.remove(data);//删除 queue.add(value); } } while(!queue.isEmpty()){ int top = queue.peek(); System.out.print(top + " "); queue.poll(); //出队 } System.out.println();}public static void testPriorityQueue1(){ //小根堆 ArrayList<Integer> list=new ArrayList<Integer>(); PriorityQueue<Integer> queue=new PriorityQueue<Integer>(); for(int i=0;i<10000;i++){ list.add((int)(Math.random()*20000)); } int size=10; for(int i=0;i<size;i++){ queue.add(list.get(i)); } for(int i=size;i<10000;i++){ int value=list.get(i); int data=queue.peek(); //peek返回头部元素 if(data<value){ queue.remove(data); queue.add(value); } } while(!queue.isEmpty()){ int top = queue.peek(); System.out.print(top + " "); queue.poll(); } System.out.println();}}public class TestCollectionDemo1 { @Test public void testPriorityQueue(){ System.out.println("最小前10个元素 "); TestList.testPriorityQueue(); } @Test public void testPriorityQueue1(){ System.out.println("最大前10个元素"); TestList.testPriorityQueue1(); }}
运行结果:
- Java集合:集合框架
- java集合---set集合
- JAVA 集合 的 集合
- 【集合】Java集合对比
- JAVA集合-Map集合
- JAVA集合-Set集合
- JAVA集合-List集合
- java集合------Map集合
- Java集合----List集合
- Java集合----Set集合
- Java集合----Map集合
- JAVA集合
- JAVA集合
- Java集合
- JAVA集合
- Java集合
- Java集合
- java 集合
- LeetCode.368 Largest Divisible Subset(经典DP问题)
- 跨链技术之ILP详解及应用
- 【Scikit-Learn 中文文档】模型评估: 量化预测的质量
- Spring boot 集成JavaMail服务发送邮件
- Json的知识点
- JAVA集合
- Dota2 AI 简易开发教程
- 20171127 自省
- 程序员专用的简历神器,让你制作简历更简单,方便,专业
- 实现QQ登录界面,密码框出现提示文字的效果
- Codeforces Round #448 (Div. 2) E. Eyes Closed
- 如何在NLP领域干成第一件事?
- 指针
- OpenCV的+安卓+号牌识别(OpenCV + Android + 图像水平矫正)