认识 String 类

String

创建字符串

字符串比较相等

字符串不可变

字符串常见用法

StringBuffer 和 StringBuilder


String

Java 中数组,String,自定义的类都是引用类型

1、字符串常量是共享的(字符串常量池);
2、字符串不能变化,如果我们在字符串上做拼接,其实是产生了一个新字符串;
(String 一旦被创建,值不能被改变,如果参与了操作,引用发生了变化,不是在原有的字符串上操作,而是产生了一个字符串)

创建字符串

方式一:String str = "Hello Bit";
方式二:String str2 = new String("Hello Bit");

方式三:char[] array = {'a', 'b', 'c'};
	   String str3 = new String(array);
String()     //初始化一个新创建的 String对象
String(String original)
String(byte[] bytes)     
String(byte[] bytes,int offset,int length)
String(char[] value)
String(char[] value,int offset,int count)

内存布局:

String str1="Hello";

String str2=str1;

str1="world";

System.out.println(str2);

// 执行结果:Hello

// 只是让 str1 这个引用指向了一个新的 String 对象。

字符串比较相等

String 使用"==",并不是在比较字符串内容,而是比较两个引用是否是指向同一个对象

// 代码一:
String str1="hello";
String str2="hello";
System.out.println(str1==str2);

// 执行结果:true

然而:
// 代码二:
String str1=new String("hello");
String str2=new String("hello");
System.out.println(str1==str2);

// 执行结果:false

为什么两个代码结果不同?

代码一的内存布局:"Hello" 这样的字符串常量存储在字符串常量池中

代码二的内存布局:new String("Hello"); 在堆上开辟了空间来存储

缺点:

1、如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间(字符串常量 "hello" 是一个匿名对象,用了一次之后就不再使用了,就成为垃圾空间,会被 JVM 自动回收掉);

2、字符串共享问题同一个字符串可能会被存储多次,比较浪费空间。

可以手工入池:String str1=new String("hello").intern();   // 手动把String对象加入到字符串常量池中

面试题:请解释String类中两种对象实例化的区别

1、直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用;

2、构造方法:开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手工入池。

Java 中比较字符串的内容,必须采用String类提供的equals方法

String str1=new String("Hello");
String str2=new String("Hello");
System.out.println(str2.equals(str1));

// 执行结果:true

空字符串 与 null 的区别?

空字符串是有效的引用,有地址的,只不过是内容的长度是0;

null 这个引用是空引用,不能使用,使用一定会报空指针的错误。

字符串不可变

String str1="Hello";
str1=str1+" World";
str1 += "!!!";
System.out.println(str1);

// 执行结果:Hello World!!!

字符串常见用法

public String(char[] value)将字符数组中的所有内容变为字符串
public String(char[] value,int offset,int count)将部分字符数组中的内容变为字符串
public char charAt(int index)取得指定索引位置的字符,索引从0开始
public char[] toCharArray()将字符串变为字符数组返回
public boolean equals(Object anObject)区分大小写的比较
public boolean equalsIgnoreCase(String anotherString)不区分大小写的比较
public int compareTo(String anotherString)

比较两个字符串的大小关系

相等:返回0;

小于:返回内容小于0

大于:返回内容大于0

public boolean contains(CharSequence s)判断一个子字符串是否存在
public int indexOf(String str)从头开始查找指定字符串的位置,查到了返回此字符串第一次出现的索引,如果查不到返回 -1
public int indexOf(String str,int fromIndex)从指定位置开始查找子字符串位置
public String replaceAll(String regex,String replacement)替换所有的指定内容
public String replaceFirst(String regex,String replacement)替换首个内容(字符串是不可变对象,替换不修改当前字符串,而是产生一个新的字符串
public String[] split(String regex)将字符串全部拆分
public String[] split(String regex,int limit)将字符串部分拆分,该数组长度就是limit极限
public String substring(int beginIndex)从指定索引截取到结尾
public String substring(int beginIndex,int endIndex)截取部分内容:[beginIndex,endIndex)
public String trim()去掉字符串的左右两边空格,保留中间空格
public String toUpperCase()字符串转大写
public String toLowerCase()字符串转小写
public native String intern()字符串入池操作
public int length()取得字符串长度
public boolean isEmpty()判断是否为空字符串,但不是null,而是长度为0
Integer.parseInt()把 String 转换成 in

String str="aa.bb.cc";
str.substring(2,6);     只是拆分字符串,并没有给 str 赋值
System.out.println(str);
结果为:aa.bb.cc

ASCII 码:
数字:48~57
大写字母:65~90
小写字母:97~122 

StringBuffer 和 StringBuilder

任何字符串常量都是String对象,而且String的常量一旦声明不可改变,若改变对象内容,改变的是引用的指向而已。

StringBuffer sb=new StringBuffer();  // 初始容量 16 个字符,超出会自动扩容

可变字符串是线程安全的(StringBuffer 是线程同步的,线程安全)
(多个线程同时操作同一个资源的时候,可能发生数据安全性的问题)
但是,牺牲了性能。

s.append(数据);              // 在 s 后面追加
s.insert(int offset,数据);   // 在指定位置插入数据
s.delete(索引,索引);        // 删除指定的字符串开始索引到结束索引之间的字符串,[)闭开
s.reverse();               // 反转字符串

请解释 String、StringBuffer、StringBuilder 的区别:

String的内容不可修改,StringBuffer 与 StringBuilder的内容可以修改;

StringBuffer 采用同步处理,属于线程安全操作;

StringBuilder采用异步处理,属于线程不安全操。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值