Java中String类和字符串常量池以及相关面试题

常见的构造 String 的方式
方式一 String str = “Hello”;
方式二 String str2 = new String(“Hello”);
方式三 char[] array = {‘a’, ‘b’, ‘c’};
String str3 = new String(array);

Java 中数组, String, 以及自定义的类都是引用类型

关于对象的比较
面向对象编程语言中, 涉及到对象的比较, 有三种不同的方式, 比较身份, 比较值, 比较类型. 在大部分编程语言中 == 是用来比较比较值的. 但是 Java 中的 == 是用来比较身份的.
Java 中要想比较字符串的内容, 必须采用String类提供的equals方法
String str = null;
方式一 System.out.println(str.equals(“Hello”)); // 执行结果 抛出 java.lang.NullPointerException 异常
方式二 System.out.println(“Hello”.equals(str)); // 执行结果 false
建议使用方法2
字符串常量池

在JVM底层实际上会自动维护一个对象池(字符串常量池) 如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存 到这个对象池之中. 如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用 如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用。

**面试题:**请解释String类中两种对象实例化的区别

  1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
  2. 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用 intern()方法手工入池

理解字符串不可变
字符串是一种不可变对象. 它的内容不可改变. String 类的内部实现也是基于 char[] 来实现的, 但是 String 类并没有提供 set 方法之类的来修改内部的字符数组.
常见办法: 借助原字符串, 创建新的字符串。

为什么 String 要不可变?(不可变对象的好处是什么?)

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.

常用的String类中的方法:
1,string类是被final修饰 不可以被继承,
2,String中的获得字符串长度,不是String类的属性而是String类的一个方法
3, 里面有一个不可变的数组value,只能对其初始化一次
4,isEmpty() 判空
5,charAt(int index) 获得index下标的字符
6,equals(Object anObject) 判断两个字符串的内容是否相等
7,indexOf(int ch) 返回ch 第一次出现的下标
8,indexOf(int ch, int from)
9, substring(int beginIndex) 从beginIn dex 截到末尾
10,replace(String old,String newString) 返回一个新字符串,把原来的字符串中的old替换为newString
11,contains(charSequence) 包含 返回boolean值
12,split(",") 按逗号切割 返回一个字符串数组
13, trim() 去除首位空格 不去掉中间空格
14,toString()
15,toCharArray() 返回新字符数组 里面是不可变的value的数组内容
16,equalsIgnoreCase()忽略大小写 判断是否相等
17,lasstIndexOf()从后面向前找 找到第一个出现index的下标
18,toLowerCase() 转小写字符串 返回新的字符串
19,toUpperCase() 转大写
20,String.valueOf(a) 把a转化为字符串
返回值 为 string 的 对象 不会入池

发布了55 篇原创文章 · 获赞 85 · 访问量 5124

猜你喜欢

转载自blog.csdn.net/lzh_99999/article/details/104049710