java常见字符串问题

最近很多学习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和t,s.intern()==t.intern()是true当且仅当s.equals(t)是true。意味着如果s和t都是不同的字符串对象并且具有相同的字符序列,则在两者上调用intern()将导致由两个变量引用的单个字符串池文字。

典型考题:

 
  1. String s1 = new String( "ab") + new String( "c");
  2. s1.intern();因为此时常量池没有 "abc",会将s3指向常量 "abc"
  3. String s2 = "abc";
  4. System.out.println(s1 == s2); //true
  5. String s3 = new String( "de") + new String( "f");
  6. String s4 = "def";
  7. s3.intern(); // 因为此时常量池有"def",不会将s3指向常量"def"
  8. System.out.println(s3 == s4); // false
  9. String s5 = "ghi";
  10. String s6 = new String( "ghi");
  11. s6.intern(); // 因为此时常量池有"ghi",不会将s6指向常量"ghi"
  12. 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"。

全部评论

相关推荐

点赞 评论 收藏
分享
今天 17:51
已编辑
长沙学院 Java
个人背景:学院二本计科专业 大二开始实习个人经历:安克创新 、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps: 很多人会问我学习路线和经验 但是就像我上面说的 我的实习过程靠的很多是关键节点的运气 技术上面我可能不如很多人  所以请大家理性求助和理性参考我的回答 附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务