0


【JavaSE】String类

1.String类的介绍

在Java语言中,提供一个字符串类型,也就是String,但是它不同于int、char等基本数据类型

String是属于引用数据类型,只要是双引号修饰的字符串都是String对象

1.1 创建字符串

** 使用常量串构造 **

String s1 = "hello bit";

**直接newString对象 **

String s2 = new String("hello bit"); 

使用字符数组进行构造

char[] array = {'h','e','l','l','o','b','i','t'}; 

String类内部不存在字符串本身,其源码中含有value字符数组和hash成员变量

实际上字符串是存在char类型的数组中

1.2 字符串查找

方法

**功能 **

**char charAt(int index) **

返回index位置上字符,如果index为负数或者越界,抛出

IndexOutOfBoundsException异常

int indexOf(int ch)

返回ch第一次出现的位置,没有返回-1

int indexOf(int ch, int

fromIndex)

从fromIndex位置开始找ch第一次出现的位置,没有返回-1

int indexOf(String str)

返回str第一次出现的位置,没有返回-1

int indexOf(String str, int

fromIndex)

从fromIndex位置开始找str第一次出现的位置,没有返回-1

int lastIndexOf(int ch)

从后往前找,返回ch第一次出现的位置,没有返回-1

int lastIndexOf(int ch, int

fromIndex)

从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返 回-1

int lastIndexOf(String str)

从后往前找,返回str第一次出现的位置,没有返回-1

int lastIndexOf(String str, int fromIndex)

从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返 回-1

String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3)); // 'b'
System.out.println(s.indexOf('c')); // 6
System.out.println(s.indexOf('c', 10)); // 15
System.out.println(s.indexOf("bbb")); // 3
System.out.println(s.indexOf("bbb", 10)); // 12
System.out.println(s.lastIndexOf('c')); // 17
System.out.println(s.lastIndexOf('c', 10)); // 8
System.out.println(s.lastIndexOf("bbb")); // 12
System.out.println(s.lastIndexOf("bbb", 10)); // 3

1.3 转化

**数值和字符串转化 **

// 数字转字符串 
String s1 = String.valueOf(1234); 
String s2 = String.valueOf(12.34); 
String s3 = String.valueOf(true);
 String s4 = String.valueOf(new Student("Hanmeimei", 18));

// 字符串转数字  
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34"); 
System.out.println(data1);
System.out.println(data2);

大小写转换

方法

功能

String toUpperCase()

字符串转大写

String toLowerCase()

字符串转小写

String s1 = "hello"; String s2 = "HELLO"; 
// 小写转大写
 System.out.println(s1.toUpperCase());
// 大写转小写 
System.out.println(s2.toLowerCase());

**字符串转数组 **

String s = "hello"; 
// 字符串转数组
char[] ch = s.toCharArray(); 
for (int i = 0; i < ch.length; i++) {
 System.out.print(ch[i]);
}

格式化

public static void main(String[] args) {
 String s = String.format("%d-%d-%d", 2019, 9,14);
 System.out.println(s);
}

指定字符串替换

**方法 **

功能

String replaceAll(String regex, String replacement)

替换所有的指定内容

String replaceFirst(String regex, String replacement)

替换收个内容

String str = "helloworld" ; 
System.out.println(str.replaceAll("l", "_")); //he__o wor_d
System.out.println(str.replaceFirst("l", "_"));//he_lo world

1.4 字符串的拆分

方法

功能

String[] split(String regex)

将字符串全部拆分

String[] split(String regex, int limit)

将字符串以指定的格式,拆分为limit组

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

注:1. 字符"|","*","+"都得加上转义字符,前面加上 "\" .

  1. 而如果是 "" ,那么就得写成 "\\" .

3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

1.5 字符串截取

方法

功能

String substring(int beginIndex)

从指定索引截取到结尾

String substring(int beginIndex, int endIndex)

截取部分内容

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

1.6 去掉两边空格

**方法 **

**功能 **

String trim()

去掉字符串中的左右空格,保留中间空格

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

2.常量池

为了方便创建String对象,相同的值只储存一份,节省内存,共同访问

只要是双引号修饰的字符串都放入常量池中

