java面试题:
java 中 IO 流分为几种? (1)按流划分,可以分为输入流和输出流;(2)按单位划分,可以分为字节流和字符流;
字节流:inputStream、outputStream;
字符流:reader、writer;
1.Map集合
- Map集合是一种双列集合,每个元素包含两个数据
- Map集合的每个元素的格式:key=value(键值对元素)
- Map集合也被成为键值对集合
特点
- Map集合的特点都是由键决定的
- Map集合的键是无序,不重复,无索引
- Map集合后面重复的键对应的值可以覆盖前面重复键的值
- Map集合的键值对都可以为null
Map集合实现类特点
- HashMap:元素按照键是无序,不重复,无索引的
- LinkedHashMap:元素是键有序,不重复,无索引
- TreeMap:元素是键排序,不重复,无索引
Map集合基本用法
//1.创建一个Map集合对象
Map<String,Integer> map = new HashMap<>();
// Map<String,Integer> map = new LinkedHashMap<>();
map.put("java",1);
map.put("set",25);
map.put("map",13);
map.put("java",null);
System.out.println(map);
//2.清空集合
// map.clear();
//3.判断集合是否为空
System.out.println(map.isEmpty());
//4.根据键获取对应值
System.out.println(map.get("set"));
//没有sss键,所以获取的值为null
System.out.println(map.get("sss"));
//5.删除元素,返回删除key的值
System.out.println(map.remove("map"));
//6.判断map是否包含某个键或值
System.out.println(map.containsKey("java"));
System.out.println(map.containsValue(25));
//7.获取所有键或值的集合
System.out.println(map.keySet());
System.out.println(map.values());
//8.合并其他集合
Map<String,Integer> map1 = new HashMap<>();
map1.put("mybatis",10);
map1.put("session",10);
map1.put("java",1000);
map.putAll(map1);
System.out.println(map);
Map集合的遍历
方法一:先获取所有的key值,然后遍历key,取到对应的值
Map<String,Integer> map = new HashMap<>();
map.put("张三",18);
map.put("李四",22);
map.put("王五",21);
map.put("赵六",20);
for (String s : map.keySet()) {
System.out.println("key:"+s+",value:"+map.get(s));
}
方法二:将Map集合转换成Set集合后遍历
//通过entrySet将Map集合转换成Set集合
//将键值对封装成一个整体对象
//将Map集合转换成set集合
Set<Map.Entry<String, Integer>> entries = map.entrySet();
//foreach遍历
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("key:"+key+",value:"+value);
}
方式三:foreach方式进行遍历
foreach的底层实现还是通过Map.Entry<K, V>去实现的
map.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String key, Integer value) {
System.out.println("key:"+key+",value:"+value);
}
});
方式四:foreach形式还可以用lambda表达式进一步简化
map.forEach((key,value)->{ System.out.println("key:"+key+",value:"+value);});
2.HashMap
特点
- HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引
- HashMap跟HashSet底层原理是一样的,都是哈希表结构,HashMap的每个元素包含两个值
实际中HashSet就是HashMap,只不过HashSet只用了HashMap的键而没有用HashMap的值
HashSet的实现原理
LinkedHashMap集合特点
- 由键决定:有序、不重复、无索引
- 有序是保证存储和取出的元素顺序一致
- 原理:底层数据结构依然是哈希表,只是每个键值对元素额外多了一个双链表的机制记录存储顺序
TreeMap集合特点
- 由键决定特性:不重复、无索引、可排序
- 可排序:按照键数据的大小默认升序,只能对键排序
- 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序
- TreeMap跟TreeSet底层原理一样(TreeSet是基于TreeMap实现的)
TreeMap集合自定义排序规则的两种方法
- 类实现Comparable接口,重写比较规则
- 集合自定义Comparator比较器,重写比较规则
示例
第一个map集合因为键是Integer,所以TreeMap会自动给我们进行排序。
第二个produce集合中我们定义了排序的规则
第三个produce1集合,根据集合构造器比较器重写降序排序
Map<Integer,String> map = new TreeMap<>();
map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");
map.put(4,"赵六");
System.out.println(map);
Map<Produce,String> produce = new TreeMap<>();
produce.put(new Produce("001","牛奶",5.5),"商品一");
produce.put(new Produce("002","面包",4.5),"商品二");
produce.put(new Produce("003","火腿肠",2.3),"商品三");
produce.put(new Produce("004","泡面",1.5),"商品四");
System.out.println(produce);
Map<Produce,String> produce1 = new TreeMap<>(new Comparator<Produce>() {
@Override
public int compare(Produce o1, Produce o2) {
//按照价格进行降序
return Double.compare(o2.getPrice(),o1.getPrice());
}
});
produce1.put(new Produce("001","牛奶",5.5),"商品一");
produce1.put(new Produce("002","面包",4.5),"商品二");
produce1.put(new Produce("003","火腿肠",2.3),"商品三");
produce1.put(new Produce("004","泡面",1.5),"商品四");
System.out.println(produce1);
//利用lambda表达式简化开发
Map<Produce,String> produce1 = new TreeMap<>((o1, o2)->Double.compare(o2.getPrice(),o1.getPrice()));
@Override
public int compareTo(Produce o) {
//根据价格进行比较
return this.price - o.price >= 0 ? 1 : -1;
}