Java重载为何不能用返回值不一样来重载html
int foo(); void foo();java
由于函数调用时,可能不须要处理返回值的状况,直接就 foo(), 此时编译器就不知道改调用哪一个sql
多重继承和多接口实现数据库
Java不支持多重继承,由于多重继承的父亲可能包含一样函数和实现,会形成子类歧义编程
而实现多接口,由于接口都只是定义没有实现,对于子类来讲实现接口是同样的,因此不会形成歧义。缓存
如果多个接口中有同名的变量(接口的变量实际上都是常量),若在子类中使用该同名常量将形成歧义,编译出错,不使用则不会有问题,能够经过接口类名.变量名来访问该数值安全
Java的String类为何要设成immutable类型(不可变)多线程
String s1 = "abcd"; String s2 = "abcd"; if (s1 == s2) 二者是相等的 String a = "aaa"; String b = "aa" + "a"; a b仍然是相等的 String a = "aaa"; String b = new String("aa" + "a"); 此时 a b不一样 第一种字符串初始化方式,当有多于一个字符串的内容相同状况,字符串内容会放在字符串缓冲池中,即字符串内容在内存中只有一份。 第二种字符串初始化方式,不论有没有字符串值相同,每次都会在内存堆中存储字符串的值。
1.只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现能够在运行时节约不少heap空间,由于不一样的字符串变量都指向池中的同一个字符串。但若是字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不一样的字符串仅仅只保存一个,即不会保存多个相同的字符串。),由于这样的话,若是变量改变了它的值,那么其它指向这个值的变量的值也会一块儿改变。
2.若是字符串是可变的,那么会引发很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来得到数据库的链接,或者在socket编程中,主机名和端口都是以字符串的形式传入。由于字符串是不可变的,因此它的值是不可改变的,不然黑客们能够钻到空子,改变字符串指向的对象的值,形成安全漏洞。
3.由于字符串是不可变的,因此是多线程安全的,同一个字符串实例能够被多个线程共享。这样便不用由于线程安全问题而使用同步。字符串本身即是线程安全的。
4.类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改为了myhacked.Connection,那么会对你的数据库形成不可知的破坏。
5.由于字符串是不可变的,因此在它建立的时候hashcode就被缓存了,不须要从新计算。这就使得字符串很适合做为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键每每都使用字符串。socket
4. 基础类型int long double等与封装类类型 Integer Long。。。之间的没必要要转换能够优化
函数
Long sum = 0L; for(long i = 0; i < Integer.MAX_VALUE; i++){ sum += i;
5. java 垃圾回收
设置未null,会自动回收
逻辑上已经再也不使用,但引用仍然在用
栈的出入 http://blog.csdn.net/chjttony/article/details/7484902
6. Java 的接口和抽象类的区别
http://www.cnblogs.com/dolphin0520/p/3811437.html
抽象类能够有实现,但接口不能有实现,二者均不可实例化
一个类只能继承一个抽象类,而一个类却能够实现多个接口。
7. 延迟初始化线程安全 http://blog.csdn.net/chjttony/article/details/8516876
1) 静态类的初始化 延迟初始化持有类模式
private static class FieldHolder{//静态内部类 static final FieldType field = computeFieldValue(); } static FieldType getField(){ return FieldHolder.field; }
2) 加synchronized关键字
private FieldType field;// 也能够对静态域延迟初始化private static FieldType field; synchronized FieldType getField(){ if(field == null){ field = computeFieldValue(); } return field; }
3) 双重检查
private volatile FieldType field; FieldType getField(){ FieldType result = field; if(result == null){//第一次检查 synchronized(this){ result = field; if(result == null){//第二次检查 field = result = computeFieldValue(); } } } return result; }
双重检查中域声明为volatile很重要,volatile关键字强制禁止java虚拟机对指令乱序执行,在JDK1.5以前因为不一样的java虚拟机内存模型对volatile关键字实现支持不一样,致使双重检查不能稳定正常运行,JDK1.5以后引入的内存模式解决了这个问题。
局部变量result确保实例域field只在已经被初始化的状况下读取一次,虽然不是严格要求,可是能够提高性能。双重检查模式将同步代码范围缩小,减小了实例域访问开销。
注意没有必须对静态域使用双重检查模式,延迟初始化持有类模式更加优雅强大。
8. Java与C++的多态区别
1) java默认全部的函数都是可动态绑定的虚函数, C++必须是声明未virtual的函数才能被动态绑定
C++要触发动态绑定,必须知足两个条件:第一:只有指定为虚函数的成员函数才能进行动态绑定。第二,必须经过基类类型的引用或者指针进行函数调用。
9. Java 的对象都是引用,C++有引用或指针,指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向
10. C++
与malloc和free的区别
(1)new/delete调用 constructor/destructor.Malloc/free 不会
(2)new 不须要类型强制转换。.Malloc 要对放回的指针强制类型转换.
(3)new/delete操做符能够被重载, malloc/free 不会
(4)new 并不会强制要求你计算所须要的内存 ( 不像malloc)