JAVA 相关

  1. Java重载为何不能用返回值不一样来重载html

    int foo(); void foo();java

    由于函数调用时,可能不须要处理返回值的状况,直接就 foo(), 此时编译器就不知道改调用哪一个sql

  2. 多重继承和多接口实现数据库

    Java不支持多重继承,由于多重继承的父亲可能包含一样函数和实现,会形成子类歧义编程

    而实现多接口,由于接口都只是定义没有实现,对于子类来讲实现接口是同样的,因此不会形成歧义。缓存

    如果多个接口中有同名的变量(接口的变量实际上都是常量),若在子类中使用该同名常量将形成歧义,编译出错,不使用则不会有问题,能够经过接口类名.变量名来访问该数值安全

  3. Java的String类为何要设成immutable类型(不可变)多线程

  4. 1).不可变对象能够提升String Pool的效率和安全性。若是你知道一个对象是不可变的,那么须要拷贝这个对象的内容时,就不用复制它的自己而只是复制它的地址,复制地址(一般一个指针的大小)须要很小的内存效率也很高。对于同时引用这个“ABC”的其余变量也不会形成影响。



  5. 2).不可变对象对于多线程是安全的,由于在多线程同时进行的状况下,一个可变对象的值极可能被其余进程改变,这样会形成不可预期的结果,而使用不可变对象就能够避免这种状况。



  6. 固然也有其余方面缘由,可是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. 倘若字符串对象容许改变,那么将会致使各类逻辑错误,好比改变一个对象会影响到另外一个独立对象. 严格来讲,这种常量池的思想,是一种优化手段.




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)

相关文章
相关标签/搜索