------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
集合:
为什么出现集合类:
用于存储对象的一种方式,长度可变可用于存不同种对象。
数组和集合的区别:
数组存储同种元素和长度固定。集合变长可存不用种元素。
为什么出现这么多容器?
每个容器对数据的存储方式不同,存储方式称之为数据结构。
collection:
是集合的根接口。
集合类的关系图:
常用方法:
1、添加:
add("object");//集合中存放的都是地址
2、获取个数集合长度
size();
3、删除元素
remove(object);
clear();
4、判断元素
contains(object);判断是否存在
isEmpty();//判断是否为空
5、交集
retainAll(object);///取交集只会保留交集
removeAll(object);//做减法,留不同
6、迭代器
Iterator
什么是迭代器?
就是集合的去除元素方式。
取出方式定义子啊集合的内部,这样取出方式就可以直接访问集合内容的元素取出方式就是定义成了内部类。
每个容器的数据结构不同,取出动作的细节也不一样,但有共性内容判断和取出,可以将共性抽取。
那么这些内部类都符合一个规则,该规则就是Iterator。
如何获取集合的取出对象呢?
通过一个对外提供的方法iterator()
list:
元素有序,可重复,因该集合体系有索引。凡是可以操作脚标方法均是特有方法。
常见方法:
1、增:
add(index,element);
addAll(index,collection);
2、删:
remove(index);
3、改
set(index,element);
4、查:
get(index);
subList(from,to);
listIterator();
5、列表迭代器listIterator()(list集合特有,是Iterator子接口)
迭代时,不可用集合对象的方法操作集合中的元素,因为会发生并发修改异常concurrentModificationException。所以迭代时要用迭代器操作。
6、list的常见子类对象:ArrayList、LinkedList、Vector
vector
底层数据结构是数组(线程同步),查询与增删速度均很慢已经被取代了。
枚举是Vector特有的取出方式。和迭代器一样。
枚举和迭代器的区别:枚举名称及方法名过长
例子:
ArrayList:
底层数据结构是数组(线程不同步),查询块,增删慢
例子:
LinkedList:
底层数据结构是链表,查询慢,增删块
特有方法:
1.增
addFirst();
addLast();
被offer取代
2.获取
getFirst();
getLast();
被peek取代
3.删除
removeFirst();
removeLast();
被Poll取代
list结合判断元素是否相同、contains()和remove()都是用的equals()。
例子:
例二:
set:
set集合功能与collection是一致的。元素是无序,元素不可以重复。
常见的子类有:HashSet:底层数据结构是哈希表。线程非同步,存取速度快。
TreeSet:
对Set集合中元素排序。底层数据结构是二叉树。保证唯一性的依据是compareto方法,返回值为0;默认按照字母的自然顺序排序。
Hash是如何保证元素的唯一性的?
通过元素的两个方法:hashcode和equals完成的,如果元素的HashCode值i相同,才会判断equals是否true,如果元素HashCode不用用比较equals()
注意:
对于判断元素是否存在以及删除操作,依赖的方法是元素的HashCode和equals
HashSet例子:
TreeSet排序方式
第一种、让元素自身具备比较性,元素需要实现comparable接口,覆盖comparato方法,这种方式也称为元素自然排序,或默认排序。
第二种、当元素自身不具备比较性,或比较性不是所需要的,这时需要让集合自身具备比较I性。在集合一初始化时就有了比较方式。
实现方法:定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主,定义类实现conparator接口,覆盖compare方法
例子:(元素具备计较性)
例子:(用比较器)
map集合:
Msp<K,V>集合是一个借口,它是双列集合。该集合存储键值对,一对一对存,要保证健的唯一性。
map集合的子类:
Hashtable:底层哈希表数据结构,不可存入null为健或值,线程是同步的。
HashMap:底层哈希表数据结构,可以有null为健或值,线程不同步,效率高。
TreeMap:底层二叉树刷数据结构,线程不同步,可用于给Map集合中就键进行排序。
和Set很像,Set底层使用map集合。
map集合常用方法;
1.添加
put(key,value);
putAll(map);
2.删除
clear();
remove();
3.判断
cntainsKey(Object);
containsValue(Object);
isEmpty();
4.获取
get(Object);
size();
value();
可通过get方法的返回值来判断一个键是否存在,同伙返回null判断
添加出现相同键,后加的会覆盖原有的值,put返回键对应原来的值(被覆盖的值)。
Map集合的取出原理:
将Map集合转成Set集合,在通过迭代器取出。
取出方式有两种:
entrySet()
keySet()
第一种:
keySet():将Map中所有的键存入到Set集合,因Set具备迭代器,所以可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值。
例子:
第二种:
Set<Map<K,V>> entrySet():Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry
其实,Entry也是一个接口,它是Map接口中的一个内部接口。相当于内部类,为什么要定义在其内部呢?
原因:1.Map集合中存的是映射关系这样的两个数据,是先有Map这个集合,才有映射关系的存在,而且此类关系是集合的内部事务。2.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。
Map集合的应用及扩展
Map集合被使用是因为具备映射关系。
什么时候使用Map集合?
当数据间存在映射关系时就要用。
Map集合的应用级扩展
Map集合被使用是映射关系的原因
一对多的情况例子:
collections:
是集合框架的一个工具类,方法都是静态的,专门用于集合操作,不需要创建对象,无特有数据。大部分是对List集合操作的。
常见操作:
1.查找:
max(collection coll(;根据自然顺序,获取最大元素
binarySearch(List<? extends Comparable<? super T>> list,Tkey);二分法查找list集合中指定对象
2.替换:
fill(Lis list, T obj);//将list集合中的全部元素换成obj
replaceAll(List lsit,T oldVal,T newVal);//用新值l替换集合中的旧l值
3.排序:
Sort(list);根据自然顺序对list集合中元素排序
shuffle(list):使用默认随机源对list元素排序
4.反转:
reverse(list);反转集合中元素顺序
reverseOrder():返回比较器,强转了实现Comparable接口的对象的自然顺序
5.同步:
List<T>synchronizedList(List<T> list);//返回支持的同步(线程安全的)List集合
Map<K,V>synchronizedList(Map<K,V> m);//返回支持的同步(线程安全的)Map集合
collection和collections的区别:collection是集合框架中的一个顶层接口,定义了单列集合的共性方法。
collections是集合框架中的一个工具类,该类中的方法都是静态的,提供的方法中有可以对list集合进行排序,二分查找等方法。
通常常用的集合都是线程不安去的,因为要提高效率,如果多线程操作这些集合时,可以通过工具类中的同步方法,将线程不安去的集合,转成安全的。
Arrays
用于操作数组的工具类,里面带都是静态方法。
aslist:将数组变成list集合
把数组变成list集合的好处;
可以使用集合思想及方法操作数组中的元素。
注意:
数组变成集合,不可以使用集合的增删方法,因为数组长度是固定的,会发生UnsupportedOperationException
如果数组中的元素都是对象,变成集合时,数组元素直接转成集合中元素,
如果数组中元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
例子:
集合变数组:
collection中的toArray方法
1、指定类型的数组要定义多长?
当指定类型数组的长度<集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当>时,就不会 新创建数组,而是用传进来的数组,所以创建正好的数组最优。
2.为什么将集合变数组?
为限定对元素的操作,不需要增删
System
描述系统的一些信息的类,类中的方法和属性都是静态的。
常用方法:
getProperties():获取属性信息,返回Propeties类(双类集合)。
out:标准输出,默认控制台
in:标准输入,默认键盘
因为Properties是Hashtable的子类,也就是Map中的一个子类对象。可通过Map方法取出集合中的元素。‘
该集合中都是String没泛型定义
例子:
Runtime
使程序与运行环境相联接
该类中并没提供构造函数,不可以new对象,会直接想到该类中方法都是静态的,发现类中还有非静态犯法,说明该类肯定会提供方法获取本类对象,而且方法是静态的,并且返回值为本类类型。
由上述特点可以看出是由单例设计模式完成时。
例子:
Date
表示特定的瞬间,精确到毫秒。
calendar
是一个抽象类,它为特定瞬间与一组如YEAR、MONTH等日历字段间提供了一些方法转换。
calendar可以对时间日期等进行获取,参阅API
例子:
Math
用于执行基本数学运算的方法,类中全是静态方法。
常用方法:
ceil():返回大于指定数据的最小整数
floor():返回小于指定数据的最大整数
round():四舍五入
pow(a,b):a的b次幂
random():返回[0,1)随机数
例子: