Java常用类之String(超详细+大量代码)

🏠个人主页:黑洞晓威
🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在CSDN中与大家一起成长。

🎁如果你也在正在学习Java,欢迎各位大佬来到我的博客查漏补缺呀,如果有哪里写的不对的地方也欢迎诸佬指正啊。

常用类String

String的特点

  1. 声明为final,不可被继承
  2. 实现了Serializable接口,字符串支持序列化
  3. 实现了Comparable接口,表示String可比较大小
  4. String内部定义了final char[] value用于存储字符串数据
  5. String代表不可变字符序列,简称不可变性

体现:

  1. 当对字符串重新赋值时,需要重写指定内存区域赋值,不能用原有的value进行赋值
  2. 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能在原有的基础上赋值
  3. 调用String的replace()方法修改字符或字符串时,也需要重新指定内存区域
  1. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
  2. 字符串的常量池不会存储相同的字符串。

String的实例化方式:

方式一:通过字面量定义的方式

通过字面量定义的方式实例化的String声明在方法区的字符串常量池中

方式二:通过new+构造器的方式

通过new+构造器的方式实例化的tring声明在堆空间中开辟的空间

public static void main(String[] args) {
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1==s2);//true;s1与s2地址相同指向常量池中的"abc"

    String s3 = new String("123");
    String s4 = new String("123");
    System.out.println(s3==s4);//false;s3与s4地址不同,指向堆空间中不同的对象
}

注意:1拼接生成的字符串,只要其中一个为变量,结果就在堆中

2,如果拼接的结果中调用intern(),结果则在字符串常量池中

public static void main(String[] args) {
    String s0 = "abc123";
    String s1 = "abc";
    String s2 = "123";

    String s3 = "abc"+"123";
    String s4 = s1+"123";
    String s5 = "abc"+s2;
    String s6 = s1+s2;
    String s7 = (s1+s2).intern();

    System.out.println(s3==s0);//true,两个字符串连接结果在字符串常量池中
    System.out.println(s4==s0);//false,含有变量的拼接结果在堆中
    System.out.println(s5==s0);//false
    System.out.println(s6==s0);//false
    System.out.println(s7==s0);//true,s7结果仍在常量池中
}

一道面试题:

public static void main(String[] args) {
    String s1 = "abc";
    char[] ch = new char[]{'a','b','c'};
    change(s1,ch);
    System.out.println(s1);//结果为:abc
    System.out.println(ch);//结果为:Abc
}

public static void change(String str,char[] ch){
    str = str+"123";
    ch[0]='A';
}

解释:
首先String是一个不可变类型,在方法调用时JVM只能再开辟一块新的内存,把“abcdef”放进去,然后把新的地址给了s1,如果你在方法中输出str的值肯定是“abc123”,当这个方法返回时main方法中时,s1依然是那个没修改前的引用,所以输出结果为“abc”。

而char[]数组是引用类型且是可变的所以输出结果为”Abc“;

String的常用方法

  1. public char charAt(int index) : 用于查找字符串中下标为index的字符,返回一个字符。
String s1="Hello Word";
System.out.println(s1.charAt(0));//H
System.out.println(s1.charAt(9));//r
  1. public int length(): 返回当前字符串的长度。
String s1="Hello Word";
System.out.println(s1.length());//10
  1. public int compareTo(String anotherString): 按照字典顺序比较两个字符串大小。
String s1="Hello Word";
String s2 = "ABC";
System.out.println(s1.compareTo(s2));//7,(正数大于,负数小于,0为等于)
  1. public boolean equals(Object anObject): 判断当前字符串内容是否与后面字符串内容相同。
 String s1="Hello Word";
 String s2="hello word";
System.out.println(s2.equals(s1));//false
  1. public boolean equalsIgnoreCase(String anotherString): 忽略大小写,判断当前字符串内容是否与后面字符串内容相同。
 String s1="Hello Word";
 String s2="hello word";
System.out.println(s2.equalsIgnoreCase(s1));//true
  1. public boolean contains(CharSequence s):判断前面的字符串是否包含后面的字字符串。
 String s1="Hello Word";   
System.out.println(s1.contains("ell"));//true
  1. public boolean startsWith(String prefix): 判断当前字符串是否以prefix字符串开头。
String s1="hello word";
System.out.println(s1.startsWith("hello"));//true
  1. public boolean endsWith(String suffix): 判断当前字符串是否以suffix字符串开结尾。
String s1="hello word";
System.out.println(s1.endsWith("Word"));//false
  1. public int indexOf(String str): 返回某个子字符串在当前字符串中第一次出现的下标,没有就返回-1。
String s1="hello word"; 
System.out.println(s1.indexOf("el"));//1
  1. public int lastIndexOf(String str): 返回某个子字符串在当前字符串中最后一次出现的下标,没有就返回-1。
String s1="hello word"; 
System.out.println(s1.lastIndexOf("o"));//7
  1. public boolean isEmpty(): 判断某个字符串是否为空字符串。
String s1="Hello Word";
System.out.println(s1.isEmpty());//false
  1. public String replace(CharSequence target, CharSequence replacement):将当前字符串当中的所有target字符串换成replacement字符串。
String s1="Hello Word";
System.out.println(s1. replace("o","a"));//Hella Ward
  1. public String[] split(String regex): 将当前字符串以regex字符串隔开,隔开后的片段以String[]形式返回。
String s1 = "a,b,c";
String[] str = s1.split(",");
for (String x: str) {
    System.out.print(x + "  ");  //输出:a b c  
}
  1. public String substring(int beginIndex, int endIndex):在当前字符串中,从beginIndex开始截取,截取到endIndex的新字符串(不包含 int endIndex),返回新字符串。
String s1="Hello Word";
System.out.println(s1.substring(3));//Hel
System.out.println(s1.substring(0,4));//hell
  1. public String toLowerCase():将字符串全都转换成小写字母。
String s1="Hello Word";
String s2=s1.toLowerCase();
System.out.println(s1);
System.out.println(s2);
  1. public String trim(): 去除字符串前后的空格。
String s1="   Hello Word      ";
String s2=s1.trim();
System.out.println(s2);//Hello Word

String与其他类型之间的转化

1,String与基本类型、包装类之间的转换

String---->基本类型,包装类:调用包装类的静态方法:parseXxx(str)

基本类型,包装类---->String:调用String重载的valueOF(xxx),或者+“”

int num0 = 123;
String s0 = "456";

//String---->基本类型,包装类:
int num1 = Integer.parseInt(s0);//"456"-->456

//基本类型,包装类---->String:
String s1 = String.valueOf(num0);//123-->"123"
String s1 = num0+"";//123-->"123"
2,String与char[]之间的转换

string–>char[] : 调用String的toCharArray()

char[]–>string : 调用String的构造器

char[] chars = new char[]{'a','b','c'};
String str = new String("def");

//char[]-->string :
String s1 = new String(chars);
System.out.println(s1);//"abc"

//string-->char[] : 
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
    System.out.println(ch[i]);//def
}
3,String与byte[]之间类型转换

String–>byte[] : 调用String中的getByte()

byte[]–> String : 调用String的构造器

String str = "abc";
byte[] by = new byte[]{'4','5','6'};

//String-->byte[]
byte[] b1 = str.getBytes();
for(byte b : b1){
System.out.print(b+",");//a,b,c
}

//byte[]-->String
String s1 = new String(by);
System.out.println(s1);//456

补充:编码与解码

  • 编码:String–>byte[](看得懂的字符串———到看不懂的二进制数据)
  • 解码:byte[]–> String(看不懂的二进制数据———看得懂的字符串)
String str = "abc你好";

byte[] b1 = str.getBytes();//按设置使用默认编码方式(此时为UTF-8)
String s1 = new String(b1);//按设置使用默认解码方式(此时为UTF-8)
System.out.println(s1);//正常输出"abc你好'

byte[] b2 = str.getBytes("gbk");//按gbk编码
String s2 = new String(b2);//按设置默认解码方式(此时为UTF-8)
System.out.println(s2);//出现乱码

String s3 = new String(b2,"gbk");//按gbk方式解码
System.out.println(s3);

一道面试题

String s1 = "HelloWord";
String s2 = "Hello";
final String s3 = "Hello";

String s4 = s2 + "Word";
String s5 = s3 + "Word";

System.out.println(s1==s4);//false
System.out.println(s1==s5);//true

为什么s1==s5为true?

因为s3被final修饰,此时s3为常量

常量池中不会出现相同内容的常量

常量拼接的String实例s5与s1都在常量池中,此时二者的地址相同

🎉文章到这里就结束了,感谢诸佬的阅读。🎉
💕欢迎诸佬对文章加以指正,也望诸佬不吝点赞、评论、收藏加关注呀😘在这里插入图片描述

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑洞晓威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值