1、String 类
一、建立对象
public static void main(String[] args){ String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = new String("hello"); System.out.println(str1 == str2);//true System.out.println(str1 == str3);//false System.out.println(str3 == str4);//false /** * 一、使用String str1 = "hello";这种方式 * 第一次建立str1时,隐式的new一个字符串对象,在运行时常量池中开辟一个空间,来存放新建立的"hello"对象,str1中存放指向这个对象的引用 * 第二次建立str2时,JVM会先在在常量池中查找是否存在相同的常量,若已经存在跟"hello"同样的对象,就直接引用了这个对象,若是没有仍是会在运行时常量池中新new一个 * 二、使用String str3 = new String("hello");这种 * 无论堆里面有没有一样的对象,都会在堆内存中新建一个对象,因此str3 和 str4 总会是false */ System.out.println(str1.equals(str3));//true System.out.println(str3.equals(str4));//true //String类中已经把equals方法重写过了,比较的是具体的值 /** *String拼接 */ String s1 = "a"+"b"+"c"; String s2 = "abc"; String s3 = "ab"; String s4 = s3 + "c"; System.out.println(s1==s2);//true System.out.println(s2 == s4);//false //先在常量池中建立 abc ,地址指向 s1,也指s2, 再建立 ab ,指向 s3,再建立s4, //对于 s4,实际上是先建立StringBuilder(或 StringBuffer)对象,经过 append 链接获得 abc ,再调用 toString() 转换获得的地址指向 s3。 //因此(s4==s2) 为 false }
String重写的equals方法
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
二、经常使用方法
str : "1abc1239" str.length() :8 str.indexOf("a") :1 str.indexOf('b') :2 str.indexOf(49) :0 str.substring(3) :c1239 str.substring(2, 5) :bc1 str.trim() :1abc1239 str.equals("abc123") :false str.equals("abc123") :false str.toLowerCase() :1abc1239 str.toUpperCase() :1ABC1239 str.charAt(2) :b str.split("c", 2) : 1ab 1239 str.split("c", 1) : 1abc1239 str.getBytes() : 49 97 98 99 49 50 51 57
##注意html
str.indexOf(49) :0
这里的index(int)里的int值注意一下
贴一个连接,详细
三、String.format()方法
有两个重载:java
String.format(String format, Object... args)
String.format(Locale locale, String format, Object... args)
重点提一下 format 参数的格式:
%[argument_index$][flags][width][.precision]conversion数组
一、%:必填
二、[argument_index$]:从1开始取值,表示的是拿后面的args中的第几个参数来格式化,默认是按照参数顺序输出
System.out.println(String.format("你好,这是%s,那是%s!", "anna","beta"));//默认按顺序 System.out.println(String.format("你好,这是%2$s,那是%1$s!", "anna","beta"));//按照自定义的顺序
/**
* 你好,这是anna,那是beta! 你好,这是beta,那是anna!
*/
三、[flags]标识:控制输出格式,好比左对齐,三个数用逗号隔开,少位补0等
- '-' 在最小宽度内左对齐,不能够与"用0填充"同时使用
- '#' 只适用于8进制和16进制,8进制时在结果前面增长一个0,16进制时在结果前面增长0x
- '+' 结果老是包括一个符号(通常状况下只适用于10进制,若对象为BigInteger才能够用于8进制和16进制)
- ' ' 正值前加空格,负值前加负号(通常状况下只适用于10进制,若对象为BigInteger才能够用于8进制和16进制)
- '0' 结果将用零来填充
- ',' 只适用于10进制,每3位数字之间用","分隔
- '(' 若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(同'+'具备一样的限制)
System.out.println(String.format("%-3d", 123456789));//123456789 System.out.println(String.format("%011d", 123456789));//00123456789 System.out.println(String.format("%#o", 123456789));//0726746425 System.out.println(String.format("%#x", 123456789));//0x75bcd15 System.out.println(String.format("%+d", 123456789));//+123456789 System.out.println(String.format("%(d", -123456789));//(123456789) System.out.println(String.format("%,d", 123456789));//123,456,789
四、[width]最小宽度: 输出最小宽度,例如5
五、[.precision] :只有传入参数是浮点数时才有用,传入整数或者日期会抛异常(注意这里前面有个 . )
System.out.println(String.format("%,10.4f", 12345.6789456));//12,345.6789 System.out.println(String.format("%.2f", 12345.6789456));//12345.68
六、conversion转换格式 : 如上转换符所示,s/f等
转 换 符安全 |
说 明 多线程 |
示 例app |
%s性能 |
字符串类型ui |
"mingrisoft"this |
%cspa |
字符类型 |
'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表明不一样的日期与时间转换符
|
conversion差很少看看就行,应该用得多的也就 s/f 啥的
参考文档:
https://blog.csdn.net/jiangyu1013/article/details/52607257
http://kgd1120.iteye.com/blog/1293633
http://www.runoob.com/java/java-string.html
2、StringBuilder和StringBuffer
一、定义
可变字符串
二、String、StringBuilder和StringBuffer 异同
String:字符串常量,不可变,底层用于存放字符的数组是final的,所以只能赋值一次,不能再更改;
StringBuilder:字符串变量,线程不安全,也所以性能高一点,因此单线程操做大量数据就用这个;
StringBuffer:字符串变量,线程安全,可将字符串缓冲区安全的用于多个线程,因此多线程操做大量数据用这个;
三、StringBuffer经常使用方法
两个可变字符串差很少,最重要的是 toString() 方法,转换成 String 类型;
StringBuffer sb = new StringBuffer(); sb.append("abc123"); System.out.println(sb.toString());//abc123 sb = sb.reverse(); System.out.println(sb.toString());//321cba