Java SE 学习笔记11 字符串
这里写目录标题
一、内存
堆内存与栈内存
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组
声明和实例化
声明指的是创建类的对象的过程;实例化指的是用关键词new来开辟内存空间。
Person per = new Person();
这其实是包含了两个步骤,声明和实例化:
Person per = null; //声明一个名为Person类的对象
perper = new Person(); // 实例化这个per对象
它们在内存中的划分是这样的:
二、字符串比较
1、“==”和equals()的区别
==:比较的是两个字符串内存地址(堆内存)是否相等;
判断两个字符串在内存中的地址,即判断是否是同一个字符串对象
equals():比较的是两个字符串的内容是否相等。
检查组成字符串内容的字符是否完全一致
2、内存中的字符串
创建字符串对象有两种方式:一种是通过初始化的方式创建,例如以下代码:
String str="Hello";
另一种是使用new关键字创建,例如以下代码:
String str = new String("Hello");
Java为了避免产生大量的字符串对象,设计了一个字符串池(String Pool),通过初始化方式创建的字符串对象都会存在于字符串池中,且字符串池中的字符串不会重复,以便可以被共享使用,提高存储效率。
其工作原理是:
当使用初始化的方式创建对象时,JVM会首先检查字符串池中是否存在值相等的字符串,如果存在,则不进行创建,而是直接返回字符串池中该字符串的引用地址。如果不存在,则创建该对象,并放入字符串池中,返回新创建的字符串的引用地址。
当使用new关键字创建对象时,JVM仍然首先检查字符串池中是否存在要创建的字符串,如果不存在,则在字符串池中创建一个字符串对象,然后在堆内存中继续创建一个字符串对象,返回该对象的引用地址。如果存在,则只在堆内存中创建一个字符串对象,返回该对象的引用地址。
实例:
public class Hello {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = "Hello";
String str4 = "Hello";
System.out.println(str1 == str2); //false
System.out.println(str3 == str4); //true
System.out.println(str2 == str3); //false
System.out.println(str1.equals(str2)); //true
System.out.println(str3.equals(str4)); //true
String str5=str4;
System.out.println(str4 == str5); //true
str5="World";
System.out.println(str4);//Hello
System.out.println(str5);//World
}
}
结果:
内存中的存储示意图如下:
三、常用方法
1、字符串连接
使用“+”连接字符串:
int sqlScore = 80; //sql成绩
int javaScore = 90; //java成绩
double htmlScore = 86.7; //html成绩
String scoreSheet = "SQL:" + sqlScore + " Java:" + javaScore + " HTML:" + htmlScore;
使用String类的concat()方法,语法:A.concat(B),B字符串将被连接到A字符串后面。
String s = new String("你好,");
String name = new String("张三!");
String sentence = s.concat(name);
System.out.println(sentence);
上述代码的输出结果为:你好,张三!
2、字符串查找
返回出现第一个匹配的位置,如果没有找到字符或字符串,则返回-1:
方法 | 说明 |
---|---|
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() | 返回一个前后不含任何空格的调用字符串的副本 |
substring(int beginindex, int endindex):截取beginindex和endindex之间的字符串部分,包括位置beginindex但不包括位置endindex。
示例:检查文件和邮箱格式
import java.util.*;
public class Verify{
public static void main(String[] args) {
// 声明变量
boolean fileCorrect = false; //标识文件名是否正确
boolean emailCorrect = false; //标识E-mail是否正确
System.out.print("---欢迎进入作业提交系统---");
Scanner input = new Scanner(System.in);
System.out.println("请输入Java文件名: ");
String fileName = input.next();
System.out.print("请输入你的邮箱:");
String email = input.next();
//检查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; //标识E-mail正确
}else{
System.out.println("E-mail无效。");
}
//输出检测结果
if(fileCorrect && emailCorrect){
System.out.println("作业提交成功!");
}else{
System.out.println("作业提交失败!");
}
}
}
3、字符串分割
String类提供了split()方法,将一个字符串分割为子字符串,结果作为字符串数组返回。
例如,将一行歌词按空格进行拆分成多行输出:
public class Lyric {
/**
* 拆分歌词
*/
public static void main(String[] args) {
String words="长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山";
String[] printword=new String[100];//接收数组
System.out.println("***原歌词格式***\n"+words);
System.out.println("\n***拆分后歌词格式***");
printword=words.split(" ");//按照空格进行拆分
for(int i=0;i<printword.length;i++){
System.out.println(printword[i]);//打印输出
}
}
}
4、StringBuffer类
对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率。
StringBuffer的声明:
//创建空StringBuffer对象:
StringBuffer sb = new StringBuffer();
//创建一个变量存储字符串aaa
StringBuffer sb = new StringBuffer("aaa");
StringBuffer的使用:
sb.append("**"); //追加字符串
sb.insert (1, "**"); //插入字符串
sb.toString(); //转化为String类型
示例如下:
public class sbAppend {
public static void main(String[ ] args) {
StringBuffer sb = new StringBuffer("青春无悔");
int num=110;
StringBuffer sb1 = sb.append("我心永恒");
System.out.println(sb1);
StringBuffer sb2 = sb1.append('啊');
System.out.println(sb2);
StringBuffer sb3 = sb2.append(num);
System.out.println(sb3);
}
}
5、其它方法
charAt() : 返回字符串中某个特定位置的字符
indexOf() :返回字符串中某个特定字符或子字符串首次出现的索引
toUpperCase() : 将字符串内的所有字符从小写改为大写
toLowerCase() : 将字符串内的所有字符从大写改为小写