Java 字符串

一、String 类

1、创建对象

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
		/**
         * 1、使用String str1 = "hello";这种方式 
         *         第一次创建str1时,隐式的new一个字符串对象,在运行时常量池中开辟一个空间,来存放新创建的"hello"对象,str1中存放指向这个对象的引用
         *         第二次创建str2时,JVM会先在在常量池中查找是否存在相同的常量,若已经存在跟"hello"一样的对象,就直接引用了这个对象,如果没有还是会在运行时常量池中新new一个
         * 2、使用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;
    }

  

2、常用方法

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

 ##注意

str.indexOf(49) :0
这里的index(int)里的int值注意一下
贴一个链接,详细

3、String.format()方法

有两个重载:

String.format(String format, Object... args)
String.format(Locale locale, String format, Object... args)

重点提一下 format 参数的格式:

%[argument_index$][flags][width][.precision]conversion

1、%:必填

2、[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!
*/

  

3、[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

  

4、[width]最小宽度:  输出最小宽度,例如5

5、[.precision] :只有传入参数是浮点数时才有用,传入整数或者日期会抛异常(注意这里前面有个 . 

System.out.println(String.format("%,10.4f", 12345.6789456));//12,345.6789
System.out.println(String.format("%.2f", 12345.6789456));//12345.68

  

6、conversion转换格式 : 如上转换符所示,s/f等

转  换  符

说    明 

示    例

%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代表不同的日期与时间转换符

 

 

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

二、StringBuilder和StringBuffer

1、定义

可变字符串

2、String、StringBuilder和StringBuffer 异同

String:字符串常量,不可变,底层用于存放字符的数组是final的,因此只能赋值一次,不能再更改;

StringBuilder:字符串变量,线程不安全,也因此性能高一点,所以单线程操作大量数据就用这个;

StringBuffer:字符串变量,线程安全,可将字符串缓冲区安全的用于多个线程,所以多线程操作大量数据用这个;

3、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

  

-------------------------------------------------------------------------------------------------------------------------------------------------------------- 白云苍狗时光飞,嘻嘻哈哈一生追。哈!
原文地址:https://www.cnblogs.com/sangong/p/9440175.html