MS系列:Java基础

http://blog.csdn.net/justloveyou_?viewmode=contents 里面有较多关于面试的总结
https://github.com/liyang0211/interview-resources-zhCN

Integer

[-128,127]的数据是缓存在Integer[]中,因此
Integer a= 127; Integer b= 127; System.out.println(a==b); 结果=true
Integer a= 128; Integer b= 128; System.out.println(a==b); 结果=false

tring和StringBuffer、StringBuilder的区别

性能差别:StringBuilder > StringBuffer > String;
StringBuffer线程安全、StringBuilder线程不安全 
String、StringBuffer和StringBuilder本质都是char[]
String中char[]的长度和String相同,每次拼接都要new新的char[]
StringBuffer和StringBuilder中char[]的长度大于实际字符长度,只是当容量不够时才copy到一个更大的char[]

hashCode和equals方法的关系

hashcode()方法是JDK根据对象的地址或者字符串的值计算出来的int类型的数值(哈希码值)。
hashcode()的约定:
    同一对象多次调用hashcode()方法,必须返回相同的数值。
    如果两个对象根据equals()方法比较是相等的,那么两个对象调用hashcode()方法返回的结果必须相等。
    如果两个对象根据equals()方法比较是不相等的,那么两个对象调用hashcode()方法返回的结果不一定不相等。

Object中的hashcode():
    通过将对象的内部地址转换为整数来实现
Object中的equals():
    public boolean equals(Object obj) {
        return (this == obj);
    }
请注意,无论何时重写equals(),通常都必须重写hashcode(),以维护hashCode方法的一般约定,该方法声明相等对象必须具有相同的哈希代码。

String中的hashcode(): 公式= s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
String中的equals():
    两个字符串非空,并且char[]中每一个char用“==”表达式返回true

练习:
    Student s = new Student();
    System.out.println(s.hashCode());
    s.setName("peter");
    System.out.println(s.hashCode());
    两次返回的hashcode相同

    String s = "ab";
    System.out.println(s.hashCode());
    s = "bc";
    System.out.println(s.hashCode());
    两次返回的hashcode不相同

内部类和外部类的区别

a. 内部类可以用private、protected、static来修饰,而外部类不可以。
b. 内部类可以直接访问外部类的成员,而外部类不可以直接访问内部类的成员。具体见“静态内部类和普通内部类的区别”。

静态内部类和普通内部类的区别(参考LinkedList的静态内部类Node)

a. 外部类访问内部类:
    外部类访问普通内部类的非静态成员(普通内部类不能定义静态属性或静态方法): MyTest.Student s = new MyTest().new Student();  s.hello();
    外部类访问静态内部类的非静态属性: MyTest.Teacher t = new MyTest.Teacher();  t.hello();
    外部类访问静态内部类的静态属性: MyTest.Teacher.School_Name;
b. 内部类访问外部内:
    所有内部类可以直接使用外部类的静态属性
    普通内部类可以直接使用外部类的非静态属性
    静态内部类必须通过外部类的对象访问外部类的非静态属性:MyTest test = new MyTest(); test.hello();
c. 普通内部类里面不能定义各种静态的成员(包括静态变量、静态方法、静态代码块和静态内部类),而静态内部类中则可以。原因:普通内部类必须通过外部类的对象来访问,违背了静态成员可以直接通过类名访问的规则。
d. 初始化方式不同:
    静态内部类初始化 MyTest.Teacher t = new MyTest.Teacher();
    非静态内部类初始化 MyTest.Student s = new MyTest().new Student();
e. 注意:静态内部类和普通内部类都可以定义非静态的属性或方法,都以用new实例化出静态内部类和普通内部类的对象。原因:用static修饰内部类,只是说明该类属于外部类本身,而不是属于外部类的某个对象。

Java中的BIO,NIO,AIO

BIO(同步阻塞IO):一个连接对应一个线程
当有客户端连接请求时,服务端需要启动一个线程进行处理,如果这个连接不做任何处理,会造成不必要的线程开销,可以通过线程池机制改善,从而实现伪异步IO;

NIO(同步非阻塞IO):N个连接对应一个线程
客户端所有的连接请求都会注册到多路复用器上,服务端通过一个多路复用器来处理所有请求。

AIO(异步非阻塞IO):NIO的2.0版本,引入了异步通道的概念,可以实现异步调用。
异步实现方式:通过java.util.concurrent.Future类来表示异步操作的结果;
在执行异步操作的时候传入java.nio.channels。  

AIO相对于NIO的区别在于,NIO需要使用者线程不停的轮询IO对象,来确定是否有数据准备好可以读了,而AIO则是在数据准备好之后,才会通知数据使用者,这样使用者就不需要不停地轮询了。
参考: 
https://baijiahao.baidu.com/s?id=1573998393898438&wfr=spider&for=pc
http://blog.csdn.net/x_i_y_u_e/article/details/52223406
http://blog.csdn.net/a19881029/article/details/52099795
https://www.ibm.com/developerworks/cn/java/j-lo-nio2/
等待进一步深入了解
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26182553

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值