Java学习:初识String

String类

String类在Java属于引用类型,字符串在刷题时也是十分常见,Java语言提供了String类和相对应的各种操作方法。

String类基本使用

创建字符串

字符串的创建方法有三种:

//常量字符串创建
String str1 = "hello world";
//new创建
String str2 = new String("hello world");
//字符数组创建
char[] arr = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
String str3 = new String(arr);

String类中的中存储着数组value[]hash,value中存放的地址指向的内存存放字符串内容。

String对象的比较

== 和 equals

==运算符用于基本类型的比较时,比较的是两个基本类型的值,用于引用类型比较时,比较的是两个引用的地址是否相同。

public class Test{
    public static void main(String[] arg){
        int a = 1, b = 1, c = 2;
        System.out.println(a == b);//true
        System.out.println(a == c);//false
    }
}

equals方法默认是使用==进行判断,String类对equals进行了重写。

public boolean equals(Object anObject)方法,将调用对象和指定对象进行比较,调用equals进行字符串间的比较时,先使用==比较两个对象引用的地址是否相同,不同则进行类型转换,然后从首个字符开始逐个向后比较比较,若全部相同返回true,否则返回false。

public class Test {
    public static void main(String[] args) {
        String str1 = "hello world";
        String str2 = "hello world";
        String str3 = "world";
        System.out.println(str1.equals(str2));//true
        System.out.println(str1.equals(str3));//false
    }
}
compareTo 和 compareToIgnoreCase

public int compareTo(String anotherString)

compareTo方法是根据以Unicode为基准的字典序对两个字符串中的同位置字符进行比较,若String 对象位于参数字符串之前,则比较结果为一个负整数。 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0。

compareToIgnoreCase方法与compareTo类似,不同之处在于compareToIgnoreCase忽略大小写。

String常用操作方法

此处列出部分常用的字符串操作方法

输出和查找等

方法说明
char charAt(int index)返回指定索引处的 char
int codePointAt(int index)返回指定索引处的字符Unicode
String concat(String str)将指定字符串连接到此字符串的结尾
boolean contains(CharSequence s)当且仅当此字符串包含指定的char值序列时,返回 true
static String format(String format, Object… args)使用指定的格式字符串和参数返回一个格式化字符串
int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex)返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str)返回指定字符在此字符串中最后一次出现处的索引
int length()返回此字符串的长度

CharSequence:接口,已知实现类为CharBuffer,Segment,String,StringBuffer,StringBuilder

转化

方法说明
static String copyValue(char[] data)返回指定数组中表示该字符序列的 String
byte[] getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的byte数组中
char[] toCharArray()将此字符串转换为一个新的字符数组
String toLowerCase使用默认语言环境的规则将此 String 中的所有字符都转换为小写
static String valueOf(Base)返回Base参数的字符串表示形式,``Base`可以是基本类型,也可以是Object,char[]
String replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的

拆分和截取

方法说明
String split(String regex)根据给定的正则表达式匹配拆分此字符串
String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串
String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串

字符串常量池

字符串常量池实际上是一张固定大小的哈希表。为了提高运行效率和节省空间,Java为8种基本数据类型和String都提供了常量池。Java8的字符串常量池位于堆中,受整个应用程序内存大小限制。

字符串的创建

字面常量直接赋值

这种方式首先会检查常量池是否存在该字符串对象引用,若存在则返回对象的引用,否则在堆区创建该字符串对象,字符串常量池存放此对象引用,然后返回

String s1 = "hello world";//在中堆区创建对象,常量池存放该对象引用,然后返回对象引用
String s2 = "hello world";//先在常量池检查,存在该对象引用,返回
System.out.println(s1 == s2);//true

new创建对象

通过new创建的对象,会在堆区上创建对象,常量池创建对应字符串

String s1 = new String("hello world");//在堆区中创建对象,常量池存放该对象引用,然后返回对象引用
String s2 = new String("hello world");//在堆区中创建对象,value[]指向堆区中的字符串
String str = new String(new char[]{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'});
//在堆区中创建对象,利用copyOf将字符数组内容拷贝至String对象中
System.out.println(s1 == s2);//false

intern方法

intern方法的作用是手动把字符串对象添加入常量池中,当调用该方法时,会先检查字符串常量池中的字符串引用,若存在则返回引用,若不存在则把该字符串加入常量池,返回该引用

char[] ch = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' };
String s1 = new String(ch);//此时字符串没有被添加入常量池中
String s2 = s1.intern();//调用后会将s1指向字符串加入常量池中,返回其引用

StringBuffer和StringBuilder

String类在设计时就是不可改变的类型,在java.lang中String类和value[]都是被final修饰

/**
 * Strings are constant; their values cannot be changed after they
 * are created. String buffers support mutable strings.
*/
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

在对字符串进行操作,如复制、替换等,都是创建一个新的String对象进行操作,处理的对象数量较多时,运行的效率低,因此Java提供了StringBuffer类和StringBuilder类

区别
  • String字符串对象内容不可修改,StringBuffer和StringBuilder字符串对象内容可修改

  • StringBuffer和StringBuilder方法大部分相似

  • StringBuffer采用同步处理,属于线程安全操作,StringBuilder没有采用同步处理,属于线程不安全操作

操作方法

StringBuilder类常用的方法有

方法说明
StringBuilder append(char c)char 参数的字符串表示形式追加到此序列
StringBuilder append(String str)将指定的字符串追加到此字符序列
int capacity()返回当前容量
char charAt(int index)返回此序列中指定索引处的 char
StringBuilder delete(int start, int end)移除此序列的子字符串中的字符
int indexOf(String str)返回第一次出现的指定子字符串在该字符串中的索引
StringBuilder insert(int offset, String str)将字符串插入此字符序列中
int lastIndexOf(String str)返回最右边出现的指定子字符串在此字符串中的索引
StringBuilder replace(int start, int end, String str)使用给定 String 中的字符替换此序列的子字符串中的字符
StringBuilder reverse()将此字符序列用其反转形式取代
CharSequence subSequence(int start, int end)返回一个新字符序列,该字符序列是此序列的子序列
String substring(int start)返回一个新的 String,它包含此字符序列当前所包含字符的子序列
String toString()返回此序列中数据的字符串表示形式
int length()返回长度(字符数)

本文的主要目的为记录学习笔记,同时强化学习效果,兼有分享所学之意,欢迎批评指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值