Java String/StringBuffer/StringBuilder类的详细介绍 类方法的举例应用

3人阅读 评论(0) 收藏 举报
分类:

String类

1、string类的两种实例化方式

①直接赋值
String str1 = "Hello Bit" ; // str是一个对象,那么"Hello Bit" 就应该保存在堆内存中
String str2 = "hello Bit";
String str3 = "hello Bit";
System.out.println(str1 == str2);//true

这里写图片描述
String类的设计使用了共享设计模式
在JVM底层实际上会自动维护一个对象池(字符串对象池),如果采用直接复制的模式进行String类的对象实例化操作,那么该实例化对象(字符串)将自动保存到这个对象池中。如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将其保存在对象池之中供下次使用
所谓的对象池就是一个对象数组(目的就是减少开销)

②采用构造方法赋值
String str = new String("Hello Bit");// public String(String str);
System.out.println(str) ;
![这里写图片描述](http://img.blog.csdn.net/20180416111239903?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR3VpanVuNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

通过分析可知,如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间。除了这一缺点之外,也会对字符串共享产生问题。
例:观察字符串共享问题

// 该字符串常量并没有保存在对象池之中
String str1 = new String("hello") ;
String str2 = "hello" ;
System.out.println(str1 == str2); // false

在String类中提供有方法入池操作public String intern() ;
例:观察入池操作

String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2); // true

这里写图片描述

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

2、字符串的相等比较
例:观察字符串的“==”比较

String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1==str); // false

现在两个字符串内容相同,而使用“==“得到的结果不同。来看如下内存图分析:
这里写图片描述

“==”本身是进行数值比较的,如果现在用于对象比较,那么所比较的就应该是两个对象所保存的内存地址数值比较,而并没有比较对象的内容。

那么要想比较内容比较,则必须采用String类提供的equals方法。
例:使用equals方法比较字符串内容

String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1.equals(str));//true

String类”==”与”equals”的区别:

(a)”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
(b)“equals()”:可以进行字符串内容的比较

3、字符串常量

①字符串常量是String的匿名对象

在任何的语言的底层,都不会提供有直接的字符串类型。现在所谓的字符串只是高级语言提供给用户方便开发的支持而已。在java之中,本身也没有直接提供字符串常量的概念,所有使用" "定义的内容本质上来讲都是String的匿名对象。

例:观察字符串常量是一个String的匿名对象

String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1.equals(str));
System.out.println("Hello".equals(str));//建议这样比较,防止str为null时,str.equals("hello")就会崩溃

那么在之前出现的”String str = ”hello““,本质上就是将一个匿名的String类对象设置有名字,而且匿名对象一定保存在堆内存中。

②字符串常量不可更改

字符串一旦定义不可改变。所有的语言对于字符串的底层实现,都是字符数组,数组的最大缺陷就是长度固定。在定义字符串常量时,它的内容不可改变。

例:

String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str); // hello world!!!

这里是字符串对象str变更了指向空间,而原来的 “hello” 并没有改变
这里写图片描述

可以发现字符串上没有发生任何变化,但是字符串对象的引用一直在改变,而且会形成大量的垃圾空间。

4、String类的常用方法
①字符与字符串的相关方法
字符串就是一个字符数组,所以在String类里面支持有字符数组转换为字符串以及字符串变为字符的操作方法。
这里写图片描述

例:观察charAt()方法

String str = "hello" ;
System.out.println(str.charAt(0));
// 如果现在超过了字符串长度,则会产生StringIndexOutOfBoundsException异常
System.out.println(str.charAt(10));

例:字符串与字符数组的转换

String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;

// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换

②字节与字符串
字节常用于数据传输以及编码转换的处理之中,在String中提供有对字节的支持。
这里写图片描述
例:实现字符串与字节数组的转换处理

String str = "helloworld" ;
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {
data[i] -= 32 ;
System.out.print(data[i]+"、");
}
System.out.println(new String(data));

③字符串比较
上面使用过String类提供的equals()方法,该方法本身是可以进行区分大小写的相等判断。除了这个方法之外,String类还提供有如下的比较操作:
这里写图片描述
例:不区分大小写比较

String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:
相等:返回0         小于:返回内容小于0          大于:返回内容大于0。

例:观察compareTo()比较

System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
System.out.println("张".compareTo("李")); // -2094

④字符串查找
从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义
这里写图片描述
例:字符串查找,最好用最方便的就是contains()

String str = "helloworld" ;
System.out.println(str.contains("world")); // true

例:使用indexOf()方法进行位置查找

String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}

使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置。
indexOf()的其他版本

String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2
System.out.println(str.indexOf("l",5)); // 8
System.out.println(str.lastIndexOf("l")); // 8

例:判断开头或结尾

String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true

⑤字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
这里写图片描述
例:字符串的替换处理

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));

⑥字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
这里写图片描述
例:实现字符串的拆分处理

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}

例:字符串的部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}

以上的拆分形式都很容易。如果发现有些内容无法拆分开就需要使用”\”转义
例:拆分IP地址

String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
System.out.println(s);
}

