String使用方法记录

程昱
• 阅读 1023

知识点
1、String s = "";会直接在常量池中创建该字符串
2、String s = new String("s");会创建两个对象,1是常量池中s,2是队中的new String("s")对象
3、intern()会判断这个字符串在不在字符串池中,如果不在则将当前字符串其加入到字符串池中

public static void main(String[] args) {

String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);

String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);

}

jdk6 false false
jdk7 false true
解释:
jdk6 :String s = new String("1");在堆中和字符串池中都创建了一个对象。s执行堆中的对象
s.intern()判断1已经在字符串池中了
String s2 = "1";创建了一个引用,直接指向字符串池中的1
s和s1指向不同的对象所以false
String s3 = new String("1")+new String("1");堆中创建了11以及字符串池中创建了1。s3指向堆中11
s3.intern();在字符串池中创建11
String s4 = "11";由于字符串池中已经有11了,s4直接指向11
所以s3=s4为false;

jdk7:String s = new String("1");在堆和字符串池中创建一个对象
s.intern();
String s2 = "1";创建了一个引用,直接指向字符串池中的1
s和s2为false;
String s3 = new String("1")+new String("1");堆中创建了11以及字符串池中创建了1。s3指向堆中11
s3.intern();常量池中不存在11,就将当前字符串的应用放入到常量池中
String s4 = "11";由于字符串池中已经有11了,s4直接指向常量池中11的引用
所以s3=s4为true;

public static void main(String[] args) {

String s = new String("1");
String s2 = "1";
s.intern();
System.out.println(s == s2);

String s3 = new String("1") + new String("1");
String s4 = "11";
s3.intern();
System.out.println(s3 == s4);

}
jdk6:false,false
jdk7:false,false
解释:
jdk6 :String s = new String("1");在堆中和字符串池中都创建了一个对象。s执行堆中的对象
String s2 = "1";创建了一个引用,直接指向字符串池中的1
s.intern()判断1已经在字符串池中了
s和s1指向不同的对象所以false
String s3 = new String("1")+new String("1");堆中创建了11以及字符串池中创建了1。s3指向堆中11
String s4 = "11";在字符串池中创建11,s4直接指向11
s3.intern();在字符串池中创建11
所以s3=s4为false;

jdk7:String s = new String("1");在堆和字符串池中创建一个对象
String s2 = "1";创建了一个引用,直接指向字符串池中的1
s.intern();
s和s2为false;
String s3 = new String("1")+new String("1");堆中创建了11以及字符串池中创建了1。s3指向堆中11
String s4 = "11";在字符串池中创建11,s4直接指向11
s3.intern();
所以s3=s4为false;

点赞
收藏
评论区
推荐文章
阿里最新面试必备项之Java的String类,持续更新中!
最新腾讯面试必备项之Java的String类,持续更新中!1.1String的特性String类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。String是一个final类,代表不可变的字符序列。String字符串是常量,用双引号引起来表示。他们的值在创建之后不能更改。String对象的找字符内容是存储在一个
Wesley13 Wesley13
3年前
java中stringBuilder的用法
String对象是不可改变的。每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循
Wesley13 Wesley13
3年前
java采坑之路
判断相等字符串判断相等        String str1  null;        String str2  "java金融";       // str1.equals(str2);  错误的写法        str2.equals(str1); // 常量写前面        Objects.equ
面试字节我被String类的问题给问死了!
""是怎么连接字符串的?(JDK1.7及以上)总结:使用""连接字符串时,实际上是使用临时创建的StringBuilder对象来辅助完成的。对于编译时常量,在编译后直接计算出字符串的值,而不会在运行时创建临时的StringBuilder对象来完成字符串连接。在循环中对String对象进行连接,应该直接使用StringBuilder代替"",这样
Wesley13 Wesley13
3年前
java疑问
1\.newString("abc")究竟创建几个对象?答:一个或两个,如果常量池中原来有"abc",那么只创建一个对象;如果常量池中原来没有"abc",则创建两个对象. newString("abc")调用publicString(Stringoriginal)构造函数,等于"abc"和newString()两个操作,
Wesley13 Wesley13
3年前
java虚拟机(三)
普通对象的创建(不包括数组和class对象):当虚拟机遇到new指令时,会在常量池中检查是否包含这个类的符号引用(全限定名),通过这个确定是否经过类加载的过程,如果true,为该对象分配内存,对象大小在类加载过程就已经确定。如果false,需要进行类加载。分配内存1、分配内存的方式:指针碰撞:如果内存
九路 九路
4年前
2 Java对象的创建过程
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢?程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢?一对象创建的步骤1遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用2如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过3如果没有加载过,则执行类加载过程
Easter79 Easter79
3年前
String 和 new String()的区别
String和newString()的区别ForExampleStringstr1"ABC"Stringstr2newString("ABC");Stringstr1"ABC";可能创建一个对象或者不创建对象。如果"ABC"这个字符串z在javaString池中不存在,会在javaString池中
Wesley13 Wesley13
3年前
md5加密
1importhashlib2importmd5在python2里边用这个34s'1234567'5print(s.encode())字符串转成bytes6mhashlib.md5(s.encode())加密7resm.
Wesley13 Wesley13
3年前
Java对象的创建、内存分配和访问
StudentstudentnewStudent();student.study();(1)对象的创建①检查new指令的参数是否能在常量池中定位到一个类的符号引用,检查符号引用代表的类是否已经加载、解析和初始化  类的加载机制(https://www.oschina.net/action/GoToLink?urlhttps%3
巧用GenericObjectPool创建自定义对象池
通常一个对象创建、销毁非常耗时的时候,我们不会频繁的创建和销毁它,而是考虑复用。复用对象的一种做法就是对象池,将创建好的对象放入池中维护起来,下次再用的时候直接拿池中已经创建好的对象继续用,这就是池化。