原创

Java包装类-String


String

String是定义在java.lang包下的一个类,它不是基本数据类型。 String是不可变的,JVM使用字符串池来储存所有的字符串对象。

String的构造

  • String():空构造
  • String(byte[] bytes):根据默认的编码格式,将一个byte的数组转换成字符串(其实就是按照ascii码来转的)
  • String(byte[] bytes, int index, int length):根据默认的编码格式,将一个byte的数组部分转换成字符串) index:从指定索引开始 length:需要转换多少个
  • String(char[] value):将一个字符数组转换成字符串
  • String(char[] value, int index, int length):将一个字符数组的部分转换成字符串(参考byte的类型就可以了)
  • String(String original):将一个常量字符串转换字符串

字符串的特点

因为是常量类,无法被继承,且大部分的修饰也不运行字符串的值被进行改变

String s = "hello"; 和 String s = new String("hello");的区别:

从最终实现结果来说,没有任何区别,但是第一个定义方式只会创建一个内存 (如果能在常量池找到hello,则不创建空间,如果找不到则创建一块常量池空间)

而第二种方式则创建两个两个内存(new出来的对象会有堆内存,而hello如果找不到,还会创建一个常量池的内存)

例题

public static void main(String[] args) {
        String s1 = "hello";//0x0001
        String s2 = "word";//0x0002 //0x0003
        String s3 = "helloword";
        System.out.println(s3 == s1 + s2);
//输出结果为false 原因两块地址值相加不可能等于另一块地址
        System.out.println(s3.equals(s1+s2));
//输出结果为true 比较的是字符串
        System.out.println(s3 == "hello"+"word");
//输出结果为true 之所以为true编译器在处理这个情况就已经对这两个数据进行了拼接,所以为 true
        System.out.println(s3.equals("hello"+"word"));
//输出结果为true 比较的是字符串
}

String判断相关的功能

equals(Object obj):判断两个字符串的内容是否相等

equalsIgnoreCase(String anotherString):比较两个字符串是否相符,不考虑大小写问题

contains(String s):判断字符串当中是否包含某一个字符串,如果存在则返回true
startsWith(String prefix):判断字符串是否以指定字符(串)开始
endsWith(String suffix):判断字符串是否以指定字符(串)结束
isEmpty():判断字符串内容是否为空(不是判断地址)
字符串为空的几个状态
String str = "";//字符串不包含任何内容
String str = null;//字符不存在地址
String获取相关功能
String length();获取字符串的长度
char charAt(int index):根据索引位置返回一个字符
int indexOf(int ch):根据一个字符(是一个重载方法)返回该字符的第一次出现的索引位置
int indexOf(String str, int fromIndex):从指定位置开始查找字符出现的位置,索引位置不变
String substring(int beginIndex):从指定位置开始截取字符串,默认到达末尾。(包含开始位置本身)
String substring(int beginIndex, int endIndex):从指定位置开始,到指定位置结束截取字符串(包含开始位置本身,但是不包含结束位置)

String的转换功能

byte[] getBytes():把一个字符串转换成byte的数组
byte[] getBytes(String charsetName):根据指定字符集编码,转化字符串为字节数组
char[] toCharArray():将一个字符串转换为字符数组
static String valueOf(char[] data):将一个字符数组转换成字符串(常用)
valueOf可以将任意数据类型全部转换成字符
String toLowerCase():将字符串的内容全部转换为小写
String toUpperCase():将字符串的所有内容转换为大写
String concat(String str):将两个字符串进行拼接

String三大特性

不变性:是一个 immutable 模式的对象,不变模式的主要作用是当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。 常量池优化:String 对象创建之后,会在字符串常量池中进⾏行缓存,下次创建同样的对象时,会直接返回缓存的引用。 final:String 类不可被继承,提⾼了系统的安全性。

不可变性的好处

(1)节省内存 由于字符串的不可变性,不同的字符串变量可以引用同一个示例来实现节省堆内存的目的。 (2) 更安全 字符串的不可变性也保证了多线程访问时的线程的安全性。 (3) hashCode 缓存 String 的 hashCode的计算和构成字符串的字符有关,由于 String 的不可变性就可以将 hashCode 缓存起来。源码中也可以看出计算过之后,下次调用 hashCode 直接返回。

StringBuffer

线程安全的可变字符串。一个类似于String的字符串缓冲区。

StringBuffer和String的区别

StringBuffer的一个内容可变的,而String是不了变的。

StringBuffer构造:
StringBuffer():无参构造
StringBuffer(int capacity):就是构建一个指定大小缓冲区的字符串缓冲区对象。
StringBuffer(String str):构建一个带有字符串的字符串缓冲区对象

StringBuffer的常用方法:

int capacity():返回当前字符串缓存区容量大小(默认容量是16)
int length():返回字符串的长度

举例:

StringBuffer sb3 = new StringBuffer("hello");
sb3.capacity()为什么返回的是21而不是16;
字符串缓冲区的大小,固定最小是16,如果有新的数据进来,这个16大小属于保留,并不会占用。
所用新数据的进来是在原来的16的基础上+新字符串的字节大小。
StringBuffer其实底层维护还是一个字符数组。

StringBuffer添加数据的几种方式:

  • 方式一: 在创建对象的时候,通过构造添加数据

  • 方式二: StringBuffer append(String str):将任意数据类型插入,全部会转换为String类型插入到StringBuffer缓冲区当中,返回的是缓冲区本身

  • 方式三: StringBuffer insert(int off,String str):在指定位置(索引)将指定的数据进行插入。

    StringBuffer的删除功能: StringBuffer deleteCharAt(int index):根据指定索引位置进行删除,返回本身。 StringBuffer delete(int start,int end):从指定位置开始到指定位置结束删除。

    StringBuffer的替换功能: StringBuffer replace(int start,int end,String str):从指定位置开始,到指定位置结束,替换什么内容。

    StringBuffer的反转功能: StringBuffer reverse();将字符串进行反转

这里并不会继续返回StringBuffer,返回的是String,同时也意味着截取的过程并不会改变StringBuffer的实际数据

String substring(int start);从指定位置开始,到末尾的截取
String substring(int start,int end):从指定位置开始到指定位置结束的截取

String 与 StringBuffer互转的的几种方式
String 转 StringBuffer
  • 方式一: StringBuffer sb = new StringBuffer(str);
  • 方式二 StringBuffer sb2 = new StringBuffer(); sb2.append(str);

StringBuffer 转 String

  • 方式一: StringBuffer sb2 = new StringBuffer(); String str = new String(sb2);
  • 方式二: String str1 = sb.toString();

String,StringBuffer,StringBuilder的区别:

  1. String的内容是变不了的,而StringBuffer和StringBuilder是内容可变的
  2. StringBuffer是线程安全的,所以效率比较低
  3. StringBuilder是线程不安全的,所以效率比较高

int和String相互转换

int转换为String

//方式一
String s = ""+a;
System.out.println(s);

//方式二
String s1 = String.valueOf(a);
System.out.println(s1);

//方式三
//int -> Integer -> String
Integer i = new Integer(a);
String s3 = i.toString();

//方式四
String s4 = Integer.toString(a);
System.out.println("----------------");
//String转int
String str = "100";
//方式一
Integer i5 = new Integer(str);

//方式二
int i6 = i5.intValue();

//方式三
int i7 = Integer.parseInt(str);
java
  • 作者:陌攻(联系作者)
  • 发表时间:2023-02-10 08:13
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论