首页 > 技术文章 > JAVA常见问题

stpan 2018-08-29 00:01 原文

  1. Hashmap & Hashtable
  2. StringBuffer & StringBuilder:主要用于大量字符串拼接,避免产生过多的中间对象;前者非线程安全,后者线程安全;
  3. String s = new String("test") -> 创建两个对象:一个在字符串pool中(常量池),一个在heap中
  4. == 和 equals()
    • 两个对象使用==,比较的是对象引用;
    • 如果要比较内容相等,一般使用equals(但不包括primitive类型);
    • equals默认是判断两个对象是否==,所以默认比较两个对象的引用;但是JAVA有些类重写了equals方法,实现判断内容是否也相等,如String, Date, Double,Integer,所以自定义类要实现equals,需要重写equals方法,同时有必要重写hashcode方法(既然要两个对象equals,那严格意义上hashcode也是一致的,否则在如HashMap,HashTable类似的集合存储以对象为key会有问题,因为是否重复是以对象key的hashcode值来判断重复);
    • 所以说,两个对象equals,则hashcode相等;但是hashcode相同的两个对象(如"Aa"和"BB",原因与计算hashcode算法有关),不一定equals。
    • 注意:如果定义String str1="Test"; String str2 = "Test", str1 == str2 返回是true。
    • Map中以hash查找之所以高效(而不是通过遍历所有元素):首先将Map分区,然后将hashcode按某种规则分区存储,查找时只要先找到对应的区,最后在那个区进行遍历。
  5. TCP三次握手(主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接)
    • 第一次握手:主机A发送syn number至主机B(syn=1,则B知道A要求建立连接);
    • 第二次握手:主机B收到确认信息后,向A发送ack number;
    • 第三次握手:主机A接收到ack number并检查正确性,再次发送ack number至B(带syn number),B确认正确后,则连接建立成功,主机A开始向B传送数据。
    • 为什么不是2次或4次:因为三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息(类似A与B打电话的场景)

推荐阅读