周一,谁才是最快的。。。
问:它们两个时间复杂度各是多少,或者说谁的速度更快呢?
public static void main(String[] args) {
//HashMap
HashMap<String,String> hashMap = new HashMap<>();
hashMap.containsKey(key);
//List
List<String> list = new ArrayList<>();
list.contains(key);
}
答: hashmap是先计算hashcode,然后定位定位到某个位置,然后再进行比较 其实现是和get一样的。所以时间复杂度是O(1) 而ArrayList是逐个比较,就相当于遍历,所以时间复杂度是O(n)
周二,我错了吗?
问:上面的程序有异常吗?如果没有输出什么?如果有,异常会发上在哪一行,又会抛出什么异常?然后如何改正?请把答案写在问答区。
public static void main(String[] args) {
//阿里巴巴fastjson
1. HashMap<String, String> map = new HashMap<>();
2. map.put("姓名","小编");
3. map.put("年龄","18");
4. HashMap<String, HashMap<String, String>> mapMap = new HashMap<>();
5. mapMap.put("小编",map);
6. String jsonStr = JSONObject.toJSONString(mapMap);
7. HashMap<String, HashMap<String, String>> jsonToMap =
(HashMap<String, HashMap<String, String>>)JSONObject.parseObject(jsonStr, HashMap.class);
8. HashMap<String, String> hashMap = jsonToMap.get("小编");
9. System.out.println(hashMap.get("姓名"));
}
答:错误是第八行,数据类型转换异常。正确的写法是:
JSONObject.parseObject(jsonStr, new TypeReference<HashMap<String, HashMap<String, String>>>(){});
周三,HashMap Key重复?
问:T重写了equals方法。上面程序输出是什么?此题考察了哪些知识点。
@Data
static class T {
private Integer id;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
T t = (T) o;
return Objects.equals(id, t.id) &&
Objects.equals(name, t.name);
}
}
public static void main(String[] args) throws IOException {
HashMap<T,String> hashMap = new HashMap<>();
T t1 = new T();
t1.setId(1);
t1.setName("小编");
hashMap.put(t1,"未知");
T t2 = new T();
t2.setId(1);
t2.setName("小编");
hashMap.put(t2,"未知");
System.out.println(hashMap.size());
}
答:答案是2。map判断存放的对象是否重复,是根据key的hash值进行运算后,来比较key是否相同。类重写equlas方法是一定要重写hashcode方法的。这段代码只重写了equlas方法,从表面看两个对象是同一个对象,但他们的hash值并不一样。所以map会存放两个对象的。
周四,我还在傻傻的用a.equals(b)
问:在下面写下你的代码,功能判断两个字符串是否一样。要以最优雅的方式哦
public static void main(String[] args) {
//a未知,有可能为null,有可能有值
String a;
//b未知,有可能为null,有可能有值
String b;
//判断两个字符串是否一样
Boolean test = test(a, b);
System.out.println(test);
}
public static Boolean test(String a, String b) {
//TODO
//判断两个字符串是否一样,
//以最优雅的方式补全代码
}
答:答案是 return Objects.equals(a, b);有的读者回答也有StringUtils.equals(a,b)功能实现了, 但是引入的包是import org.apache.commons.lang.StringUtils;会和其他的StringUtils包冲突,产生不美观写法,所以不建议。
周五,我用了double他让我滚蛋,这次我用BigDecimal
问:上面程序输出结果是什么?原因呢?
public static void main(String[] args) {
//double x = 0.1;
//double y = 0.2;
//double z = 0.3;
//众所周知。x + y == z 为false
//那么下面我替换成这样输出结果是什么
BigDecimal a = new BigDecimal(0.1);
BigDecimal b = new BigDecimal(0.2);
BigDecimal c = new BigDecimal(0.3);
//BigDecimal 的compareTo 是比较大小
//-1 小于
//0 等于
//1 大于
//为了方便看我换了行
System.out.println(
(a.add(b)).compareTo(c)==0
);
}
答:答案是false我们都知道BigDecimal,但是用法是有问题的就以这个例子来说,0.2在存入计算机的时候已经不精确了,你在用BigDecimal构造方法也是不精确的,BigDecimal 源码里有个long valBits = Double.doubleToLongBits(val);就好比你给别人错误的值却想要正确的答案是不可能的。所以BigDecimal a = new BigDecimal("0.2");这种才是正确的写法。
周六,周六放松下换个逻辑题目
问:请写出你的选择,并解释下原因。
有三扇门,只有一扇门后有奖品,你选了一扇,
于是有两扇门你没选,主持人为你排除一扇没有奖
品的门,问你改不改变你原来的选择?为什么?
答:如果你不换门,那概率是1/3。
如果你换了门。那概率是2/3。
我们这个题目换个思路。我和你同时参赛,你选择一扇门,我也可选择一扇门,你先选,你选选过后的两扇门都归我。
也就是你的概率是1/3,我的概率是2/3。
你会说我不是只能选一扇门吗,是的,我会让主持人帮我排除一扇门,所以我选的那扇门的概率就是2/3。
所以答案是换,因为换的概率变成了2/3