例:多次拆分

String str = "yuisama:27|yui:25" ;
String[] result = str.split("\\|") ;
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split(":") ;
System.out.println(temp[0]+" = "+temp[1]);
}

⑦字符串截取
从一个完整的字符串之中截取出部分内容。可用方法如下:
这里写图片描述
例:观察字符串截取

String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));

⑧字符串其他操作方法
这里写图片描述
例:观察trim()方法的使用

String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");

例:大小写转换
这两个函数只转换字母

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());

例:字符串length()

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.length());

例:观察isEmpty()方法

System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());

例:自己实现首字母大写操作

public static void main(String[] args) {
System.out.println(fistUpper("yuisama"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
public static String fistUpper(String str) {
if ("".equals(str)||str==null) {
return str ;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1) ;
}
return str.toUpperCase() ;
}

StringBuffer类

例:观察StringBuffer使用

public class Test{
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("Hello").append("World");
        fun(sb);
        System.out.println(sb);
    }
    public static void fun(StringBuffer temp) {
        temp.append("\n").append("www.bit.com.cn");
    }
}
String和StringBuffer最大的区别在于:String的内容无法修改,StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。

为了更好理解String和StringBuffer,我们来看这两个类的继承结构:
这里写图片描述
可以发现两个类都是”CharSequence”接口的子类。这个接口描述的是一系列的字符集。所以字符串是字符集的子类,如果以后看见CharSequence,最简单的联想就是字符串。

注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuffer:利用StringBuffer的构造方法或append()方法。
StringBuffer变为String:调用toString()方法。

除了append()方法外,StringBuffer也有一些String类没有的方法:
例:字符串反转方法:
public synchronized StringBuffer reverse();

StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());

例:删除指定范围的数据
public synchronized StringBuffer delete(int start, int end);

StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10));

例:插入数据
public synchronized StringBuffer insert(int offset, 各种数据类型 b);

StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "你好"));

解释String、StringBuffer、StringBuilder的区别:

 (a) String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。
 (b) StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作。
查看评论

Java中String,StringBuffer,StringBuilder常用方法及使用实例

package stringtest; public class StringOpera { public static void main(String[] args) { Strin...
  • u012768347
  • u012768347
  • 2017-03-12 16:33:49
  • 891

String,StringBuffer, StringBuilder类的常用方法

一、String类的常用方法1.获取: 1)获取字符串str长度 int i = str.length(); 2)根据位置(ind...
  • zhao_yu_lei
  • zhao_yu_lei
  • 2017-05-12 13:38:09
  • 1934

java中的StringBuilder类的使用, String、StringBuilder、StringBuffer的区别

一、String 和 StringBuilder、StringBuffer的区别一:string是不可变序列,StringBuilder和StringBuffer是可变序列。 1、而StringBui...
  • Iloveyougirls
  • Iloveyougirls
  • 2016-09-17 11:16:04
  • 509

Java String为什么是不可变类,StringBuffer与StringBuilder区别

熟悉Java的都知道String类是不可变,但String类为什么设计成不可变类,如何做到不可变没有仔细想过。 String为什么设计成不可变类? 1.Java字符串池的设计方式。     Strin...
  • chenchaofuck1
  • chenchaofuck1
  • 2016-03-10 15:15:09
  • 2288

Java中String、StringBuffer、StringBuilder简述及区别

容我喝杯82年的Java压压惊~~~如有欢迎指正。 1.String:由多个字符组成的一串数据,相当与...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016-05-10 23:35:30
  • 1607

JAVA之String,StringBuffer与StringBuilder三者之间的区别

JAVA之String,StringBuffer与StringBuilder三者之间的区别
  • mmd0308
  • mmd0308
  • 2017-06-16 16:37:55
  • 792

String/StringBuffer/StringBuilder详细对比

众所周知,String是由字符组成的串,在程序中使用频率很高。Java中的String是一个类,而并非基本数据类型。 不过她却不是普通的类哦!!!   【镜头1】 String对象的创建 ...
  • ls5718
  • ls5718
  • 2016-07-13 16:12:25
  • 1297

String、StringBuffer、StringBuilder相同与不同

相同: 1、都是处理字符串的类。 2、变成中都经常用到。 3、底层数据结构都是char[],即字符数组。 不同: 1、String是字符串常量,不可改变。StringBuffer、S...
  • qq_23617681
  • qq_23617681
  • 2016-03-07 21:26:09
  • 535

java面试题String,StringBuilder,StringBuffer

String StringBuffer StringBuilder面试题
  • dfdsggdgg
  • dfdsggdgg
  • 2016-05-09 22:39:23
  • 3040

String类,Stringbuilder类,Stringbuffer类之间的区别

String 类型最大的特点是 String 是不可变的对象,因此我们每次对String进行操作,都是生成一个新的 String 对象,然后指针指向新生成的String对象,所以面对那些需要经常修改的...
  • qq_29882585
  • qq_29882585
  • 2016-08-13 11:47:00
  • 404
    个人资料
    等级:
    访问量: 1447
    积分: 185
    排名: 106万+
    文章分类