java基础知识整理11

本文介绍了Java中EnumSet、List、Queue、Map等集合类和相关接口。EnumSet专为枚举类设计,存储高效;List接口有多种实现类,各有特点;Queue模拟队列结构;Map保存映射关系。还提及了各集合类的方法、性能差异及使用建议,如设置JVM内存选项等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EnumSet类:
EnumSet是一个专为枚举类设计的类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式的指定,EmunSet的集合元素也是有序的,EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。
EnumSet在内部以位向量的形式存储,这种存储结构形式非常紧凑,高效,因此EnumSet对象占用内存很小,运行速率高,EnumSet集合不允许加入null元素,如果加入,将抛出空指针异常,EnumSet类没有暴露任何构造器来创建该类的实例,程序应通过static方法创建EnumSet对象,例如:
Static EnumSet allOf(Class elementType):创建一个包含指定枚举类里所有的枚举值的EnumSet集合。
Static EnumSet complement(EnumSet s):创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet,新EnumSet集合包含原EnumSet集合不包含的,此枚举类剩下的枚举值(即新EnumSet集合和原EnumSet集合的集合元素加起来就是该枚举类所有的枚举值)
Static EnumSet copyOf(Collection c):使用一个普通集合来创建EnumSet集合。
Static EnumSet copyOf(EnumSet s):创建一个与指定EnumSet具有相同元素类型,相同几何与那素的EnumSet.
Static EnumSet noneof(class elementType):创建一个元素类型为指定枚举类型的空》EnumSet
Static EnumSet of(E first, E….rest):创建一个包含一个或多个枚举值的EnumSet,传入的多个枚举值必须属于同一个枚举类。
Static EnumSetrange(E from,E to):创建包含从from枚举值,到to 枚举值范围内所有枚举值的EnumSet集合。
当试图复制一个Collection集合里的元素来创建EnumSet集合时,必须保证Collection集合里所有元素都是同一个枚举类型。
EnumSet是所有Set实现类中性能最好的,但他只能保存同一个枚举类的枚举值作为集合元素。Set的三个实现类HashSet,TreeSet和EnumSet都是线程不安全的
List接口:
List接口和ListIterator接口:
方法:void add(int index,Object element):将元素element插入在List集合的index处。
Boolean addAll(int index,Collection c):将集合C中所包含的所有元素都插入在list集合的index处。
Object get(int index):返回集合index索引处的集合。
Int indexOf(Object o):返回对象o在List集合中出现的索引位置。
Int lastIndexOf(Object o):返回对象o在List集合中最后一次出现位置索引。
Object remove(int index):删除并返回index索引处的元素。
Object set(int index,Object element):将index索引处的元素替换成element对象,返回新元素
List subList(int fromindex,int toIndex):返回从索引fromIndex(包含)到索引toIndex(不包含)处所有元素组成的子集合。
当调用List的set(int index,Object element)方法来改变List集合指定索引处的元素时,指定的索引必须是List集合的有效索引。
List Iterator接口增加了如下方法:
Boolean hasPrevious():返回迭代器关联的集合是否还有上一个元素。
Object previous():返回迭代器上一个元素。
Void add():在指定位置插入一个元素。
ArrayList和Vector 实现类:
ArrayList和Vector类都是基于数组实现的List类,所以Array List和Vector类封装了一个动态再分配的Object[]数组。每个ArrayList或Vector对象都有一个capacity属性,这个capacity表示他们所封装的Object[]数组的长度,当添加元素时,他们的capacity会自动增加。可以使用ensureCapacity方法一次性的增加capacity,以提高性能。
该属性默认为10.
Array List和Vector还提供了如下两个方法来操作capacity属性:
Void ensureCapacity(int mincapacity):将ArrayList或Vector集合的capacity增加mincapacity。
Void trimToSize():调整ArrayList或Vector集合的capacity为列表大小。程序可以调用该方法减少对象的存储空间。
Vector有很多缺点,通常尽量少用。
两者区别是Array List()是线程不安全的。
Vector提供了一个Stack子类,用于模拟栈这种数据结构,从栈中取出元素后必须做类型转换。
Object peek():返回“栈的第一个元素”,但并不将该元素pop出栈
Object pop():返回栈的第一个元素,并将该元素pop出栈
Void push(Object item):将一个元素进栈,最后一个进栈的元素总是位于栈顶。
固定长度的List
Arrays.ArrayList是一个固定长度的List集合 ,程序只能遍历访问该集合里的元素,不可增加,删除该集合的元素。

