文档章节

JAVA 相关

 黑狗007
发布于 2016/05/06 14:43
字数 1860
阅读 50
收藏 3
点赞 2
评论 0
  1. Java重载为什么不能用返回值不同来重载

    int foo(); void foo();

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

  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中的键往往都使用字符串。


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)


© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 66
码字总数 14512
作品 0
广州
sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer
05/03
0
0
PHP与Java进行通信的实现方法

PHP与Java进行通信的实现方法缘起: 最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只...

Yomut
07/03
0
0
JVM Management API

JVM本 身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据、JVM当前所有线程及其栈相关信息等等。各种 JDK自带的剖析工具,包括jps、jstack、jin...

今幕明
2014/09/09
0
0
WebLogic时区与系统不一致的调整方式

我使用的WebLogic版本为9,运行环境为Windows7,WebLogic启动后发现控制台以及项目日志中的时间与实际系统的时间相差8小时,控制台显示的时区为GMT,于是考虑调整WebLogic的时区,查询WebLo...

benbenming
2011/07/12
0
0
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构
05/30
0
0
我所理解的JDK、JRE和JVM

1,JDK:Java Development Kit,即java开发工具。 2,打开jdk的安装文件夹。jdk的文件夹内,bin表示一些跟操作系统相关的启动文件,重点是jre目录。所以,jdk是包括jre的。而lib目录则是需要...

康斯但丁
2017/10/18
0
0
Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及...

刘学炜
2012/01/13
0
0
深度探讨Java字节代码的操纵方法

本文为IBM工程师成富编写的《Java深度历险》的第一部分Java字节代码的操纵,像这样Java语言的深度理解和运用还没有很多文章,我们把他奉献给读者,希望读者们喜欢。 51CTO编者按:我们曾给大...

mj4738
2011/11/02
0
0
JVM 发生GC时的事件通知的机制

如果您还在用Java 6的话,请赶紧升级到Java 7吧。 以下以Java 7为基准来讨论。 ============================================================== 在Java 7里有两种办法来监听GC事件。 一种是...

Sub
2013/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
3分钟前
0
0
Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+BootstrapTable列表\ ElementUI列表表单)...

Jeecg
6分钟前
0
0
export 和 module.export 的区别

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,...

孟飞阳
9分钟前
0
0
技术教育的兴起

技术教育的兴起 作者: 阮一峰 1、 有一年,我在台湾环岛旅行。 花莲的海边,我遇到一对台湾青年夫妻,带着女儿在海滩上玩。我们聊了起来。 当时,我还在高校当老师。他们问我,是否觉得台湾...

吕伯文
9分钟前
0
0
Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
13分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
16分钟前
0
0
Java NIO:浅析I/O模型

也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念...

yzbty23
17分钟前
0
0
了解iOS消息推送一文就够:史上最全iOS Push技术详解

本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表。 1、引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会...

JackJiang-
19分钟前
0
0
Mysql汉子转拼音

update t_app_city SET CITY_NAME_BEGIN = ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(CITY_NAME USING gbk),1)),16,10), 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7, 0xBFA......

尘叙缘
21分钟前
0
0
大数据构建智慧城市“新引擎”,加速推进新旧动能转换

——“大数据与智慧城市”技术交流分享会——济南站召开 7月13日,“大数据携手智慧城市,助力山东新旧动能转换”技术交流分享会——济南站在山东信息通信技术研究院会议室成功举办,此次会议...

左手的倒影
22分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部