java基础知识整理13

SortedMap接口和TreeMap实现类:
Tree Map也是基于红黑树对TreeMap中所有Key进行排序,从而保证TreeMap中所有key-value对处于有序状态,TreeMap也有两种排序方式。
自然排序:treeMap的所有key必须实现Comparable接口,而且所有key应该是同一个类的对象,否则将会抛出ClassCastException异常。
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有的key进行排序。采用定制排序时不要求Map的key实现comparable接口。

Map.Entry<K,V>
firstEntry()
返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
K
firstKey()
返回此映射中当前第一个(最低)键。
Map.Entry<K,V>
floorEntry(K key)
返回一个键-值映射关系,它与小于等于给定键的最大键关联;如果不存在这样的键,则返回 null。
K
floorKey(K key)
返回小于等于给定键的最大键;如果不存在这样的键,则返回 null。
V
get(Object key)
返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。
SortedMap<K,V>
headMap(K toKey)
返回此映射的部分视图,其键值严格小于 toKey。
NavigableMap<K,V>
headMap(K toKey, boolean inclusive)
返回此映射的部分视图,其键小于(或等于,如果 inclusive 为 true)toKey。
Map.Entry<K,V>
higherEntry(K key)
返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null。
K
higherKey(K key)
返回严格大于给定键的最小键;如果不存在这样的键,则返回 null。
Set
keySet()
返回此映射包含的键的 Set 视图。

Map.Entry<K,V>
lastEntry()
返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
K
lastKey()
返回映射中当前最后一个(最高)键。
Map.Entry<K,V>
lowerEntry(K key)
返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null。
K
lowerKey(K key)
返回严格小于给定键的最大键;如果不存在这样的键,则返回 null。
NavigableSet
navigableKeySet()
返回此映射中所包含键的 NavigableSet 视图。

Map.Entry<K,V>
pollFirstEntry()
移除并返回与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
Map.Entry<K,V>
pollLastEntry()
移除并返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
V
put(K key, V value)
将指定值与此映射中的指定键进行关联。
void putAll(Map<? extends K,? extends V> map)
将指定映射中的所有映射关系复制到此映射中。
V
remove(Object key)
如果此 TreeMap 中存在该键的映射关系,则将其删除。
int size()
返回此映射中的键-值映射关系数。
NavigableMap<K,V>
subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
返回此映射的部分视图,其键的范围从 fromKey 到 toKey。
SortedMap<K,V>
subMap(K fromKey, K toKey)
返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。
SortedMap<K,V>
tailMap(K fromKey)
返回此映射的部分视图,其键大于等于 fromKey。
NavigableMap<K,V>
tailMap(K fromKey, boolean inclusive)
返回此映射的部分视图,其键大于(或等于,如果 inclusive 为 true)fromKey。
Collection
values()
返回此映射包含的值的 Collection 视图

