Java 常用类 String
String 类简介
-
String 对象用于保存字符串,也就是一组字符序列
-
字符串常量对象是用双引号括起来的字符序列,例如:"你好", "12.3","boy"等
-
字符串的字符使用 Unicode 字符编码,一个字符(不区分汉字还是字母)占两个字节
-
String 类较常见的构造方法
String s1 = new String(); String s1 = new String(String orginal); String s1 = new String(char[] a); String s1 = new String(char[] a, int startIndex, int count); String s1 = new String(byte[] b);
-
String 类实现了接口 Serializable 【String 可以串行化——在网络传输】,接口 Comparable 【String 对象可以比较大小】
-
String 是 final 类,不能被其他类继承
-
String 有属性,
private final char value[];
用于存放字符串内容 -
一定要注意:value 是一个final 类型,不可以修改
创建 String 对象
方式一:直接赋值
String s1 = "hsp";
方式二:调用构造器
String s2 = new String("hello");
区别:
方式一:先从常量池查看是否有"hello" 数据空间,如果有,直接指向;如果没有则重现创建,然后指向,s1最终指向的是常量池的空间地址
方式二:现在队中创建,里面维护了value 属性,指向常量值的 "hello" 空间,如果常量池没有 "hello",重新创建,如果有,直接通过 value 指向。s2最终指向的堆中的空间地址
两种方式的内存分布图如下
练习题
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); // true 比较字符串内容
System.out.println(a == b); // true
String a = "hello"; // a 指向常量池的 "hello"
String b = new String("hello"); // b 指向堆总的对象,堆中对象的value指向常量池的"hello"
System.out.println(a.equals(b)); // true
System.out.println(a == b); // false
System.out.println(a == b.intern()); // true
System.out.println(b == b.intern()); // false
注意:当调用 intern 方法,如果池中已经包含一个等于此 String 对象的字符串equals(Object)
方法确),则返回池中的字符串。否则,将此String 对象添加到池中,并返回此 String 对象的引用
解读:b.intern()
方法最终返回的是常量池的地址(对象)
字符串的特性
-
String 是一个 final 类,代表不可变的字符序列
-
字符串是不可变的,一个字符长对象一旦被分配,其内容是不可变的
参考博客 java中为啥String是不可变的
练习题1:
String s1 = "hello";
s1 = "haha";
// 问:创建了几个对象?
// 答:2个
练习题2:
String a = "hello" + "abc";
// 问:创建了几个对象?
// 答:只有一个对象
// (1) 编译器做了优化,判断创建的常量池对象,是否有引用指向
// (2) String a = "hello" + "abc" ==> String a = "helloabc"
String a = "hello";
String b = "abc";
String c = a + b;
// 问:创建了几个对象?
// 答:3个
/*
(1) 先创建了StringBuilder sb = new StringBuilder()
(2) 执行 sb.append("hello")
(3) sb.append("abc")
(4) String c = sb.toString() // toString() 方法会new一个String对象
*/
String d = "helloabc";
System.out.println(c == d); // false
小结:String c = "ab" + "cd;"
常量相加,看的是池,String c = a + b;
变量相加,是在堆中
练习题3
public class Test1 {
String str = new String("abc");
final char[] ch = {'j', 'a', 'v', 'a'};
public void change(String str, char[] ch) {
str = "java";
ch[0] = 'h';
}
public static void main(String[] args) {
Test1 ex = new Test1();
ex.change(ex.str, ex.ch);
System.out.println(ex.str + " and");
System.out.println(ex.ch);
}
}
String 类的常见方法
说明:String 类是保存字符串常量的,每次更新都需要重新开辟空间,效率较低,一次 java 设计者还提供了 StringBuilder 和 StringBuffer 来增强 String 的功能,并提高效率。
// 效率太低
String s = new String("");
for (int i = 0; i < 80000; i++) {
s += "hello ";
}
char charAt(int index)
int compareTo(String anotherString)
int compareToIgnoreCase(String str)
String concat(String str)
boolean equals(Object anObject)
boolean equalsIgnoreCase(String anotherString)
static String format(String format, Object... args)
int indexOf(String str)
boolean isEmpty()
static String join(CharSequence delimiter, CharSequence... elements)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
int length()
String replace(char oldChar, char newChar)
String[] split(String regex)
String substring(int beginIndex, int endIndex)
char[] toCharArray()
String toLowerCase()
String toUpperCase()
String trim()
标签:Java,String,int,str,println,new,hello,复习
From: https://www.cnblogs.com/ai135/p/17518881.html