一、 概述 1.集合,数组都是对多个数据进行存储操作的结构,简称java容器 说明:此时的存储,只要指的是内存层面的存储,不涉及到持久化的存储(.txtjpg,.avi,数据) 2.数组在存储多个数据方面的特点 一旦初始化以后,其长度就确定了 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了 比如:String[]arr,int[]arr1,Object[]arrw 3.数组在存储多个数组方面的缺点 一旦初始化以后,其长度就不可修改 数组中提供的方法非常有限,对于添加,删除,插入数据等操作,非常不便,同时效率不高 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用 数组存储数据的特点:有序,可重复。对于无序,不可重复的需求,不能满足 4.集合框架体系 ArrayList的源码分析 结论:建议开发中使用带参的构造器:ArrayList list=new ArrayList(int capacity) Jdk8中ArrayList的变化 LinkedList的源码分析
Veator的源码分析:jdk7和jdk8通过Vector()构造器创建对象时,底层都创建了长度为10的数组 在扩容方面,默认扩容为原来的数组长度的2倍 ArrayList,LinkedList,Vector三者的异同? 同:三各类都是实现了List接口,存储数据的特点相同:存储有序的,可重复的数据 不同:底层源码实现方式不同 ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。 ArrayList和Vector的区别 Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类,因为开销就比ArrayList要大,访问要慢。正常情况下,大多数的java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。 List中的方法 Viod add(int index,Object ele):在undex位置插入ele元素 Boolean addAll(int index, Collection eles):从index位置开始将eles中的所有被元素添加进来 IntindexOf(Object obj):返回obj在集合中首次出现的位置 intLastIndexOf(Object obj):返回obj在集合中末次出现的位置 Object remlove(int index):移除指定index位置元素,并返回此元素 Object set(int index,Object ele):设置指定index位置的元素ele =List subList(int fromindex,int tonIndex):返回从fromIndex到toIndex()位置的子集合= 总结常用方法: 增:add(Object obj) 删:remove(int index)/remove(Object obj) 改:set(int index,Object ele) 查:get(int index) 插:add(int index,Object ele) 长度:size() 遍历:①Iterator迭代器方式②增强for循环③普通for循环 二、 Set接口框架 体系
Set:存储无序的,不可重复的数据 以HashSet为例说明 无序性:不等于随机性。存储的数据在底层数字中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的 不可重复性:保证添加的元素按照equals()判断时,不能返回ture。即:相同的元素只能添加一个 添加元素过程:以HashSet为例 我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素: 如果此位置上没有其他元素,则元素a添加成功–>情1 如果此位置上有其他元素b(或者链表的形式存在的多个元素),则比较元素a与元素b的hash值: 如果hash值不相同,则元素a添加成功—>情况2 如果hash值相同,则需要调用元素所在类的equals()方法 equals()返回true,元素a添加失败 equals()返回false,则元素a添加成功 LinkedHashSet的使用 LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据 优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet TreeSet的使用 向TreeSet中添加的数据,要求时相同的对象 两种排序方式:自然排序(实现Comparable接口)和制定排序(Comparator) 自然排序中,比较两个对象是否相同的标准为compareTo()返回0,不再是equals() 定制排序中,比较两个对象是否相同的标准为compaew()返回0,不再是equals() 三、Map接口
2.Map结构的理解 =Map中的kye:无序的,不可重复的,使用Set存储所有的key—>key所在的类要重写equals()和hashCode(以HashMap为例)= =Map中的value:无序的,可重复的,使用Collection存储所有的value—>value所在类要重写equals()= 一个键值对:key-value构成了一个Entery对象 Map中的entry:无序的,不可重复的,使用Set存储所有的entry 3.HashMap的底层实现原理 4.LinkedHashMap的底层原理(了解) 5.Map的常用方法 添加,删除,修改操作 Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中 void putAll(Map m):将m中的所有key-value对存放到当前map中 Object remove(Object key):移除指定key-value对,并且返回value void clear():清空当前map中的所有数据 查询操作 Object get(Object key):获取指定key对应的value boolean containsKey(Object key):是否包含指定的key boolean containsKey(Object value):是否包含指定的value int size():返回map中key-value对的个数 boolean isEmpty():判断当前map和参数对象obj是否相等、 元视图操作方法 Set keyset():返回所有key构成的Set集合 Collection values():返回所有value构成的Collection集合 Set entrySet():返回所有key-vlue对构成的Set集合 总结常用方法 添加:put(Object key,Object value) 删除:remove(Object key) 修改:put(Object key,Object value) 查询:get(Object key) 长度:size() 遍历:keyset()/values()/entrySet() 6.TreeMap中添加key-value,要求key必须是由同一个类创建的对象 因为要按照key进行排序:自然排序,定制排序 7.Properties:常用来处理配置文件:key和value都是String类型 四、Collections集合工具类 常用方法 reverse(List):反转List中元素的顺序 shuffle(List):对List集合元素进行随机排序 sort(List):根据元素的自然顺序对指定List集合元素按升序排序 sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序 swap(List,int,int):将指定List集合中i处元素和j处元素进行交换 Object max(Collection):根据元素的自然排序,返回给定集合中最大元素 Object max(Collection,Comparator):根据Comparator指定顺序,返回给定集合中最大元素 Object min(Collectton) Object min(Collecton,Comparator) int faequency(Collection,Object)返回指定集合中指定元素的出现次数 void copy(List dest,List src):将src中的内容复制到dest中 boolean replacecAll(List list,Object oldVal,Object newVal):使用新增值替换List对象的所有旧值 同步机制 Collection类中提供了多个synchronizedXxx()方法,该方法可使将指定集 合包装线程同步的集合,从而可以解决多线程并发访问集合时的线程安全
|