String类及相关各种方法

String类的两种实例化方式
  • a.直接赋值
String str = "Hello";
//直接赋值,在堆上分配空间
  • b.传统方法(构造方法实例化)
String str1 = new String("hello");
字符串相等比较
  • 采用String类提供的equals方法
public boolean  equals(String.anotherString)
//成员方法(通过对象调用:对象.equals)

eg:str1.equals(anotherString)

在这里插入图片描述

解释String类“==”与“equals”的区别

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

  • 字符串常量是String类的匿名对象
  • 那么在之前出现的String str = “hello”,本质上就是讲一个匿名的String类对象设置有名字,而且匿名对象一定保存在堆内存中
  • 小tips:在以后开发中,如果要判断用户输入的字符串是否等同于特定字符串,一定要将特定字符串(String常量)写在前面,避免NullPointerException
String str2 = null;
System.out.println("hello".equals(str2));
//任何的字符常量都是String的匿名对象,所以该对象永远不会为null
String类两种实例化区别
  • 采用直接赋值,没有开辟新的堆空间
    在这里插入图片描述
    在这里插入图片描述

  • 为什么没有开辟堆内存空间呢

  • JVM底层会自动维护一个字符串的对象池,如果现在采用直接赋值的形式进行String的对象实例化,该对象会自动保存在这个对象池中。如果下次继续使用直接赋值的模式声明String对象,此时对象池中若有指定内容,则直接引用;如果没有,则开辟新的堆空间后将其保存在对象池供下次使用。

  • 采用构造方法

String str = new String("hello");

在这里插入图片描述

  • 如上我们可以看到,使用String构造方法会开辟两块堆内存空间,并且其中一块成为垃圾空间,并且字符串常量并没有保存在对象池中
  • 入池操作
public native String intern();


入池操作:
String str = new String("hello").intern();
字符串常量不可变更
  • 字符串定义后,不可改变(在后面加上后,实际匿名对象没变,引用在变,栈的指向在变,只是在增多垃圾空间)
    在这里插入图片描述
    在这里插入图片描述
  • 字符串上没有任何变化,但是字符串对象的引用一直在改变,会形成大量垃圾空间
  • 原则:
  • 1.字符串采用直接赋值
  • 2.字符串比较采用equals()实现
  • 3.字符串别改变太多
字符与字符串的相互转化
  • 字符串就是一个字符数组,所以在String类里面支持有字符数组转换为字符串,以及字符串转化为字符的操作方法
  • 将字符数组转换为字符串
public String (char[] value)
public String (char[] value,int offset,int count)

在这里插入图片描述

  • 将字符串转为单个字符
public char charAt(int index):

char c = "hello".charAt(1);//输出为e
  • 将字符串变为字符数组
public char[] toCharArray();

char []data = "hello".toCharArray();
  • 取得字符串长度
public int length();
字节(byte)与字符串
  • 将字节数组转为字符串
public String (char[] value)
public String (char[] value,int offset,int count)

在这里插入图片描述

扫描二维码关注公众号,回复: 4136632 查看本文章
  • 将字符串转为字节数组
public byte[] getBytes();
  • 将字符串按照指定编码转为字节数组
public byte[] getBytes(String charsetName);
字符串比较
  • 不区分大小写相等比较
public boolean equalsIgnoreCase(Srting anotherString)

在这里插入图片描述

  • 比较两个字符串大小(对象方法:在类里面,要先定义类的对象)
public int compareTo(String anotherString)

返回大于0:表示大于比较对象
返回等于0:表示两者相等
返回小于0:表示小于比较对象
str1.compareTo(str2)
字符串中遇到不相等的第一对相对应的,即输出

在这里插入图片描述

字符串查找
public boolean contains(String str):判断str在本字符串中是否存在

public boolean startsWith(String str):判断是否以指定字符串开头

public boolean startsWith(String str,int index):从指定位置开始判断是否以指定字符串开头

public boolean endsWith(String str):判断是否以指定字符串结尾

在这里插入图片描述
在这里插入图片描述

字符串替换
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
  • 字符串拆分处理

在这里插入图片描述

  • 字符串按部分拆分
    vf
  • 拆分IP地址
    在这里插入图片描述
  • 多次拆分
    在这里插入图片描述
字符串的截取
public String substring(int beginIndex):从指定位置截取到字符串结尾   [...

public String substring(int beginIndex,int endIndex):截取部分内容      [  ... )

在这里插入图片描述

String类的其他用法
  • a.去掉左右空格
    public String trim();
    在这里插入图片描述
  • b.转大小写
    public String toUpperCase();
    public String toLowerCase();
  • 这两个函数只转换字母
  • c.判断字符串是否为空(只能判断是否为空字符串而不是null)
    public boolean isEmpty();

StringBuffer、StringBuilder类—(两只SB)了解一下

为什么有StringBuffer类
  • 任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已;
  • 通常来讲String的操作比较简单,但是由于String的不可更改性,为了方便字符串的修改,提供了StringBuffer类
字符串修改

    public StringBuffer append(各种数据类型);

在这里插入图片描述

String类与StringBuffer类之间的转变
  • String---->StringBuffer
    调用StringBuffer的构造方法或append()
  • StringBuffer---->String
    StringBuffer.toString();
字符串反转
public StringBuffer reverse();
删除指定范围的数据
public StringBuffer delete(int start,int end);
插入数据
public StringBuffer insert(int offset,各种数据类型)
了解
  • String的内容不可修改,而两只sb可以修改内容(append)
  • StringBuffer采用同步处理,线程安全,效率较低
  • StringBuilder采用异步处理,线程不安全,效率较高,String“+”底层会将String–>StringBuiler

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/83414434