String
String
为类
比较
每个新对象有自己的地址,==
比较对象的地址。
用equals()
比较String
对象内容
"".equals("")
字符串常量池
- 使用字面量(String s=”1”;)创建字符串常量时,
JVM
会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就将此字符串对象的地址赋值给引用s。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中,并将此字符串对象的地址赋值给引用s。 - 使用关键字new(String s=new String(”1”);)创建字符串常量时,
JVM
会首先检查字符串常量池,如果该字符串已经存在常量池中,那么不再在字符串常量池创建该字符串对象,而直接堆中复制该对象的副本,然后将堆中对象的地址赋值给引用s,如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中,然后在堆中复制该对象的副本,然后将堆中对象的地址赋值给引用s。
String.intern()解析
String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,源码注释:当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的引用。
初始化
返回值类型 | 方法 | 说明 |
---|---|---|
String | String(…) | 生成字符串对象 |
初始化方法可以为空,String,char[],byte[],StringBuffer,StringBuilder。
byte[]初始化方法可以设定编码,偏移量,byte长度
实例方法
返回值类型 | 方法 | 说明 |
---|---|---|
int | length() | 字符串长度 |
boolean | isEmpty() | 是否为空 |
char | charAt(int index) | 对应位置的字符 |
int | codePointAt(int index) | 对应位置的字符的Unicode码 |
int | codePointBefore(int index) | 对应位置前一个字符的Unicode码 |
void | getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) | 将字符串的一部分拷贝到dst字符数组指定位置 |
byte[] | getBytes(空/String/Charset) | 获取指定编码的字节数组,参数为编码 |
boolean | equals(Object) | 比较对象是否相同 |
boolean | contentEquals(CharSequence/StringBuffer) | 内容比对,若是String调用equals |
boolean | equalsIgnoreCase(String anotherString) | 忽略大小写进行比较 |
int | compareTo(String anotherString) | |
int | compareToIgnoreCase(String str) | |
boolean | regionMatches(int toffset, String other, int ooffset, int len) | 判断两字符串在一个区域内是否相等 |
boolean | regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) | equalsIgnoreCase中调用的方法,忽略大小写进行区域比较 |
boolean | startsWith(String prefix [, int toffset*]*) | 检测字符串是否以指定的前缀开始 |
boolean | endsWith(String suffix) | 检测字符串是否以指定的后缀结束 |
int | indexOf(…) | 某字符串开始位置,可加偏移量 |
int | lastIndexOf(int ch, int fromIndex) | 某字符串最后出现位置 |
String | substring(int beginIndex*[, int endIndex]*) | 字符串截取 |
String | concat(String str) | 返回拼接字符串,不改变原字符串,同+ |
String | replace(…) | 替换全部字符或字符串 |
replaceFirst(String regex, String replacement) | ||
replaceAll(String regex, String replacement) | ||
String[] | split() | 分割 |
String | String.join(CharSequence delimiter, CharSequence… elements) | 在后面字符数组中插入间隔符生成字符串 |
toLowerCase | ||
toUpperCase | ||
trim | 去除空格 | |
strip | 去除空格(包括Unicode) | |
stripLeading | 去除前面的空格 | |
stripTrailing | 去除后面的空格 | |
boolean | isBlank | 是否是空白或都是空格 |
Stream | lines() | 按行分割的流 |
IntStream | chars | char值字符流 |
codePoints | Unicode字符流 | |
char[] | toCharArray() | 返回字符数组 |
String | String.format | 内容通过格式转换类似C的printf,转换表见下面 |
String | String.valueOf | 对象的值 |
String | String.copyValueOf | 拷贝字符数组的值 |
native String | intern() | 返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后 返回引用。 |
String | repeat(int count) | 重复 |
转 换 符 | 说 明 | 示 例 |
---|---|---|
%s | 字符串类型 | “mingrisoft” |
%c | 字符类型 | ‘m’ |
%b | 布尔类型 | true |
%d | 整数类型(十进制) | 99 |
%x | 整数类型(十六进制) | FF |
%o | 整数类型(八进制) | 77 |
%f | 浮点类型 | 99.99 |
%a | 十六进制浮点类型 | FF.35AE |
%e | 指数类型 | 9.38e+5 |
%g | 通用浮点类型(f和e类型中较短的) | |
%h | 散列码 | |
%% | 百分比类型 | % |
%n | 换行符 | |
%tx | 日期与时间类型(x代表不同的日期与时间转换符 |
String str=null;
str=String.format("Hi,%s", "王力");
System.out.println(str);
str=String.format("Hi,%s:%s.%s", "王南","王力","王张");
System.out.println(str);
System.out.printf("字母a的大写是:%c %n", 'A');
System.out.printf("3>7的结果是:%b %n", 3>7);
System.out.printf("100的一半是:%d %n", 100/2);
System.out.printf("100的16进制数是:%x %n", 100);
System.out.printf("100的8进制数是:%o %n", 100);
System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);
System.out.printf("上面价格的16进制数是:%a %n", 50*0.85);
System.out.printf("上面价格的指数表示:%e %n", 50*0.85);
System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);
System.out.printf("上面的折扣是%d%% %n", 85);
System.out.printf("字母A的散列码是:%h %n", 'A');