WeakHashMap实现类
HashMap的key保留对实际对象的强引用,这意味着只要Hash不销毁,该对象的key所引用的对象不会被垃圾回收,但WeakHashMap的key只保留对实际对象的弱引用,这意味着如果该HashMap对像所有Key所引用的对象没有被其他强引用变量所引用,则这写Key所引用的对象可能被垃圾回收,Hash Map也可能自动删除这些key所对应的Key-value对象。
在这里插入图片描述
如果要使用weakHashMap的key来保留对象的弱引用,不要让该key所引用的对象具有任何强引用,否则将失去使用weakHashMap的意义。
IdentityHashMap实现类:当且仅当两个key严格相等(key1==key2)时,indentityHashMap才认为两个key相等。
IdentityHashmap不保证任何key-value对之间的顺序,更不能保证他们的顺序随时间的推移而保持不变。
EnumMap实现类:
EnumMap 中所有Key都必须是单个枚举类的枚举值,创建EnumMap时必须显式或隐式指定它对应的枚举类。
EnumMap在内部以数组的形式保存,所以这种实现形式非常紧凑,高效。
EnumMap不允许使用null作为key值,但允许使用Null作为value。如果试图使用null作为key将抛出空指针异常,查询或删除不会抛出异常。
创建EnumMap时必须指定一个枚举类,从而将该EnumMap和指定枚举类关联起来。
在这里插入图片描述
HashSet和HashMap的性能实现:
Hash表里可以存储元素的位置被称为桶,通常情况下,每个桶里存储一个元素,此时有最好的性能。Hash算法可以根据HashCode值来计算出“桶”的存储位置,接着从桶中取出元素,但Hash表的状态为Open:当发生“Hash冲突”的时候,单个桶会存储多个元素,这些元素以链表的形式存储,必须按顺序搜索。
HashSet和Hash Map的hash表包含如下属性:
1. 容量:hash表桶中的数量。
2. 初始化容量:创建Hahs表时桶中的数量,HashMap,HashSet都允许在构造其中指定初始化的容量。
3. 尺寸:当前散列表中记录的数量。
4. 负载因子:负载银子等于“Size/Capacity”负载因子为0,表示空的hash表,0.5表示半满的散列表,轻负载的散列表具有冲突少,适宜插入与查询,但是使用迭代元素时会慢。
“负载极限”是一个0~1的数值,“负载极限”决定了Hash表中最大填满程度。当hash表中的负载因子到达指定的负载极限时,hash会成倍的增加容量(桶的数量),并将原有对象重新分配,放入新的桶内,称为rehashing。
HashSet,HashMap,Hash table的构造器允许制定一个负载极限,HashSet与HashMap,hashtable默认的负载极限为0.75.
操作集合的工具类:
1. 排序操作
Collection提供了如下几个方法用于对List集合元素进行排序:
Static voidreverse(List list):反转指定List集合中元素的顺序。
Static void shuffle(List list):对List集合元素进行随机排序。
Static void sort(List list):根据元素的自然顺序对指定List集合元素按升序进行排序。
Static void Sort(List list,Comparator c):根据comparator产生的顺序对List集合的元素进行升序排序。
Static void swap(List list,ing i,int j):将指定List集合中i处的元素和j处的元素进行交换。
Static void rotate(List list,int distance):当distance为正数时,将list集合的后distance个元素移到前面;当distance为负数时。将list集合的前distance个元素移到后面,该方法不会改变集合的长度。
在这里插入图片描述
查找替换操作:collection提供了如下用于查找的替换集合元素的方法。
Static int binarySearch(List list,Object key):使用二分搜索指定List集合,以获取指定对象在List集合中的索引。如果要该方法可以正常的工作,必须保证List中的元素已经处于有序状态。
static
<T extends Object & Comparable<? super T>>
T
max(Collection<? extends T> coll)
根据元素的自然顺序,返回给定 collection 的最大元素。
static
T
max(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器产生的顺序,返回给定 collection 的最大元素。
static
<T extends Object & Comparable<? super T>>
T
min(Collection<? extends T> coll)
根据元素的自然顺序 返回给定 collection 的最小元素。
static
T
min(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器产生的顺序,返回给定 collection 的最小元素。
static
void
fill(List<? super T> list, T obj)
使用指定元素替换指定列表中的所有元素。
static int frequency(Collection<?> c, Object o)
返回指定 collection 中等于指定对象的元素数。
static int indexOfSubList(List<?> source, List<?> target)
返回指定源列表中第一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。
static int lastIndexOfSubList(List<?> source, List<?> target)
返回指定源列表中最后一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。
static
boolean
replaceAll(List list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。
2. 同步控制

在这里插入图片描述
实现线程安全。
设置不可变的集合:
Colelctions提供了三个方法来返回一个不可变的集合:
EmptyXXX():返回一个空的,不可变的对象,此处集合既可以是List,也可以是Set还可以是Map。
singleeonXXX():返回一个包含指定对象(只有一个或一项元素)的,不可变集合对象此处集合既可以是List,也可以是Set还可以是Map。
unmodidiableXXX:返回指定集合对象的不可变视图,此处集合既可以是List,也可以是Set还可以是Map。
繁琐的接口:Enumeration(接口可用于迭代)
一般不用。
泛型
泛型了解:Java集合没有很好的通用性,所以带来了两个问题。
1. 集合对元素类型没有任何限制,这将可能引发一些问题。
2. 由于把对象“丢进”集合时,集合丢失了对象的状态信息,集合只知道它装的是Object类型,因此取出集合元素时还需要进行强制类型转换。这种强制类型转换既会增加变成的复杂度,也可能引发ClassCastException.
使用泛型:
所谓泛型:就是允许在定义类,接口时指定类型形参,这个类型形参将在声明变量,创建对象时确定(即传入实际的类型参数,也可称为类型实参)。
改写后的List接口,Iterator接口,Map接口
在这里插入图片描述
泛型的实质:允许在定义接口,类时指定类型形参在整个接口,类体内中可以当成类型使用,几乎所有可使用其他普通类型的地方都可以使用这种形参。包含泛型声明的类型可以在定义变量,创建对象时传入一个类型的实参,从而可以动态生成无数多个逻辑上的子类,但这种子类在物理上并不存在。
在这里插入图片描述
当创建带泛型声明的自定义类,为该类定义构造器时,构造器还是原来的类名,不要增加泛型的声明。
从泛型类派生子类:
当创建带泛型声明的接口,父类之后,可以为该接口创建实现类,或从该父类派生子类,当使用这些接口,父类时不能再包含类型形参。
在这里插入图片描述
不管泛型类型的实际类型参数是什么,他们在运行时总有同样的类(class)
泛型对其所有可能的类型参数,都具有同样的行为,从而可以把相同的类当成许多不同的类处理。与此完全一致的是,类的静态变量和方法也在所有实例间共享,所以在静态方法,静态初始化或者静态变量的声明和初始化中不允许使用类型形参instanceof运算符后不能使用泛型类。
类型通配符:
如果Foo是Bar的子类型(子类或者子接口),而G是具有泛型声明的类或接口,那么G是G的子类型并不成立。
如果使用泛型,只要在编译时没有出现警告,就不会遇到运行时ClassCastException。
数组和泛型有所不同,假设Foo是Bar的一个子类型(子类或者子接口),那么Foo[]依然是Bar[]的子类型;但G不是G的子类型。
使用类型通配符:类型通配符一般是一个问号(?)将一个问号作为类型实参传给List集合,写作:List<?>(意思是一个未知元素的List),这个问号被称为通配符,他的元素类型可以匹配任何类型。但这种通配符的List仅表示它是各种泛型List的父类,并不能把元素加入到其中。
Null它是所有引用类型的实例。
设定指定类型通配符的上限:
当直接使用List<?>这种形式时,即表明这个List集合可以是任何泛型List的父类。但还有一种特殊的情形,我们不想这个List<?>是任何泛型List的父类,只想表示它是某一类泛型List的父类。
Java泛型提供了被限制的泛型通配符
List<?extends Shape>//表示所有的Shape泛型List的父类。
List<?extends Shape>是受限制通配符的一个例子,此处的问号代表一个未知类型Shape为这个通配符的上限。
设定类型形参的上限:
在这里插入图片描述
程序需要为类型形参设定多个上限(至多有一个父类上,可以有多个接口上限),表明该类型形参必须是其父类的子类(包括是父类的本身也行),并且有多个上限接口。
如果要为类型形参指定类上限,类上限必须位于第一位。
泛型方法:
就是在声明方法时定义一个或多个类型的形参,泛型方法的格式是:
修饰符<T,S>返回值类型 方法名(形参列表)
{
方法体;
}
泛型方法的方法签名比普通方法的方法签名多了类型形参声明,类型形参声明以尖括号括起来,多个类型形参之间用(,)隔开,所有类型形参的声明放在修饰符和方法返回值类型之间。
在这里插入图片描述
方法中的泛型参数无需显式传入实际类型参数
泛型方法和通配符的区别:
大多数时候都可以使用泛型方法来替代类型通配符,通配符就是被设计用来支持灵活子类化。泛型方法允许类型形参被用来表示一个或多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系。如果没有,不应该使用泛型方法。
如果某个方法中的形参(a)的类型或返回值类型都依赖于另一个形参(b)的类型,则形参(b)的类型声明不应该使用通配符——因为形参(a),或返回值的类型依赖于该形参(b)的类型,如果形参(b)的类型无法确定,程序无法定义形参(a)的类型。在这种情况下,只能考虑使用方法签名中声明类型形参。
类型通配符与显式声明类型形参有一个明显的区别:类型通配符既可以在方法签名中定义形参的类型,也可以定义变量的类型,但泛型中类型形参必须在对应方法中显式声明。
设定通配符的下限。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值