Java10:字符串String

Ⅰ String

String 底层是一个 char 类型的数组。
String是不可变类型,是因为String类利用了final修饰的byte类型数组存储字符:

   @Stable
    private final byte[] value;

注意:

  • 反射可以修改String,用反射访问私有成员, 然后反射出String对象中的value属性, 进而通过改变value引用改变数组的结构。
  • String 类是 final 类,不可以被继承。
1 创建字符串的方式

(1)三种构造方法

//创建一个空白字符串
public String();
//根据字符数组的内容,来创建字符串
public String(char[] array);
//根据字节数组的内容,来创建字符串
public String(byte[] array);

(2)一种直接创建

String str = "hello";
public static void main(String[] args){
	String str1 = new String("hello");
	char[] charArray = {'h','e','l','l','o'};
	String str2 = new String(charArray);
	byte[] byteArray = {97, 98, 99 };
	String str3 = new String(byteArray);
	String str4 = "hello";
}
2 字符串常量池

程序中直接写上双引号字符串,就在字符串常量池中。

  • 对于基本类型来说,== 是进行数值比较;
  • 对于引用类型来说,== 是进行地址值比较;
3 字符串常用操作
(1)手动入池:

String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。

我们可以采用手动入池:intern入池操作,会先检查常量池中是否有str3对应的”hello”,若没有则直接创建,并返回常量池中”hello”的引用。若存在,则直接返回常量池中”hello”的引用。

String str3 = new String("hello").intern();
(2)内容比较:

为避免null异常,要将常量"hello"放到前面
"hello".equals(str)):字符串内容比较
"hello".equalsIgnoreCase(str):忽略大小写进行比较
str.compareTo(str):比较两个字符串大小关系,返回大于1,小于-1,相等0

(3)字符串获取:

str.length():获取字符串长度
str1.concat(str2):将str1与str2字符串进行拼接,返回新字符串
str.charAt(index):返回指定索引位置的字符
str.substring(2):从2处截取到字符串末尾
str.substring(2,4):从2处截取到4(不包含4)

(4)字符串与字符数组的转换:

str.toCharArray():返回字符数组char[ ]
str.getBytes():返回字节数组byte[ ]
String.copyValueOf(arrays): 字符数组转字符串

//字符数组转字符串的两种方式
char[] arrays = {'a','b','g'};
String ret = new String(arrays);
//或
String.copyValueOf(arrays);
(5)字符串的分割:

"aaa,bbb,ccc".split(","):将"aaa,bbb,ccc"按照“,”分割成多个部分,返回字符串数组String[ ]
str.split(" ",5):将str按空格分割为字符串数组,限制字符串数组长度为5

注意:
"aaa.bbb.ccc".split("\\."):切割英文句点必须写"\."
\表示对\进行转义,\.表示对一个斜杠转义后,再对.进行转义

(6)字符串查找

str.contains(str1):判断字符串是否包含str1,包含返回true
str.indexOf("he"):查找"he"在str中出现的第一次索引位置
str.indexOf("he",2):从2处开始查找"he"在str中出现的第一次索引位置
str.lastIndexOf(str1):从后向前查找字符串位置
str.lastIndexOf(str1,2):由2处从后向前查找字符串位置
str.startsWith(str1):判断是否以指定字符串开头
str.startsWith(str1,2):从2出开始判断是否以指定字符串开头
str.endsWith(str1):判断是否以指定字符串结尾

(7)字符串替换

str.replaceAll("1","2"):将字符串str中的1全部替换为2
str.replaceFirst("1","2"):将字符串str中的第一个1替换为2
str.replace(old,new):将str中的old字符串换为new字符串
等同于str.replaceAll(old,new);

注意:
字符串为不可变对象,替换不修改当前对象,而是产生了一个新的字符串

(8)其他

str.trim():去掉字符串的左右空格,保留中间空格
str.toUpperCase :字符串转大写
str.toLowerCase:字符串转小写
str.intern():字符串入池操作
str1.concat(str2):字符串拼接相当于+,不入池
str.length():获取字符串长度
str.isEmpty:判断是否为空字符串(长度为0)

(9)(数字)字符串转int

(1)static Integer valueOf(String s) 返回一个 Integer对象,保存指定的值为 String 。

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
 public static void main(String[] args) {
        String[] nums={"5","7"};
        int gg = Integer.valueOf(nums[1]);
        System.out.println(gg);//7
    }

String.valueOf(int num); 数字转字符串

       String ret="";
       ret += ""+5;
       ret+=String.valueOf(5);

(2)static int parseInt(String s) 将字符串参数解析为带符号的十进制整数。

int a = Integer.parseInt("54");
int b = Integer.valueOf("54");
System.out.println(a);//54
System.out.println(b);//54

(3)char类型的数字和int类型之间的转换:

String str = "789";
int a = '5'-'0';//'5'-48也可以转为int
int b = str.charAt(0)-'0';
System.out.println(a);//5
System.out.println(b);//7

(4) String格式化format

int num=9;
String ret = String.format("%02d",num);//09

注意:

  • " " +任何类型 返回的都是字符串
4 使用 HashMap 的时候,用 String 做 key 有什么好处?

HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算哈希值,所以相比于其他对象更快。

Ⅱ StringBuffer和StringBuilder

(1)StringBuffer和StringBuilder是可变的?

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字节数组保存字符串。

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    byte[] value;
(2)StringBuilder与StringBuffer的区别:

StringBufferStringBuilder功能相同,唯一的区别是StringBuffer是线程安全的;即其所有的内置函数都被关键字synchronized修饰。

  • StringBuffer的安全性高,效率低。
  • StringBuilder安全性低,效率高。
  • String的内容不可修改,StringBuffer、StringBuilder的内容可以进行修改。

String和StringBuffer类不能直接转换,要转换可采用如下原则

  • String转StringBuffer:可通过StringBuffer的构造方法append()方法
StringBuffer str = new StringBuffer("hello");
str.append("world").append("!!!");
  • StringBuffer转String:调用toString()方法
StringBuffer str = new StringBuffer("hello");
String str1 = str.toString();
(3)StringBuffer和StringBuilder的常用方法相同:
  1. append()方法:可以向StringBuffer中添加各种数据,boolean, char, char[], double, float, int, long,Object, String, StringBuffer.
  2. charAt()
  3. delete(int start, int end): 删除指定范围的字符
  4. deleteCharAt(int index): 删除指定位置的字符
  5. indexOf(String str): 返回指定字符串第一次出现的索引
  6. public synchronized StringBuffer insert(int offset,各种类型数据 b);
  7. length();
  8. reverse(): 反转
  9. setLength(int newLenth): 设定StringBuffer的长度,常用来清空StringBuffer
  10. toString()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值