Java学习笔记-第九章-Java集合框架(1)
- 格式:doc
- 大小:647.50 KB
- 文档页数:38
Java—集合框架List的indexOf()、lastIndexOf()集合中某个元素出现的位置—List的indexOf(),lastIndexOf() indexOf(Object obj)⽅法的实现机制是从序列(List)的第0个元素开始依次循环,并且调⽤每个元素的equals()⽅法和参数对象进⾏⽐较,如果某⼀个元素的equals()⽅法返回值为true,那么就把当前元素的索引位置作为结果返回。
假如序列中有多个重复的元素,只返回这个重复的元素第⼀次出现时所在的索引位置的值。
lastIndexOf(Object obj)⽅法,与indexOf()⽅法相反,它返回的是某个元素最后⼀次出现的索引位置的值,也就是它会从序列的队尾向队头进⾏遍历。
以上两个⽅法的参数对象如果在序列中都没有出现的话,那么这两个⽅法都会返回-1。
SetTest类部分⽰例代码:package com.test.collection;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Scanner;public class SetTest {public List<Course> coursesToSelect;private Scanner console;public static Student student;public SetTest() {coursesToSelect = new ArrayList<Course>();console = new Scanner(System.in);}public void testAdd() {Course c1 = new Course("1", "数据结构");//创建课程对象的实例Course c2 = new Course("2", "C语⾔");Course c3 = new Course("3", "离散数学");Course c4 = new Course("4", "汇编语⾔");Course c5 = new Course("5", "数据结构");Course[] course = {c1, c2, c3, c4, c5};coursesToSelect.addAll(Arrays.asList(course));}public void testListContains() {System.out.println("请输⼊课程名称:");String courseName = console.next();Course c3 = new Course(); = courseName;System.out.println("课程【" + + "】是否在备选课程中:" + coursesToSelect.contains(c3));if (coursesToSelect.contains(c3)) {System.out.println("课程:" + + "第⼀次出现的索引位置为:" + coursesToSelect.indexOf(c3));System.out.println("课程:" + + "最后⼀次出现的索引位置为:" + stIndexOf(c3));}}public static void main(String[] args) {SetTest st = new SetTest();st.testAdd();st.testListContains();}。
Java集合类的整体框架如下:从上图中可以看出,集合类主要分为两⼤大类:Collection和Map。
Collection是List、Set等集合⾼高度抽象出来的接⼝口,它包含了了这些集合的基本操作,它主要⼜又分Set接⼝口通常表示⼀一个集合,其中的元素不不允许重复(通过hashcode和equals函数保证),常⽤用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,⽽而TreeSet是通过Map 中的TreeMap实现的。
另外,TreeSet还实现了了SortedSet接⼝口,因此是有序的集合(集合中的元素要实现Comparable接⼝口,并覆写Compartor函数才⾏行行)。
我们看到,抽象类AbstractCollection、AbstractList和AbstractSet分别实现了了Collection、List和Set接⼝口,这就是在Java集合框架中⽤用的很多的适配器器设计模式,⽤用这些抽象类去实现接⼝口,在抽象类中实现接⼝口中的若⼲干或全部⽅方法,这样下⾯面的⼀一些类只需直接继承该抽象类,并实现⾃自⼰己需要的⽅方法即可,⽽而不不⽤用实现接⼝口中的全部抽象⽅方法。
Map是⼀一个映射接⼝口,其中的每个元素都是⼀一个key-value键值对,同样抽象类AbstractMap通过适配器器模式实现了了Map接⼝口中的⼤大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不不常⽤用的HashTable直接实现了了Map接⼝口,它和Vector都是JDK1.0就引⼊入的集合类。
Iterator是遍历集合的迭代器器(不不能遍历Map,只⽤用来遍历Collection),Collection的实现类都实现了了iterator()函数,它返回⼀一个Iterator对象,⽤用来遍历集合,ListIterator则专⻔门⽤用来遍历List。
L9 《集合框架》上机手册1.内容回顾(3-5分钟)1.集合与数组有什么区别?2.集合框架中所有集合的顶级父类是谁?提供了那些基本的方法?3.Collection与Collections的区别?4.Set,List, Map三种集合各自有什么特点?5.ArrayList , LinkedList ,Vector有什么区别?6.Hashtable和Propertise的父类是谁?他们都有什么特点?如何从Hashtable中取值?2.上机目标1.掌握常用集合类的使用,及其特点2.掌握常用集合类之间的区别与联系3.上机任务1.练习使用HashSet,并测试是否可以重复(20分钟)2.练习使用ArrayList ,并对内容进行排序(20分钟)3.练习Hashtable的使用(30分钟)4.指导练习4.1. 练习使用HashSet,并测试是否可以重复1.Set集合中不允许出现相同的项,Set集合在用Add()方法添加一个新项时,首先会调用equals(Object o)来比较新项和已有的某项是否相等,而不是用==来判断相等性,所以对于字符串等已重写equals方法的类,是按值来比较相等性的2.程序代码3.扩展知识在set类型的集合中,如何判断元素是否重复呢,这就需要使用Object.equals方法,但如果元素很多了,添加一个新元素时,比较的次数就很多,例如已经有100个元素了,添加第101个元素时,就要和前面的元素比较100次,效率很低。
JA V A中采用哈希表的原理,哈希是个人名,它提出了哈希算法的概念,哈希算法也称为散列算法,是将数据依据酸法直接指定到一个地址上,hascode实际上是返回的对象存储的物理地址HashSet类按照哈希算法来存取对象,当向集合中加入一个新对象时,会调用对象的HashCode()方法得到对象的哈希码,然后根据这个码计算出对象在集合中存储的位置。
Object类中定义了hashCode()和equals(Object o)方法,如果object1.equals(object2),那么说明这两个引用变量指向同一个对象,那么object1 and object2的hashCode也一定相等为了保证HashSet能正常工作,要求当两个对象用equals比较相等时,hashCode也要相等,否则就会有可能加入两个相同的项。
Java集合框架的知识总结说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。
1、综述所有集合类都位于java.util包下。
集合中只能保存对象(保存对象的引用变量)。
(数组既可以保存基本类型的数据也可以保存对象)。
当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。
从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类型(参见具体泛型的内容)。
Java的集合类主要由两个接口派生而出:Collection和Map,C ollection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List。
Map实现类用于保存具有映射关系的数据(key-value)。
Set、List和Map可以看做集合的三大类。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的k ey来访问其value。
对于Set、List和Map三种集合,最常用的实现类分别是HashSet、ArrayLi st和HashMap三个实现类。
(并发控制的集合类,以后有空研究下)。
2、Collection接口Collection接口是List、Set和Queue接口的父接口,同时可以操作这三个接口。
Collection接口定义操作集合元素的具体方法大家可以参考API文档,这里通过一个例子来说明Collection的添加元素、删除元素、返回集合中元素的个数以及清空集合元素的方法。
Java中的集合Collection、Iterator和Foreach⽤法(⼀)1.Java集合概述 在编程中,常常需要集中存放多个数据。
当然我们可以使⽤数组来保存多个对象。
但数组长度不可变化,⼀旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组就显得⽆能为⼒了;⽽且数组⽆法保存具有映射关系的数据,如成绩表:语⽂-80,数学-90,这种数据看上去像两个数组,但这两个数组的元素之间有⼀定的关联关系。
为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类。
集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
所有集合类都位于Java.util包下。
集合类和数组不⼀样,数组既可以是基本类型的值,也可以是对象(实际上保存的是对象的引⽤变量);⽽集合⾥只能保存对象,例如不能保存int、只能保存integer。
Java的集合类主要有两个接⼝派⽣⽽出:Collection和Map,Collection和Map是Java集合框架的根接⼝,这两个接⼝⼜包含了⼀些⼦接⼝和实现类 如下图所⽰Collection体系的继承树: 如上图所⽰显⽰了Collection体系⾥的集合,Set、List接⼝是Collection接⼝派⽣的两个⼦接⼝,它们分别代表了⽆序集合、有序集合;Queue[kju:]是Java提供的队列(队列特点:先进先出)实现,有点类似于List。
如下图所⽰Map体系的继承树: 如上图所⽰显⽰了Map接⼝的众多实现类,这些实现类在功能、⽤法上存在⼀定的差异,但他们都有⼀个功能特征:Map保存的每项数据都是key-value对,也就是由key和value两个值组成。
就向前 ⾯简绍的成绩单:语⽂-80,数学-90,每项成绩都是由2个值组成:科⽬名和成绩;Map⾥的key是不可重复的,key⽤于标识集合⾥每项数据,如果需要查询Map中的数据时,总是根据Map的key来获取。
Java集合-集合框架底层原理两个疑点解决1. 接⼝ A = new 实现类实现类 B = new 实现类 [接⼝-接⼝实现类(只能使⽤接⼝⽅法)接⼝实现类-接⼝实现类(接⼝和接⼝实现类⽅法都能实现)]; 样例: List = Arraylist/Linkdelist2. ⽗类 A = new ⼦类⼦类 B = new ⼦类() [⽗类-⼦类(只能使⽤继承来的⽅法并且调⽤的是⼦类的⽅法)]常见的ArrayList与LinkedList1. ArrayList中的操作:add,get,remove,set,size,toArray,clear等.ArrayList中的⽅法2. LinkedList:⾃⾝函数 + List + Queue等LinkedList中的⽅法集合框架1. Collection接⼝----Colections⼯具类(如同Arrays是数组的⼯具类),下图是Collection所实现的类2. ArrayList 与 Hashset ArrayList是顺序插⼊,可以重复的动态数组,⽽Hashset是⽆序插⼊,不能重复的set(不同JVM导致看起来不⼀样)3. Hashset与Hashmap hashset底层也是hashmap实现,根据key,查询value⾮常快(具体可以见下⾯代码),具体插⼊是先判断hashcode散列值 hashcode不⼀样,则不会重复,⽤数组存储 hashcode⼀样 ⽐较equals⼀样,则重复数据,Hashmap覆盖 ⽐较equals不⼀样,则不同数据,组成链表Hashmap底层剖析:hashmap(⾮线程安全)底层是数组和链表和红⿊树(jdk1.8以后)构成,这⾥就解释了哪⾥是数组(存储数据),哪⾥是链表(equals不同),⽽链表过长(⼤于8)的时候就要转成红⿊树,并且扩容(链表太长会导致查询效率过低),所以引出来了负载因⼦为0.75,hashmap的元素个数 * 0.75就要扩容。
【Java并发核⼼九】并发集合框架1、List接⼝:ArrayList 和 Vector ArrayList不是线程安全的,Vector是线程安全的,Vector有⼀个⼦类,可实现后进先出(LIFO)的对象堆栈(LinkedList 也是List接⼝的实现类)。
2、Set接⼝:HashSet 和 TreeSet Set接⼝最常见的实现类是HashSet,HashSet默认是以⽆序的⽅式组织元素的,⽽LinkedHashSet可以有序组织元素; Treeset不仅实现了Set接⼝,还实现了SortedSet和NavigableSet接⼝。
3、Queue 和 Deque 接⼝ 接⼝Queue是Collection接⼝的⼦接⼝,⽀持对表头的操作,接⼝Queue的⾮并发实现类是PriorityQueue; 接⼝Deque不仅⽀持对表头进⾏操作,⽽且还⽀持对表位进⾏操作,故Deque全称是“dubbo ended queue(双端队列)”,Deque的⾮并发实现类是ArrayDeque、LinkedList。
4、⾮阻塞队列: ConcurrentHashMap 多个并发线程同时使⽤同⼀个HashMap对象时,会出现“程序假死”状态,因为HashMap是线程不安全的,不能被多个线程所操作,⽽HashTable虽然是线程安全的,但是在多线程iterator()循环中调⽤remove()时会报异常,解决办法就是使⽤ConcurrentHashMap 代替。
后⾯写了⼀个test,可以参考⼀下。
ConcurrentSkipListMap ConcurrentHashMap不⽀持排序,⽽ConcurrentSkipListMap 是 ConcurrentHashMap 的可排序版本。
ConcurrentSkopListSet ⽀持排序且不允许重复的元素 ConcurrentLinkedQueue 提供并发环境的队列操作,常⽤⽅法:poll()、element()、peek()、add() ConcurrentLinkedDeque ConcurrentLinkedQueue 仅⽀持表头操作,ConcurrentLinkedDeque ⽀持队列头和队列尾双向操作 CopyOnWriteArrayList ArrayList是⾮线程安全类,如果想在并发中实现安全,需要使⽤CopyOnWriteArrayList,CopyOnWriteArrayList 可以在循环中删除元素 CopyOnWriteArraySet HashSet的线程安全实现package com.cd.thread;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class ConcurrentClassTest {public static void main(String args[]) {// mapTest();mapTest2();}public static void mapTest() { // HashMap并发测试,运⾏此⽅法,程序会假死Map map = new HashMap();new MyThread("⼩A", map).start();new MyThread("⼩B", map).start();}public static void mapTest2() { // ConcurrentHashMap并发测试,运⾏此⽅法,程序正常运⾏Map map = new ConcurrentHashMap();new MyThread("⼩A", map).start();new MyThread("⼩B", map).start();}private static class MyThread extends Thread {private String name;private Map map;private MyThread(String name, Map map) { = name;this.map = map;}public void run() {for (int i = 0; i < 50000; i++) {map.put(name + "-" + i, name + "-" + i);System.out.println(name + "-" + i);}}}}5、阻塞队列: ArrayBlockingQueue 有界阻塞队列 PriorityBlockingQueue 并发情况下的有限队列 LinkedBlockingQueue 与 ArrayBlockingQueue 功能⼀致,但是 LinkedBlockingQueue 是⽆界的 LinkedBlockingDueue LinkedBlockingQueue 的双向队列版本 SynchronousQueue 异步队列,每个插⼊操作必须等待另⼀个线程的对应移除操作,反之亦然。
Java集合框架之简述Java集合框架简述Java中的集合类是⼀种⼯具类,就像是容器,存储任意数量的具有共同属性的对象,集合框架是⼀个⽤来代表和操纵集合的统⼀架构,包含如下部分:1、接⼝:接⼝是代表集合的抽象数据类型,接⼝允许集合独⽴操纵其代表的细节。
java.util.Collection是集合框架的顶级接⼝,它包含了⼀些重要的⽅法,⽐如:size(), iterator(), add(), remove(), clear(),集合类中都会实现这些⽅法。
还有⼀些其它的重要接⼝,java.util.List, java.util.Set, java.util.Queue 和 java.util.Map。
Map接⼝是⼀个独⽴的接⼝,它没有实现接⼝Collection,但它是结合框架重要的⼀部分。
所有集合框架接⼝都在java.util包中。
序号接⼝描述Collection 接⼝1Collection 是最基本的集合接⼝,⼀个 Collection 代表⼀组 Object,即 Collection 的元素, Java不提供直接继承⾃Collection的类,只提供继承于的⼦接⼝(如List和set)。
2List 接⼝List接⼝是⼀个有序的 Collection,使⽤此接⼝能够精确的控制每个元素插⼊的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第⼀个元素的索引为 0,⽽且允许有相同的元素。
3SetSet 具有与 Collection 完全⼀样的接⼝,只是⾏为上不同,Set 不保存重复的元素。
4SortedSet继承于Set保存有序的集合。
5 Map将唯⼀的键映射到值。
6 Map.Entry描述在⼀个Map中的⼀个元素(键/值对)。
是⼀个Map的内部类。
7 SortedMap继承于Map,使Key保持在升序排列。
8 Enumeration这是⼀个传统的接⼝和定义的⽅法,通过它可以枚举(⼀次获得⼀个)对象集合中的元素。
第一章此次内容1.1.1.Java集合框架中常用接口及特征1.1.2.使用ArrayList存取数据1.1.3.使用HashMap存取数据1.1.4.Java中的泛型机制第二章具体内容2.1. 为什么要有集合2.1.1.Java中的例子2.1.2.package com.aaa.collection;2.1.3./**2.1.4.* @author ky2.1.5.* @version 创建时间:2019年8月9日2.1.6.* 希望有一个容器可以存储班级的20名学生的信息2.1.7.* 声明一个长度为20的数组2.1.8.* 我们使用随机数的方式给他们赋值算是20名学生的信息2.1.9.* 但是此时转班过来了三名同学,那么这个时候我们要存储23名学生的成绩2.1.10.* 此时我们应该怎么办?2.1.11.* 1.对数组扩容2.1.12.* 2.使用集合2.1.13.*/2.1.14.public class AAAClass {2.1.14.1. public static void main(String[] args) {2.1.14.1.1.int[] arr = new int[20];2.1.14.1.2.for (int i = 0; i < arr.length; i++) {2.1.14.1.2.1. arr[i] = (int)(Math.random() * 10);2.1.14.1.3.}2.1.14.1.4.for (int i : arr) {2.1.14.1.4.1. System.out.print(i + " ");2.1.14.1.5.}2.1.14.2. }2.1.14.3.2.1.15.}2.2. 集合的特性2.3. 只能存放引用数据类型2.4. 容量没有限制2.5. 由于集合的种类很多,不同的类有不同的特性,我们在使用的时候可以根据不同的需求对集合选择2.6. 集合都有哪些种类2.6.1.集合主要分为两类2.6.2.2.7. Collection学习2.8. package com.aaa.collection;2.9. import java.util.ArrayList; 2.10. import java.util.Collection;2.11. /**2.12. * @author ky2.13. * @version 创建时间:2019年8月9日2.14. * Collection2.15. * public interface Collection<E> extendsIterable<E>2.16. * 1.首先它是接口,其他他有父类2.17. *2.18. *Collection两个主要的子接口list,set2.19. * 如果去创建一个Collection家族的集合?2.20. * 要找实现类这次主要用ArrayList2.21. *2.22. * Collection定义了很多方法方法学习2.23. * 增加元素的方法2.24. * boolean add(E e) 把参数假如对象集合,返回值代表是否增加成功在这里里边E是泛型先不管2.25. * boolean addAll(Collection<? extends E> c)将指定集合中的所有元素添加到此集合(可选操作)2.26. * 移除元素的方法2.27. * void clear() 从此集合中删除所有元素(可选操作)。
2.28. * boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
2.29. * boolean removeAll(Collection<?> c) 删除指定集合中包含的所有此集合的元素(可选操作)。
2.30. * boolean retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
(你有的我才有你没有的我不留)2.31. * 获取元素的方法2.32. * 查找元素的方法2.33. * boolean contains(Object o) 如果此集合包含指定的元素,则返回true 。
2.34. * boolean containsAll(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回true。
2.35. * boolean isEmpty() 如果此集合不包含元素,则返回true 。
是否为空2.36. * 比较的方法2.37. * boolean equals(Object o) 将指定的对象与此集合进行比较以获得相等性。
2.38. * 操作的方法2.39. * int size() 返回此集合中的元素数。
2.40. * Object[] toArray() 返回一个包含此集合中所有元素的数组。
2.41. *2.42. */2.43. public class TestCollection {2.43.1.@SuppressWarnings({ "rawtypes", "unchecked" }) 2.43.2.public static void main(String[] args) {2.43.2.1. //利用实现得到了一个Collection对象2.43.2.2. Collection coll = new ArrayList();2.43.2.3. Collection coll1 = new ArrayList();2.43.2.4. boolean b = coll.add("你好");2.43.2.5. coll.add("你好1");2.43.2.6. coll.add("你好2");2.43.2.7. coll.add("你好3");2.43.2.8. coll1.add("nihao1");2.43.2.9. coll1.add("nihao2");2.43.2.10. c oll1.add("nihao3");2.44. // coll.addAll(coll1);2.45. // System.out.println(coll);2.46. // coll1.clear();2.47. // boolean res = coll.contains("你好21");2.48. // boolean res = coll.containsAll(coll1);2.49. // boolean res = coll.equals(coll1);2.50. // boolean res = coll.isEmpty();2.51. // boolean res = coll.remove("你好3");2.51.1.1. System.out.println(coll.toArray());2.51.2.}2.52. }2.53. List学习2.53.1.List的特点(他的特点是相对于set来说的) 2.53.2.不唯一可以有重复的元素2.53.3.有序,保证了插入时的顺序2.53.4.有索引,索引从0开始2.53.5.List方法学习2.54. package com.aaa.ky;2.55. import java.util.ArrayList;2.56. import java.util.Collection;2.57. import java.util.List;2.58. /**2.59. * @author ky2.60. * @version 创建时间:2019年8月12日2.61. * List学习2.62. * boolean add(E e) 将指定的元素追加到此列表的末尾(可选操作)。
2.63. * void add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。
2.64. * boolean addAll(Collection<? extends E> c) 按指定集合的迭代器(可选操作)返回的顺序将指定集合中的所有元素附加到此列表的末尾。
2.65. * void clear() 从此列表中删除所有元素(可选操作)。
2.66. * boolean contains(Object o) 如果此列表包含指定的元素,则返回true 。
2.67. * boolean containsAll(Collection<?> c) 如果此列表包含指定集合的所有元素,则返回true。
2.68. * boolean equals(Object o) 将指定的对象与此列表进行比较以获得相等性。
2.69. * E get(int index) 返回此列表中指定位置的元素。
2.70. * int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
2.71. * boolean isEmpty() 如果此列表不包含元素,则返回true 。
2.72. * E remove(int index) 删除该列表中指定位置的元素(可选操作)。
2.73. * boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)(可选操作)。
2.74. * boolean removeAll(Collection<?> c) 从此列表中删除包含在指定集合中的所有元素(可选操作)。
2.75. * boolean retainAll(Collection<?> c) 仅保留此列表中包含在指定集合中的元素(可选操作)。
2.76. * E set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
2.77. * int size() 返回此列表中的元素数。
2.78. * Object[] toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
2.79. * <T> T[] toArray(T[] a) 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素);2.80. * 返回的数组的运行时类型是指定数组的运行时类型。