sun.misc.VM.getSavedProperty(\"java.lang.Integer.IntegerCache.high\");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i Integer.MAX_VALUE - (-low) -1);
high = h;
cache = new Integer[(high - low) + 1
;
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k
= new Integer(j++);
private IntegerCache() {
这个类就是在Integer类装入内存中时 , 会执行其内部类中静态代码块进行其初始化工作 , 做的主要工作就是把一字节的整型数据(-128 , 127)装包成Integer类并把其对应的引用存入cache数组中 , 这样在方法区中开辟空间存放这些静态Integer变量 , 同时静态cache数组也存放在这里 , 供线程享用 , 这也称静态缓存 。
所以当用Integer声明初始化变量时 , 会先判断所赋值的大小是否在-128到127之间 , 若在 , 则利用静态缓存中的空间并且返回对应cache数组中对应引用 , 存放到运行栈中 , 而不再重新开辟内存 。 若不在则new 一个新的对象放入堆中 。
五.类的初始化过程
/*父类*/
public class Person {
public Person() {
System.out.println(\"im person_1\");
{
System.out.println(\"im person_2\");
static {
System.out.println(\"im person_3\");
/*子类*/
public class test extends Person {
public test() {
System.out.println(\"im test_1\");
{
System.out.println(\"im test_2\");
static {
System.out.println(\"im test_3\");
public static void main(String[
args) throws Exception {
new test();
输出:
im person_3
im test_3
im person_2
im person_1
im test_2
im test_1
解释:在类中变量初始化时 , 顺序为 static→变量→构造方法 。
六.值传递 , 引用传递
public class test {
String s=\"hello\";
char[
ch={'a''b''c';
Character ck='k';
public static void main(String[
args) throws Exception {
test tt = new test();
tt.change(tt.stt.chtt.ck);
System.out.println(\"--------\");
System.out.println(\"s+\"+tt.s.hashCode());
System.out.println(\"ch+\"+tt.ch.hashCode());
System.out.println(\"ck+\"+tt.ck.hashCode());
System.out.println(\"--------\");
System.out.println(tt.s);
System.out.println(tt.ch);
System.out.println(tt.ck);
public void change(String strchar[
chCharacter ck){
str=\"world\";
ch[0
='d';
ck='c';
System.out.println(\"str+\"+str.hashCode());
System.out.println(\"ch+\"+ch.hashCode());
System.out.println(\"ckl+\"+ck.hashCode());
输出:
str+113318802
ch+1828682968
ckl+99
--------
s+99162322
ch+1828682968
ck+107
--------
hello
dbc
k
可见 , String类型是不会被修改的 , 在编译时 , 方法栈里有world , 如果是输入赋值给String应该会变 , char数组传递的是数组的引用 , Character传递的是值
传值不会修改原来的 , 传引用会修改原来的 。
七.i++与++i
public static void main(String[
args) throws Exception {
int a=1;
int b=a++; //先执行b=a再执行a++
System.out.println(b++); //先执行print(b) , 再执行b++
输出:1
八.==与equals的区别
==:
1.在==中 , 如果比较的是intlongshort这种基本数据类型 , 那么==比较的是它们的值
2.若比较的引用数据类型 , 如类 , String , 那么比较的是它们的内存地址 , 除非是同一个new一个出来的对象 , 此时地址相同 , 返回ture , 否则返回false
如:
String a= new String(\"abc\");
String b=a;
sout(a==b); //ture
若:
String c= new String(\"c\");
String c1= \"c\";
sout(c==c1);//false
equals:
1.所有类都继承自Object , 若不重写equals()方法 , 那么调用Object类中的equals()方法 , 源代码:
public boolean equals(Object obj) {
return (this == obj);
- 程序员|程序员的口味变了!C++首次逆袭JAVA:跻身最受欢迎编程语言TOP3
- 金舟批量重命名软件操作方法
- 如何对批量对文件进行重命名?
- Java|华为笔记本双12大促开启 智慧体验让办公学习更高效
- Java|京东第一刀落下:多个副总裁卸任 刘强东嫡系人手接管
- Java|荣耀Magic5Pro很大胆,16GB+5000mAh+100W,香喷喷
- Java|MIUI14把精简当作核心卖点,国产系统急需做减法
- Java|“高薪专业户”的IT互联网行业是否已达到天花板?Java行业薪酬
- javascript|全民淘宝节|千万个淘宝卖家,有千万种答案
- 【微服务】146:商品品牌业务后台Java代码编写
