A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1.String类是基本数据类型还是引用数据类型?为什么字符串的长度不可变?
答:1.String类是引用数据类型
       2.通过直接赋值的方式,字符串首先会在栈内存里面开辟一块空间,然后把它的值放到内存中的方法区里面的字            符串常量池里面,然后生成一个地址这个地址给到栈内存的,String s = xxx 跟堆没有任何关系,而在下一次           有直接创建赋值一个字符串的时候首先也会在栈当中开辟一块空间 如String ss =   然后去方法区里面的常量池           里面查找是否有相同的字符串,如果有则直接引用 之前的那个地址而不会为这个对象在常量池中创建新的字符          串 所以应该是在栈中创建了两个对象 指向同一个内容, 如果为 s+=xxx 则会直接去找常量池找到后再次建立一      块儿空间并且生成地址值,但是并没有意义因为在栈中没有任何变量指向它,所以他会在常量池中在创建一个空间把之前的和现在合起来拼凑出一个新的字符串并且把原来s的指针断掉 重新指向 拼凑的字符串,(因为字符串的创建都在常量池中是个常量所以一经创建则不能被改变,若值相同则直接引用,若不相同则再次创建一个新的。若之前的变量+=新的字符串,则会把之前的复制一份加上现在的字符串创建一个新的字符串然后断掉之前的指针);

2.什么情况下会用到Static关键字?
答:1.在多个对象需要用到同一个变量数据的时候他就该被定义为静态的,static关键字是静态的表示,我们的main方法就是静态的,静态的生命周期是随着类的创建而创建随着类的消失而消失,所以jvm不需要创建对象就可以直接通过类名调用,在类加载的时候我们的变量就已经存在在内存当中的静态区了,
3.静态代码块会在什么时候执行?
答:在类加载的时候就会执行,静态内容是随着类的加载而加载的,在加载类的时候就会启动静态代码块里面的代码,我们的代码如果要提前加载的话就可以用静态代码块儿包裹起来,如游戏的初始化过程,可以在一启动的时候就开始加载。
4.String s = new String("abc");这句代码创建了几个对象?分别在内存中的哪个区域创建?
   String s = "abc";创建了几个对象,分别在内存中的哪个区域创建?
答: 两个对象 new出来的都在堆内存中,直接赋值的在方法区里面的常量池里面,分别会分配不同的地址值,如果比较地址值的话则会是false 如果比较内容的话就是true。




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马