在这里插入图片描述
Queue接口:
Queue用于模拟队列这种数据结构,队列通常是指“先进先出”的容器,通常,队列不允许随机访问队列中的元素。
Queue接口定义的方法:
Void add(Object e):将指定元素加入此队列的尾部。
Object element():获取队列头部的元素,但不是删除该元素。
Boolean offer(Object e):将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法比add方法好用。
Object peek():获取队列头部的元素,但不是删除该元素。如果此队列为空,则返回null。
Object poll():获取队列头部的元素,并删除该元素,如果此队列为空,则返回null.
Object remove():获取队列头部的元素,并删除该元素。
Queue有两个实现类:LinkedList和PriorityQueue
LinkedList可以根据索引来随机访问集合元素,还实现了Deque接口,而Deque接口是Queue的子接口,他代表双向队列。提供方法:
void addFirst(E e)
将指定元素插入此双端队列的开头(如果可以直接这样做而不违反容量限制)。
void addLast(E e)
将指定元素插入此双端队列的末尾(如果可以直接这样做而不违反容量限制)。
E
getFirst()
获取,但不移除此双端队列的第一个元素。
E
getLast()
获取,但不移除此双端队列的最后一个元素。
boolean offer(E e)
将指定元素插入此双端队列所表示的队列(换句话说,此双端队列的尾部),如果可以直接这样做而不违反容量限制的话;如果成功,则返回 true,如果当前没有可用的空间,则返回 false。
boolean offerFirst(E e)
在不违反容量限制的情况下,将指定的元素插入此双端队列的开头。
boolean offerLast(E e)
在不违反容量限制的情况下,将指定的元素插入此双端队列的末尾。
E
peek()
获取,但不移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素);如果此双端队列为空,则返回 null。
E
peekFirst()
获取,但不移除此双端队列的第一个元素;如果此双端队列为空,则返回 null。
E
peekLast()
获取,但不移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null。
E
poll()
获取并移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素);如果此双端队列为空,则返回 null。
E
pollFirst()
获取并移除此双端队列的第一个元素;如果此双端队列为空,则返回 null。
E
pollLast()
获取并移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null。
E
pop()
从此双端队列所表示的堆栈中弹出一个元素。
void push(E e)
将一个元素推入此双端队列所表示的堆栈(换句话说,此双端队列的头部),如果可以直接这样做而不违反容量限制的话;如果成功,则返回 true,如果当前没有可用空间,则抛出 IllegalStateException。
E
remove()
获取并移除此双端队列所表示的队列的头部(换句话说,此双端队列的第一个元素)。
boolean remove(Object o)
从此双端队列中移除第一次出现的指定元素。
E
removeFirst()
获取并移除此双端队列第一个元素。
boolean removeFirstOccurrence(Object o)
从此双端队列移除第一次出现的指定元素。
E
removeLast()
获取并移除此双端队列的最后一个元素。
boolean removeLastOccurrence(Object o)
从此双端队列移除最后一次出现的指定元素。
在这里插入图片描述
可以通过命令来运行很大内存空间的程序
Java命令时设置了Xms和Xmx两个选项,意义如下:
-Xms是设置JVM初始内存的大小
-Xmx是设置JVM最大能够使用内存的大小。(最好不要超过物理内存)
使用List集合建议:

  1. 如果需要遍历List集合元素,对于Array List,Vector集合,则应该使用随机访问的方法(get)来遍历集合元素,这样的性能更好,对于Linked List集合,则应该采用迭代器(Iterator)来遍历集合元素。
  2. 如果需要经常执行插入,删除操作来改变List集合的大小,则应该使用LinkedList集合,而不是Array List。使用ArrayList,Vector集合将需要经常重新分配内部数组的大小,其时间开销常常是使用LinkedList时间的好几十倍,效果差。
  3. 如果有多条线程需要同时访问List集合中的元素,可以使用Vector来实现。
    PriorityQueue实现类:
    PriorityQueue保存队列的元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。
    PriorityQueue不允许插入null元素,他还需要对队列元素进行排序,排序有两种方式:
    1. 自然排序
    2. 定制排序
    Map:
    Map用于保存具有映射关系的数据,因此Map里面保存着两组值,一组用于保存Map里的key,另外一组值用于保存Map里的value,Key和value都可以是任意引用数据类型。Map的Key不允许重复,即同一个Map对象的任何两个Key通过equals方法总是比较返回false。
    Key和value存在单向一对一的关系,Map里包含了一个keySet()方法,用于返回Map所有key组成的Set集合。
    void clear()
    从此映射中移除所有映射关系(可选操作)。
    boolean containsKey(Object key)
    如果此映射包含指定键的映射关系,则返回 true。
    boolean containsValue(Object value)
    如果此映射将一个或多个键映射到指定值,则返回 true。
    Set<Map.Entry<K,V>> entrySet()
    返回此映射中包含的映射关系的 Set 视图。

