1.Map及其子类特点
Map: 双列数据 key value对数据 类似于函数 HashMap :Map主要实现类:线程不安全,效率高,可以存储null的键值对 LinkedHashMap:保证遍历时,按照存储的顺序。 原因:LinkedHashMap在底层中添加了一对指针,分别指向前后 元素对于频繁的遍历操作,效率高于HashMap TreeMap:保证按照添加的key—value 排序的顺序存储,并实现排序遍历。 底层是红黑树 Hashtable:古老实现类1.0 线程安全,效率低,不能存储null的键值对 Properties:常用来处理配置文件,key和value都是String类型; HashMap: 底层 数组+链表 jdk7以前 数组+链表+红黑树 jdk8
Map结构理解: key:是无序的,不可重复的,用set存放key。
key所在的类要重写equals()和hashCode();方法;以HashMap 为例
Map中的value是无序的、可重复的,使用colletion存储。value所在的类重写equals();
一个键值对Entry 一个key —value 构成一个键值对
entry 是无序不重复的,用set存放
默认扩容原来的2倍;
高频面试题: HashMap 底层实现原理? jdk7为例:
HashMap map = new HashMap();
实例化以后,底层创建了长度16的一维数组Entry[]
map.put(key1,value1)
首先调用hashCode();计算哈希值,经过某种算法以后得到在Entry存放的位置,
如果此位置上为空则添加成功;
如果不为空,则比较key1和该位置上一个或多个数据的哈希值。
如果key1的和其它哈希值不相同,添加成功
如果key1的和某个数据哈希值相同,则调用key所在类的equals();方法比较。 如果为false,添加成功
如果为true,便是key值相同,vlue1,替换掉对应数据的value(添加操作变成替换)
jdk8和jdk7区别:
1.new HashMap(); jdk8没有立即创建长度16的数组
2.jdk8 底层数组是Node[],不是entry[]
3.jdk8 首次put添加时,创建长度16的数组
4.jdk7 底层 数组+链表 jdk8 底层: 数组+链表+红黑树 当某一个索引位置上链条位置上元素个数 > 8,且当前数组长度>64时, 此时,该索引位置上所有数据改为使用红黑树存储。
//常用方法
Map map = new HashMap();
//put(),添加
map.put("aa", "123");
map.put("bb", "143");
System.out.println(map);//{aa=123, bb=143}
//put(),添加已存在key值的元素,为修改
map.put("aa", "666");
System.out.println(map);//{aa=666, bb=143}
//putAll(Map map) 添加
Map map1 = new HashMap();
map1.put("cc","523");
map1.put("gg","562");
map1.put("hh","952");
map1.put("jj","842");
map.putAll(map1);
System.out.println(map);//{aa=666, bb=143, cc=523, gg=562, hh=952, jj=842}
//remove();删除对应key值的元素
map.remove("aa");
System.out.println(map);
//get(Object key) 查询对应key值的元素
Object obj = map.get("bb");
System.out.println(obj);//143
//containsKey() containsValue();判断是否存在对应的key 或者value值
if(map.containsKey("cc")){
System.out.println("查询到对应的key值cc");
}
// int size(); 返回map中键值对个数
int count = map.size();
//isEmpty(); 判断map其中元素是否为空
boolean b = map.isEmpty();
//equals(Object obj); 判断两个Map是否相等, 那么这两个Map中元素相同
Map map2 = new HashMap();
map2.put("cc","523");
map2.put("gg","562");
map2.put("hh","952");
Map map3 = new HashMap();
map3.put("cc","523");
map3.put("gg","562");
map3.put("hh","952");
if (map2.equals(map3)) {
System.out.println("两个Map相等");
}
遍历
Map map = new HashMap();
map.put("cc","523");
map.put("gg","562");
map.put("hh","952");
map.put("jj","842");
map.put("aa", "123");
map.put("bb", "143");
//keySet(); 返回key值中的set集合
Set set = map.keySet();
System.out.println(set);//[cc, gg, hh, jj, aa, bb]
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
Collection coll = map.values();
System.out.println(coll);//[523, 562, 952, 842, 123, 143]
for (Object obj :
coll) {
System.out.println(obj);
}
Set entrySet = map.entrySet();
System.out.println(entrySet);//[cc=523, gg=562, hh=952, jj=842, aa=123, bb=143]
Iterator iterator1 = entrySet.iterator();
while (iterator1.hasNext()) {
Object object = iterator1.next();
Map.Entry entry = (Map.Entry) object;
System.out.println("key :"+entry.getKey()+"--vlaue :"+entry.getValue());
}
@Test
public void testTreeMap(){
//向 TreeMap中添加键值对,必须时同一个类的元素
//自然排序, 自定义排序
TreeMap map = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Person && o2 instanceof Person) {
Person person1 = (Person) o1;
Person person2 = (Person) o2;
if (person1.getName().compareTo(person2.getName()) != 0) {
return person1.getName().compareTo(person2.getName());
} else {
return Integer.compare(person1.getAge(), person2.getAge());
}
} else {
throw new RuntimeException("输入数据有误");
}
}
});
Person p1 = new Person("Javk", 5);
Person p2 = new Person("Jim", 6);
Person p3 = new Person("Tom", 12);
Person p4 = new Person("Rose", 21);
Person p5 = new Person("Ceasar", 24);
map.put(p1,23);
map.put(p2,34);
map.put(p3,85);
map.put(p4,23);
map.put(p5,98);
System.out.println(map);
}
Properties处理配置文件
@Test//处理配置文件
public void testProperties() throws IOException {
//Properties 处理配置文件, key -value 都是String类型
Properties properties = new Properties();
FileInputStream fis = new FileInputStream("jdbctest.properties");
properties.load(fis);
String name = properties.getProperty("name");
String password = properties.getProperty("password");
System.out.println("name:"+name+"--password:"+password);
}