博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 相关
阅读量:6873 次
发布时间:2019-06-26

本文共 3249 字,大约阅读时间需要 10 分钟。

hot3.png

  1. Java重载为什么不能用返回值不同来重载

    int foo(); void foo();

    因为函数调用时,可能不需要处理返回值的情况,直接就 foo(), 此时编译器就不知道改调用哪个

  2. 多重继承和多接口实现

    Java不支持多重继承,因为多重继承的父亲可能包含同样函数和实现,会造成子类歧义

    而实现多接口,因为接口都只是定义没有实现,对于子类来说实现接口是一样的,所以不会造成歧义。

    若是多个接口中有同名的变量(接口的变量实际上都是常量),若在子类中使用该同名常量将造成歧义,编译出错,不使用则不会有问题,可以通过接口类名.变量名来访问该数值

  3. Java的String类为什么要设成immutable类型(不可变)

1).不可变对象可以提高String Pool的效率和安全性。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用这个“ABC”的其他变量也不会造成影响。

2).不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。

当然也有其他方面原因,但是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中的键往往都使用字符串。

4.  基础类型int long double等与封装类类型 Integer Long。。。之间的不必要转换可以优化

 Long sum = 0L;      for(long i = 0; i < Integer.MAX_VALUE; i++){      sum += i;

5. java 垃圾回收

   设置未null,会自动回收

   逻辑上已经不再使用,但引用仍然在用

   栈的出入 

6. Java 的接口和抽象类的区别

抽象类可以有实现,但接口不能有实现,两者均不可实例化

一个类只能继承一个抽象类,而一个类却可以实现多个接口。

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)

转载于:https://my.oschina.net/u/2485194/blog/670880

你可能感兴趣的文章
请求与响应
查看>>
react项目中使用mocha结合chai断言库进行单元测试
查看>>
css3动画
查看>>
Spring Boot 单元测试二三事
查看>>
电脑中播放的声音怎么在线录制
查看>>
微信小程序开发心得
查看>>
nfs
查看>>
Angular vs React 最全面深入对比
查看>>
containerd项目正式从CNCF毕业
查看>>
中台之上(十二):如何快速设计业务架构?
查看>>
C#的未来:托管指针
查看>>
微软发布UWP Bridge项目将一切应用转为Windows应用
查看>>
语义鸿沟、异构鸿沟、数据缺失,多模态技术如何跨过这些坎?
查看>>
与广告“互动”—情景互动式创意广告
查看>>
使用外部表查看ORACLE报警日志
查看>>
业务发展如何利用创新驱动力量?
查看>>
云数据加密公司LOCKet获千万级Pre-A融资
查看>>
爱尔兰WElink Energy宣布在葡萄牙建立220MW太阳能光伏项目
查看>>
如何从敏捷到精益地修复bug与解决问题
查看>>
开启智慧新生活 新余市智慧城市建设全省率先
查看>>