首页 / JAVA / Java中的String类笔记
Java中的String类笔记
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的String类笔记,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3362字,纯文字阅读大概需要5分钟。
内容图文
![Java中的String类笔记](/upload/InfoBanner/zyjiaocheng/604/2c4fe687d4be4ca8a170f9f5fb443a01.jpg)
说明
源码
//jdk8
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
......
}
1.String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。在早期的JVM实现版本中,被final修饰的方法会被转为内嵌调用以提升执行效率。而从Java SE5/6开始,就渐渐摈弃这种方式了。因此在现在的Java SE版本中,不需要考虑用final去提升方法调用效率。只有在确定不想让该方法被覆盖时,才将方法设置为final。
2.从上面可以看出String类其实是通过char数组来保存字符串的。
string的创建方法方法
String str = "ash";//双引号创建
String str2=new string("ash");//用构造函数创建
注意:String直接创建的字符串存储在公共池中,而new的字符串对象在堆上。
常用的string方法
搜索子串
"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
提取子串
//注意索引号是从0开始的。
"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"
无论是substring、concat还是replace操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。也就是说进行这些操作后,最原始的字符串并没有被改变。
??在这里要永远记住一点:
“对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”。
面试题
- 下面这段代码输出结果为
String a = "hello2";
String b = "hello";
String c = "hello" + 2;
String d = b + 2;
System.out.println((a == c));
System.out.println((a == d));
true //"hello"+2在编译期间就已经被优化成"hello2",因此在运行期间,变量a和变量c指向的是同一个对象。
false //d在堆上生成的新的对象,a和d指向的对象不同。
- 下面这段代码输出结果为
public class Main {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
public static String getHello() {
return "hello";
}
}
true
??注意:被final修饰的变量,会在class文件常量池中保存一个副本,这时String c = b + 2
等同于String c = "hello" + 2
,所以为true。
- 下面这段代码的输出结果是什么?
public class Main {
public static void main(String[] args) {
String a = "hello";
String b = new String("hello");
String c = new String("hello");
String d = b.intern();
System.out.println(a==b);
System.out.println(b==c);
System.out.println(b==d);
System.out.println(a==d);
}
}
false
false
false
true
??前三个很简单,第四个当调用intern方法时,如果池中已经包含一个字符串,该字符串与equals(object)方法确定的string对象相等,则返回池中的字符串。
String str = new String("abc")
创建了多少个对象?
首先必须弄清楚创建对象的含义,创建是什么时候创建的?这段代码在运行期间会创建2个对象么?毫无疑问不可能,用javap -c反编译即可得到JVM执行的字节码内容:
??很显然,new只调用了一次,也就是说只创建了一个对象。
??而这道题目让人混淆的地方就是这里,这段代码在运行期间确实只创建了一个对象,即在堆上创建了"abc"对象。而为什么大家都在说是2个对象呢,这里面要澄清一个概念 该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象。
??因此,这个问题如果换成 String str = new String(“abc”)涉及到几个String对象?合理的解释是2个。
??个人觉得在面试的时候如果遇到这个问题,可以向面试官询问清楚”是这段代码执行过程中创建了多少个对象还是涉及到多少个对象“再根据具体的来进行回答。
参考(不按先后)
廖雪峰的官方网站·字符串和编码
探秘Java中的String、StringBuilder以及StringBuffer
内容总结
以上是互联网集市为您收集整理的Java中的String类笔记全部内容,希望文章能够帮你解决Java中的String类笔记所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。