云主机是不是可以搭建无数个网站,泰州做房产的网站,徐州通域网架公司,宝安网站(建设深圳信科)参考链接#xff1a; 比较Java中的两个字符串String
最近很多学习java的小白问我字串相关的问题#xff0c;觉得很有必要整理下#xff0c;以方便初学者理解字符串以及应对今后面试中考官的提问。
如果你是有几年Java开发经验#xff0c;可以根据目录选择性的阅读以下内…参考链接 比较Java中的两个字符串String
最近很多学习java的小白问我字串相关的问题觉得很有必要整理下以方便初学者理解字符串以及应对今后面试中考官的提问。
如果你是有几年Java开发经验可以根据目录选择性的阅读以下内容并欢迎留言补充。
问题列表如下
0.String是最基本的数据类型吗? 1.String是否可以被继承? 2.Java中的String a abc和String a new String(abc)的区别 3.为什么字符串是不可变的 4.什么是String常量池 5.使用字符串初始化代码String a new String(abc)创建多少个对象 6.String类中intern()的作用 7.使用equals和进行字符串比较的差异 8.String StringBuffer StringBuilder 三者各自线程安全性如何 9.String,StringBuffer以及StringBuilder之间的区别 10.如何连接多个字符串。 11.如何分割一个String 12.如何判断两个String是否相等 13.String类中字符串长度是否有限制 14.Java String “”连接符拼接字符串原理
0.String是最基本的数据类型吗? Java中基本数据类型包括byte,int,char,long,float,double,boolean,short一共八个String是定义在 java.lang 包下的一个类。它不是基本数据类型。
1.String是否可以被继承? 不可以,因为String类似final类。
2.Java中的String a abc和String a new String(abc)的区别 String a abc 使用常量进行初始化初始化后内存存储在String常量池中 String a new String(abc) 创建字符串对象JVM创建字符串对象但不存储于字符串池。
3.为什么字符串是不可变的 因为String类似final类。
4.什么是String常量池 字符串池是一个特殊的内存区域与存储这些字符串常量的常规堆内存分开。这些对象在应用程序的生命周期中被称为字符串变量。 如双引号直接创建的字串String a abc会将abc存储在该区域。
5.使用字符串初始化代码String a new String(abc)创建多少个对象 上面一行代码将会创建1或2个字符串。如果在字符串常量池中已经有一个字符串“abc”那么就只会创建一个“abc”字符串。如果字符串常量池中没有“abc”那么首先会在字符串池中创建然后才在堆内存中创建这种情况就会创建2个对象了。
6.String类中intern()的作用
作用返回字符串对象的规范表示。 调用该方法时如果池已包含String与equals(Object)方法确定的此对象相等的字符串则返回池中的字符串。否则将此String对象添加到池中并String返回对此对象的引用。 它遵循对于任何两个字符串s和ts.intern()t.intern()是true当且仅当s.equals(t)是true。意味着如果s和t都是不同的字符串对象并且具有相同的字符序列则在两者上调用intern将导致由两个变量引用的单个字符串池文字。
典型考题
String s1 new String(ab) new String(c);
s1.intern();因为此时常量池没有abc会将s3指向常量abc
String s2 abc;
System.out.println(s1 s2);//true String s3 new String(de) new String(f);
String s4 def;
s3.intern();// 因为此时常量池有def不会将s3指向常量def
System.out.println(s3 s4);// false String s5 ghi;
String s6 new String(ghi);
s6.intern();// 因为此时常量池有ghi不会将s6指向常量ghi
System.out.println(s5 s6);//false
7.使用equals和进行字符串比较的差异 字串中equals是重写的一个方法比较字符串中value字符数组中字符是否一致即比较的是字符串的值不仅比较字符串的值而且还比较两个字符串所在内存地址是否相同。
8.String StringBuffer StringBuilder 三者各自线程安全性如何 String StringBuffer线程安全StringBuilder非线程安全。
9.String,StringBuffer以及StringBuilder之间的区别 String是值不可变类每次在String对象上的操作都会生成一个新的对象StringBuffer和StringBuilder则允许在原来对象上进行操作而不用每次增加对象StringBuffer是线程安全的但效率较低而StringBuilder效率最高但非线程安全。
10.如何连接多个字符串。 String通过解读Java API,可以知道Java为字符串连接运算提供特殊支持。 字符串连接是通过StringBuilder 或StringBuffer 类及其append方法实现的。 StringBuffer使用append实现 StringBuilder使用append实现。
11.如何分割一个String 可以使用字串分隔函数public String[] split(String regex)根据传入的正则字符串进行分割注意如果最后一位刚好有传入的字符返回数组最后一位不会有空字符串。
12.如何判断两个String是否相等 有两种方式判断字符串是否相等使用或者使用equals方法。当使用操作符时不仅比较字符串的值还会比较引用的内存地址。大多数情况下我们只需要判断值是否相等此时用equals方法比较即可。 还有一个equalsIgnoreCase可以用来忽略大小写进行字符串值比较。
13.String类中字符串长度是否有限制 可以看字符串类的源码字符串使用char数组存放字符该字符数组为定义最大长度故理论上来说String是没有长度限制的限制的是你的内存有多大。
14.Java String “”连接符拼接字符串原理 String字符串拼接通过StringBuilder走中间过程通过append方法实现。
程序有大量字符串拼接时建议直接StringBuilder实现就不需要底层new很多临时String对象了。注意null参与拼接时会变成字符串null。
相关问题持续更新汇总逐步添加代码及更详细的原理解析。