常量池里面的"北京尚学堂"和value[]是什么关系呀,是说主体是value[],然后"北京尚学堂"是一个标识吗?因为g1和g2指向了"北京尚学堂",而g3指向了value[]
相当于value[]里存放了"北京尚学堂"
老师这里value不是变量吗 为什么这里把它放在了常量池里面 还有这里的value属于常量池的哪一种啊?
因为String的底层是一个char类型的数组,你在new的时候,是在堆中放了一个char类型的数组,常量池里放了一个value[]是为了让同学清楚,这个String也是底层为char类型的一个数组,不管是new的,还是直接放在常量池里面的,都是底层为char类型的一个数组。
value[]是一个class文件常量池
String g1 = "北京尚学堂";
String g2 = "北京尚学堂";
我们可不可以说g1和g2是同一个对象?
可以说g1和g2的值是一样的,他们指向的都是同一个内存地址,直接通过g1==g2比较的结果为true,因为==会判断他们的内存地址是否相同
equals方法在没有重写的情况是默认比较两个对象的哈希值,但视频中的g1和g3很明显地址是不一样的,为什么会返回true?
String类自己就重新了equals方法了,equals方法本身是Object类的,String类重写了
g1和g2不都是指向常量池中的“桂林电子科技大学”吗,为啥内存地址不一样?
你调错方法了,这个方法是生成字节数组,每一个字符串生成一个新的字节数组
应该用hashCode方法
g1和g2的地址为什么是一样的
代码截图完整,让我看看g1 g2是什么,。
因为jvm在编译阶段会判断常量池中是否有 "北京尚学堂" 这个常量对象如果有,g2直接指向这个常量的引用,所以他们的地址是相同的 。
String g3 = new String("北京尚学堂");
为什么报错呢?
老师,不用回复了 我找出问题了?不能命名关键字
好的
这里没看懂哇,泪奔
g1 == g3 返回的是false,明明都是“北京。。。”
图中画的value[]怎么理解,看图三method area里边“北京。。。”跟value[]不是一回事吗?
g1==g3是比较的内存地址,比的是地址,肯定是不同的,g3已经new了,new就是在堆里新开辟了一块空间。value[]是一个char类型的数组存放的是字符串的值、g1和g3虽然值相同,但是地址是不同的。
String s = new String("北京尚学堂");
老师,这个代码里是有两个对象么?一个是new,一个是传入的?
一个。New了一个String类型的对象s,然后给它传一个参数,相当于赋值。
因为String的时候首字母必须大写,但是在IDEA中输入小写的string的时候,string不会自己转换成首字母大写或者给提示选项,只会显示红色下划线报错。
想问下在IDEA中是否可以设置成输入string会自动切换成大写的设置?类似sout可以直接输出print代码,psvm输出main方法一样,还是说string这个必须要自己注意大小写?谢谢
IDEA中是否可以设置成输入string会自动切换成大写
否,可以快捷键手动切换大小写。
老师在遍历Str1和Str2时,获取的结果是abcdefg,为啥不是一串地址?老师在源码里面也没找到重写后的toString方法
因为String是一个不可变得类,你在打印的时候会默认的去调用toString方法的。
因为String是一个不可变得类,你在打印的时候会默认的去调用toString方法的。
老师,所以String类是重写了toString方法,retun this ,this就是String类的这个对象所以直接把String的值返回回去吗
对,可以这样理解
string底层是怎么实现的 啊老师,,,,,,
现阶段不需要知道底层实现,学到后面可以看一下源码。现在的话看不懂源码就不强求了
这段代码无法执行?而且还有错?
把类名改了
改了类后不提示错误了,但仍然无法执行,咋回事呢?
你准备干什么,String类和你的St类又没有关系,你能这样new吗?
老师请问一下,equals方法在没有被重写之前,不就是比较是不是同一个对象吗,str1是一个字符串对象,str2是一个字符串常量,两者肯定不是一个对象,为啥在使用equals方法的时候就返回true了,不是应该返回false吗,不是一个对象的
String类已经重写了equals方法只要两个字符串里面的字符是一样的那就返回true