boolean equals(Object o)
比较指定的对象与此映射是否相等。
V
get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode()
返回此映射的哈希码值。
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
Set
keySet()
返回此映射中包含的键的 Set 视图。

V
put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
V
remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size()
返回此映射中的键-值映射关系数。
Collection
values()
返回此映射中包含的值的 Collection 视图。

HashMap和Hash Map实现类:
区别:
1. Hash table是一个线程安全的Map的实现,但Hash Map是线程不安全的实现,所以Hash Map比Hash table的性能更高一点,但如果有多条线程访问同一个Map对象时,使用Hash table实现类会更好。
2. Hashtable不允许使用null作为key和value,如果试图把null值放进Hash table中,将会引发空指针异常;但Hash Map可以使用。
由于HashMap里的key不能重复,所以HashMap里最多只有一项key-value对的key为null,但可以有多项key-value对的value为null.
在这里插入图片描述
尽量少使用Hashtable
HashMap,Hashtable 不能保证其中key-value对的顺序。两个key通过equals比较返回true,两个key的hashcode也相等。并且包含一个containsValue方法用于判断是否包含制定value,判断两个value是否相等,只要两个对象equals比较返回true即可。
在这里插入图片描述
尽量不要使用可变对象作为HashMap,Hashtable的key,如果确实需要使用可变对象作为HashMap,Hashtable的key,则尽量不要在程序中修改作为key的可变对象。
LinkedHashMap可以避免需要对hashMap,HashTable里的Key-value对进行排序(只要插入key-value对保持顺序即可)。同时又可避免使用TreeMap所增加的成本。需要维护元素的插入顺序,因此性能低于HashMap的性能,但在迭代访问Map里的全部元素时将有很好的性能,因此它以链表的来维护内部顺序。
Properties类是Hash table的子类,他可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件里的属性名,属性值只能是字符串类型,所以properties里的key,value都是字符串类型,该类提供三种方法来修改properties里的key,value值。
String
getProperty(String key)
用指定的键在此属性列表中搜索属性。
String
getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性。
Object
setProperty(String key, String value)
调用 Hashtable 的方法 put。
除此之外还有两个读写属性的文件的方法。
void load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。
void load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
void store(OutputStream out, String comments)
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void store(Writer writer, String comments)
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
在这里插入图片描述
Propertises还可以把key-value以XML文件的形式保存,也可以从XML文件中加载姓名-属性值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值