Java语言基础——第六回 字符串API、字符串的不变性与常量池

来源:互联网 发布:手机望远镜偷窥软件 编辑:程序博客网 时间:2024/05/16 10:08


在我们的程序中我们会频繁使用字符串

我们使用String对象储存字符串

例如:

String s = "Hello Word";

String s = new String();

String s = new String("Hello Word");

String类位于java.lang包中,具有丰富的方法

计算字符串的长度、比较字符串、连接字符串、提取字符串

String类提供了length()方法,确定字符串的长度


字符串的比较:

字符串之间的比较不用“==”,String类提供了equals()方法,比较储存在两个字符串对象的内容是否一致

“==”比较的是地址。字符串是引用类型,地址存放在栈中、值存放在堆中,栈中有一个指针指向堆中的数据。如果用“==”比较的是两个字符串的地址。

equals比较的是自变量的值,实际堆中数据的值。

使用equalsIgnoreCaes()方法,忽略字符串的大小写。

使用toLowerCase()方法,将字符串全部转换为小写。

使用toUpperCase()方法,将字符串全部转换为大写。


字符串的连接:

使用“+”、使用String类的concat()方法

String s = new String("你好,");

String name = new String("张三!");

String sentence = s.concat(name);

System.out.println(sentence);

A.concat(B)     ————   B字符串将被连接到A字符串后面


字符串前后的空格去掉:

使用方法trim()

if (userName.trim().equals("admin")) 


字符串常用提取方法

例:判断.java文件名是否正确,判断邮箱格式是否正确

分析:合法的文件名应该以.java结尾、合法的邮箱名中至少包含@和.并检查@是否在.之前。

public int indexOf(int ch)

public int indexOf(String value)  搜素第一个出现的字符ch(或字符串value)

public int lastIndexOf(int ch)

public int lastIndexOf(String value)  搜索最后一个出现的字符ch(或字符串value)

public String substring(int index)  提取从位置索引开始的字符串部分

public String substring(int beginindex,int endindex)  提取 beginindex 和endindex之间的字符串部分

public String trim()  返回一个前后不含任何空格的调用字符串的副本

//检查java文件名int index = fileName.lastIndexOf(".");if(index!=-1 && index!=0 && fileName.substring()index+1,fileName.length()).equals("java")){      fileCorrect = true;}else{      System.out.println("文件名无效。");}

//检查你的邮箱格式if(email.indexOf('@')!=-1 && email.indexOf('.') > email.indexOf('@')){      emailCorrect = true;}else{      System.out.println("Email无效。");}

字符串拆分

String类提供split()方法,讲一个字符串分割为子字符串,结果座位字符串数组返回。


判断一个字符串是否为空:

if(s == null) //从引用的角度

if(s.length() == 0) //从长度判断

if(s.trim().length() == 0) //是否有多个空白字符

if(s!=null && s.length()!=0){

}

空串与null的区别:

它们是不同的概念,对为初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,是一个不指向任何对象的引用,

对引用为null的对象操作会在运行时抛出一场NullPointException;

而空串是长度为0的字符串,和别的字符串的唯一区别就是长度为0


字符串的不变性:

String对象是不变的,可以变化的是String对象的引用。字符串被分配地址之后,是只读的,不能修改。要开辟一块新的内存空间,再指向它。


常量池

String的不变性的机制显然会在String常量内有大量的冗余。

如:“1”+“2”+“3”+.......+“n”产生了n+(n+1)个String对象。因此Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。

譬如String a = "abc" 当你定义这样一个变量的时候,java此时会先去常量池寻找有没有“abc”这样的字符串,如果有,直接把内存地址交给a,否则就生成一个“abc”的字符串;

当下一个String b = "abc"的时候,发现常量池中已经有'abc'了 ,此时JVM不会再次生成“abc”,而是直接交给“abc”引用给b。



0 0