Java_杂记_1

1、Java中原始数据类型都是值传递,传递的是值的副本,形参的改变是不会影响实际参数的值,引用传递传递的是引用类型数据,包括string、数组、列表、map、类对象等类型,形参与实际参数指向的是同一内存地址,因此形参修改会影响实参的值。


2、两个数值进行二元操作时,会有如下的转换操作:如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型;否则,如果其中一个操作数是float类型,另一个将会转换为float类型;否则,如果其中一个操作数是long类型,另一个会转换为long类型;否则,两个操作数都会转换为int类型。


3、使用ObjectOutputStream和ObjectInputStream可以将对象进行传输。声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态,transient代表对象的临时数据。


4、字符串常量池:JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被称为字符串常量池或者字符串字面量池。

工作原理:当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回引用。

实现前提:字符串常量池实现的前提就是Java中String的对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。


5、关于堆和栈:Java中所有由类实例化的对象和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。而栈内存用来存储局部变量和方法调用。


6、关于寄存器:Java中运行时数据区有一个程序寄存器(又称程序计数器),该寄存器为线程私有。Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined


7、ArrayList的空间浪费主要体现在在List列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现它的每一个元素都需要消耗相当的空间。是因为ArrayLIst空间的增长率为50%+1,所以,最后很可能留下一部分的空间是没有用到的;LinkedList每个节点都需要额外的指针。


8、在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。


9、静态include与动态include

动态include用jsp:include动作实现<jsp:include page="included.jsp" flush="true"/>它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。各个文件分别先编译,然后组合成一个文件。

静态include用include伪代码实现,定不会检查所含文件的变化,适合于包含静态页面<%@ include file="included.html"%>。先将文件的代码原封不动的加入到主页面,从而合成一个文件,然后再进行翻译,此时不允许有相同的变量。

两种include的区别:

1、执行时间

<%@ include file="relativeURI"%>是在翻译阶段执行。

<jsp:include page="relativeURI" flush="true"/>在请求处理阶段执行。

2、引入的内容

<%@ icnlude file="relativeURI"%>引入静态文本(html、jsp),在jsp页面被转为servlet之前和它融合到一起。

<jsp:include page="relativeURI" flush="true"/>引入执行页面或servlet所生成的应答文本。


10、Java没有指针概念,被封装起来了,而C++有;Java不支持类的多继承,但支持接口多继承,C++支持类的多继承;C++支持操作符重载(操作符重载,计算机学科概念,就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过程。,Java不支持;Java的内存管理比C++方便,而且错误处理也比较好;C++的速度比Java快;C++更适合用于有运行速度要求的情况,Java适用于效率要求不高,但维护性要好的情况。


11、HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而MAp中保存key值前,回去判断当前Map中是否含有该key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。


12、String不可变字符序列,StringBuffer线程安全的可变字符序列,StringBuilder非线程安全的可变字符序列。Java中String是一个类,而并非基本数据类型。String是值传递,而不是引用传入。StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大的区别。但在线程安全性方面,StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized修饰了,而StringBuilder没有。StringBuilder的效率要比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。另外,JVM运行程序主要的时间消耗在创建对象和回收对象上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值