Java中的字符串

739 查看

1、JAVA中的字符串API详解

String对象存储字符串,String类位于java.lang包中.

String s="Hello world";
String s=new String();
String s=new String("Hello world");
  • String类length()方法,确定字符串长度;数组length是属性;
  • String类equals()方法,比较两个字符串内容是否一致(堆中数据);而不是用“==”比较(栈地址比较),Java中特有...
    equalsIgnoreCase()方法:判读两者是否相等,忽略大小写;
    toLowerCase():全部转为小写;
    toUpCase():全部转为大写;
  • 数字转为字符串:String number=1+"";
  • 字符串相加:使用“+”
    使用String类concat()方法
String s=new String("你好,");
String name=new String("张三!");
String sentence=s.concat(name);

注意:s.concat(name)返回值为连接后的字符串,而s并未变化!

  • trim()方法:去掉字符串中空格【前后空格去除,中间不去除】
  • 字符串提取:public int indexOf(int ch)、public int indexOf(String value) 搜索第一个出现的字符ch(或字符串value);
    public int lastIndexOf(int ch)、public int lastIndexOf(String value) 搜索最后一个出现的字符(或字符串value)【字符串中可能存在相同字符】;

  • public String substring(int index):提取从位置索引开始的字符串部分【包括index】

  • public String substring(int beginindex,int endindex):提取从beginindex开始,endindex结束字符串部分【含beginindex,不含endindex】
  • split(String value)方法:拆分字符串,分隔符是value,部分分隔符与正则表达式冲突:比如“|”,需要转义“\\|”;
String caseString="ab,cde,fg";
String[] array=caseString.split(",");
for (String item:array) {
    System.out.println(item);
}

注意:空串与null区别,对未初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,是一个不指向任何对象的引用。对引用null的对象在运行时抛出异常,空串是长度为0的字符串,和别的字符串的区别就是长度为0。

2、JAVA字符串不变性与常量池

  • 字符串不变性:字符串内存地址一旦分配之后,字符串是只读的,不允许更改;字符串更改实际是开辟新内存空间,栈指针断开指向新空间;旧控件编程垃圾!

  • 常量池:String的不变性机制显然会在String常量内有大量的冗余。因此,Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。
    譬如String a="abc",当你定义这样的变量时,java会先去常量池寻找有没有""abc"这样的字符串,如果有,直接把内存地址交给a,否则生成一个"abc"的字符串。当下一个String b="abc"时,JVM不会再次生成"abc",而是直接将"abc"引用给b,所以你会发现a==b。

Demo:

//一块内存空间,堆中地址相同不同
String str1="java";
String str2="java";
System.out.println(str1==str2);
输出:true.

//分配两块内存空间,栈中地址不同
String str1=new String("java");
String str2=new String("java");
System.out.println(str1==str2);
输出:false.

String str1="java";
String str2="blog";
String s=str1+str2;
System.out.println(s=="javablog");
输出:false.

String s="java"+"blog";
System.out.println(s=="javablog");
输出:true.

String str2="blog";
String s="java"+str2;
System.out.println(s=="javablog");
输出:false.

解决方案:
- StringBuffer类是可变的,不会再字符串常量池中,而在堆中。如果缓冲区溢出,容量自动增大,固定容量为16。
- StringBuilder