Map相关

1.Map存储数据的特点是什么?并指明key,value,entry存储数据的特点。

双列数据,存储键值对 key-value。
key:无序的、不可重复的 ---->Set存储
value:无序的、可重复的 ---->Collection存储
一对key-value构成一个entry 无序的不可重复的 ---->Set存储

2.描述HashMap的底层实现原理(jdk8版本)

底层使用的时数组+链表+红黑树
创建对象时,不创建数组,第一次使用put方法时底层创建长度为16的数组
阈值和负载因子来计算是否扩容 默认扩容为原来数组的2倍 负载因子=0.75f
阈值 = 16*0.75=12
通过put存放数据时,通过调用key的hashCode方法,计算出哈希值,然后通过某种算法计算出存放在Entry数组的位置,此时需要判断该位置是否已经存储数据,如果不存在就存放成功,如果存在就拿key哈希值进行比较,比较如果哈希值不同,那么就以链表的形式存放在该位置上,如果key的哈希值相同,那就调用key的equals方法判断key的内容是否相同,如果不相同,继续以链表的形式存放在该位置上,如果相同,那么将value替换。
当链表存放的内容比较多时 转为红黑树
当数组某一个索引位置上的元素以链表形式存在的数据个数 > 8且当前数组的长度>64时数据改为使用红黑树。
形成链表时,七上八下,Jdk7新元素指向旧元素,Jdk8旧元素指向新元素。

3.Map中常用的实现类有哪些?各自有什么特点?

Map接口的常用实现类如下:
HashMap:线程不安全的,可以存放null值,效率高。Map的主要实现类
LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历 ,HashMap的子类,在HashMap的基础上又使用链表让他变为有序。
TreeMap:保证按照添加元素key-value对进行排序,排序规则用key的自然排序或者定制排序。底层使用红黑树。
Hashtable:作为古老实现类,线程安全的,但是效率低。不能存储null值
Properties:常用来处理配置文件,key和value都是String类型。

4.如何遍历Map中的key-value对,代码实现:

Map map = new HashMap();
map.put(key,value);
map.put(key,value);
map.put(key,value);
//方法1
Set entrySet = map.entrySet();
for(Object obj : entrySet){
System.out.println(obj);
}
//方法2
Set keySet = map.keySet();
for(Object obj : keySet){
System.out.println(obj + map.get(obj) );
}

5.Collection和Collections的区别?

Collection是用来存储单列的数据的,是一个接口,有List Set两个子接口,
Collections是操作集合工具类,可以操作List Set Map

6.Map接口中的常用方法

增加:put(key,value);putAll(Map m);
删除:remove(key);clear();
修改:put(key,value);
查询:get(key);
长度:size();
遍历:keySet();values();entrySet();
比较:containsKey();containsValue();equals();
是否为空:isEmpty();
7.HashMap底层典型属性的说明:
DEFAULT_INITIAL_CAPACITY : HashMap的默认容量 16
DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75f
threshold : 扩容的临界值=容量加载因子 = 160.75f=12
TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8
MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64

7.如何遍历Map的key集,value集,key-value集,使用上泛型

Map<String,Integer> map = new HashMap<>();

map.put();......
//遍历key
Set<String> keySet = map.keySet();
for(String key : keySet){
	System.out.println(key);
}

//遍历value
Collection<Integer> values = map.values();
Iterator iterator = values.iterator();
while(iterator.hasNext()){
	System.out.println(iterator.next());
}

//遍历key-value
Set<Map.Entry<String,Integer>> entry = map.entrySet();

entry.forEach(System.out::println);

for(Entry entrySet : entry){
	System.out.println(entrtSet);
}

Iterator<Map.Entry<String,Integer>> iterator = entry.iterator();

while(iterator.hasNext()){
	Map.Entry<String,Integer> entry = iterator.next();
	String key = entry.getKey();
	Integer values = entry.getValue();
	System.out.println(key + "---->" + value);
}
 

8.提供一个方法,用于遍历获取HashMap<String,String>中的所有value,并存放在List中返回。考虑上集合中泛型的使用。

public List<String> getValuesList(HashMap<String,String> map){

	//新创建一个List 
	List<String> list = new ArrayList<>();
	//使用Map中的方法获取values的值 存放到Collection集合中.
	Collection<String> values = map.values();
	//使用增强for循环将Collection集合遍历,然后添加到创建好的List中去.
	for(String value : values){
		list.add(value);
	}
	return list;
}

9.创建一个与a.txt文件目录下的另一个文件b.txt

File file  =  new File("D:\\Thunder\\Brook");
file.mkdirs();
file = new File("D:\\Thunder\\Brook","a.txt");
File file2 = new File(file.getParent,"b.txt");
file2.createNewFile();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值