牛客网每日打卡-Java基础-20160326
Posted 由此及彼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客网每日打卡-Java基础-20160326相关的知识,希望对你有一定的参考价值。
什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
Java专项练习
关于JAVA的垃圾回收机制,
JAVA程序不能依赖于垃圾回收的时间或者顺序。
java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。 当对象的引用变量被赋值为null,可能被当成垃圾。
public
class
Example
String str =
new
String(
"good"
);
char
[] ch =
'a'
,
'b'
,
'c'
;
public
static
void
main(String args[])
Example ex =
new
Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str +
" and "
);
System.out.print(ex.ch);
public
void
change(String str,
char
ch[])
str =
"test ok"
;
ch[0] =
'g'
;
good and gbc考察值传递和引用传递。对于值传递,拷贝的值用完之后就会被释放,对原值没有任何影响,但是对于引用传递,拷贝的是对象的引用,和原值指向的同一块地址,即操作的是同一个对象,所以操作之间会相互影响。 所以对于String str是值传递,操作之间互不影响,原值保持不变。而ch是数组,拷贝的是对象的引用,值发生了改变, (其实都是引用传递,只是因为String是个特殊的final类,所以每次对String的更改都会重新创建内存地址并存储(也可能是在字符串常量池中创建内存地址并存入对应的字符串内容),但是因为这里String是作为参数传递的,在方法体内会产生新的字符串而不会对方法体外的字符串产生影响。)
Consider the following code:
1 2 3 |
Integer s=
new
Integer(
9
);
Integer t=
new
Integer(
9
);
Long u=
new
Long(
9
);
|
(s.equals(t))
(s.equals(9))
(s.equals(new Integer(9))
(s.equals(t)) , Integer 的 equals 方法如下:
public boolean equals(Object obj)
if (obj instanceof Integer)
return value == ((Integer)obj).intValue();
return false ;
是 Integer 的实例且 value 值也相等的情况下返回真,其他返回假。
在这里, s 和 t 都是 Integer 类型且值都为 9 ,因此结果为真。
(s.equals(9)) , 在进行 equals 比较之前,会对 9 调用 Integer.valueOf 方法,进行自动装箱 , 由于 IntegerCache 中已经存在 9 ,所以,直接返回其引用,引用相同, equals 就自然相同了。所以结果为真。
(s.equals( new Integer(9)) ,直接创建了一个新的 Integer 实例,但且值也为 9 ,所以,满足条件,返回真。
以上是关于牛客网每日打卡-Java基础-20160326的主要内容,如果未能解决你的问题,请参考以下文章