Java中实现了常量池技术,除此之外,还有"内存池", "线程池", "数据库连接池"等池思想

设置有常量池的基本类型的包装类:

boolean、byte、short、integer、long、character

基本类型包装类没有设置常量池的:

float、double

String s1 = "hello"; 
String s2 = "hello"; 
String s3 = new String("hello"); 
String s4 = new String("hello"); 
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false 
System.out.println(s3 == s4); // false

String s1="hello";
String s2="hello";
String s3=new String("world");
String s4=new String("world");

使用intern将对象添加到常量池

intern 是一个native方法(Native方法指:底层使用C++实现的,看不到其实现的源代码),该方法的作用是手动将创建的String****对象添加到常量池中

public static void main(String[] args) {
    char[] ch = new char[]{'a', 'b', 'c'};
    String s1 = new String(ch); // s1对象并不在常量池中 
    //s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中 String s2 = "abc"; 
    // "abc" 在常量池中存在了,s2创建时直接用常量池中"abc"的引用 
    System.out.println(s1 == s2);
}

// 输出false 
// 将上述方法打开之后,就会输出true

String类的两种实例化方式

实例化方式产生实例化对象数是否入字符串常量池是否可以实现重用直接赋值(*String str = "hello"*一个自动加入字符串常量池可以重用*构造方法(*String str = new String("hello") *两个*不会自动入池,可以手工入池注入池中才可重用

3.字符串的不可变性

对字符串的操作,无论是字符串的拆分,大小写的转化、还是替换都是产生了新的对象

也就是说,String原来的对象并没有发生改变,因为String类在修饰时就是不可改变

其内部时通过final修饰的,意味着String类不能被继承

并且value字符数组本身也被final修饰,表明自身的值也是不能被修改的,即不能引用其他字符数

组,但是其引用空间中的内容可以修改

字符串中的引用空间中的内容不可通过外部修改,是因为String类中没有get set方法,并且value通过private修饰,不是由于final的原因

4.StringBuffer和StringBuilder

由于String类有不可变性,为了方便字符串的修改,Java提供了StringBuffer和StringBuilder

String和StringBuilder最大的区别在于*String的内容无法修改,而StringBuilder***的内容可 **以修改

频繁修改字符串的情况考虑使用StringBuilder.

两者的用法差不多,StringBuffer和String具有线程安全性,但StringBuilder没有

这两个类在String类的基础之上添加了比较重要的一个方法append

StringBuff append(String

str)

在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、flfloat、int、long、Object、String、StringBuffff的变量

char charAt(int index)

获取index位置的字符

int length()

获取字符串的长度

int capacity()

获取底层保存字符串空间总的大小

void ensureCapacity(int

mininmumCapacity)

扩容

void setCharAt(int index,

char ch)

将index位置的字符设置为ch

int indexOf(String str)

返回str第一次出现的位置

int indexOf(String str, int

fromIndex)

从fromIndex位置开始查找str第一次出现的位置

int lastIndexOf(String str)

返回最后一次出现str的位置

int lastIndexOf(String str,

int fromIndex)

从fromIndex位置开始找str最后一次出现的位置

StringBuffff insert(int

offffset, String str)

在offffset位置插入:八种基类类型 & String类型 & Object类型数据

StringBuffffer

deleteCharAt(int index)

删除index位置字符

StringBuffffer delete(int

start, int end)

删除[start, end)区间内的字符

StringBuffffer replace(int

start, int end, String str)

将[start, end)位置的字符替换为str

String substring(int start)

从start开始一直到末尾的字符以String的方式返回

String substring(int

start,int end)

将[start, end)范围内的字符以String的方式返回

StringBuffffer reverse()

反转字符串

String toString()

将所有字符按照String的方式返回

面试题

以下总共创建了多少个String对象

String str = new String("ab"); // 会创建2个对象 
String str = new String("a") + new String("b"); // 会创建6个对象

标签: java 开发语言

本文转载自: https://blog.csdn.net/m0_64332179/article/details/124768624
版权归原作者 诚挚的乔治 所有, 如有侵权,请联系我们删除。

“【JavaSE】String类”的评论:

还没有评论