一些概念
- 字符串被作为对象来处理
- 内存分为栈内存、堆内存、常量池内存等若干个区域
- 栈内存存放基本数据类型和对象的引用,堆内存存放对象本身(new修饰的对象),常量池存放字符串常量(直接用双引号定义的)和基本数据类型常量
一、字符串的创建
1.创建格式
首先明确字符串是java.lang包中的String类创建的,是对象,在类和对象那一节中学习到对象的创建方式是(详见Java基础学习二——类与对象):
类名 变量名 = new 类名([实参列表])
对于字符串的创建方式则有两种:
格式1:String str1 = "teacher";
格式2:String str2 = new String("teacher");
2.不同创建格式的区别
(1)格式1
String str1 = "teacher";
String str2 = "teacher";
- 对应的内存的存储方式为:
可以看到第一种方式的"teacher"存储在常量池中,且每次创建一个新对象,只要常量的内容相同,常量内存的地址就是一致的;
(2)格式2
String str1 = new String("teacher");
String str2 = new String("teacher");
- 对应的内存的存储方式为:
可以看到第二种方式的"teacher"存储在堆内存中,且每次创建一个新的对象,堆内存地址都是不一样的。
(3)两者区别
public class Example4_4 {
public static void main(String[] args) {
String s1 = new String("this is an example");
System.out.println("堆s1:" + s1);
String s2;
s2 = new String("this is an example");
System.out.println("堆s2:" + s2);
System.out.println("s1的内容是否等于s2的内容:" + s1.equals(s2));
System.out.println("s1和1s2地址是否相等:" + (s1 == s2));
String s3, s4;
s3 = "this is an example";
s4 = "this is an example";
System.out.println("常量池s3:" + s3);
System.out.println("常量池s4:" + s4);
System.out.println("s3的内容是否等于s4的内容:" + s3.equals(s4));
System.out.println("s1和1s2地址是否相等:" + (s3 == s4));
String s5 = s1;
System.out.println("s1=s5:"+(s1==s5));
System.out.println("s2=s5:"+(s2==s5));
System.out.println("s3=s5:"+(s3==s5));
}
}
输出内容为:
堆s1:this is an example
堆s2:this is an example
s1的内容是否等于s2的内容:true
s1和1s2地址是否相等:false
常量池s3:this is an example
常量池s4:this is an example
s3的内容是否等于s4的内容:true
s1和1s2地址是否相等:true
s1=s5:true
s2=s5:false
s3=s5:false
3.总结
- 格式1:String str1 = “teacher”;程序运行时在常量池中找相同内容的字符串,将其常量池中的地址赋值给对象,常量池中内容相同的字符串的地址是相同的;
- 格式2:String str2 = new String(“teacher”);程序会在堆内存中开辟一个新的空间存放型对象的地址且将其地址赋值给对象;堆内存中字符串内容相同的堆地址不一定相同;看有没有重新new新对象,new了新对象,堆地址会变化
二、字符串的常用方法
下面主要围绕这六种使用方法展开描述。
1.基本操作方法
(1)字符串连接:+或concat()
- 使用+号
- 使用concat(String str)的方法
String s1 = "I am";
String s2 = " a student";
String s3 = s1 + s2;
String s4 = s1.concat(s2);
int s5 = s1.concat(s2)
System.out.println(s3);
System.out.println(s4);
System.out.println("s3=s4:"+(s3==s4));
输出结果:
I am a student
I am a student
s3=s4:false
(2)获取字符串长度方法:length()
- String类中的length()方法,与数组长度length属性不同
- 字符串中的汉字、英文字母、空格、符号都是一个字符
String str = "0";
str.length();
(3)去除空格:trim()
String str1 =" I ";
String str2 = str1.trim();
2.字符串比较
- ==:用于比较两个字符串变量的地址,返回布尔值(true或false)
- equals():比较两个字符串内容是否相同,返回布尔值
- equalsIgnoreCase():忽略大小写比较内容是否相同,返回布尔值
- compareTo():按字典顺序比较字符串,返回值为整数,若前者小于方法体里面的对象,返回小于0的值;若前者等于后者,返回0;若前者大于后者,返回大于0的值
String str1 = "bcd";
String str2 = "acd";
String str3 = "cd";
System.out.println(str1.compareTo(str2);
System.out.println(str1.compareTo(str3);
3.字符串与其它类型转换
数据类型 | 字符串👉其它类型 | 其它👉字符串 | 其它👉字符串 |
---|
byte | Byte.parseByte(str) | String.valueOf([byte] bt) | Byte.toString([byte] bt) | int | Interger.parseInt(str) | String.valueOf([int] i) | Int.toString([int] i | long | Long.parseLong(str) | String.valueOf([long] l) | long.toString([long] l | float | Float.parseFloat(str) | String.valueOf([float] f) | Float.toString([float] f | double | Double.parseDouble(str) | String.valueOf([double] d) | Double.toString([double] d | char | Str.charAt(i) | String.valueOf([char] c) | Char.toString([char] c | boolean | Boolean.getBoolean(str) | String.valueOf([boolean] b) | Boolean.toString([boolean] b |
如下例子
String s1 = null;
byte b=Byte.parseByte(s1);
s1 = String.valueOf(b);
Byte.toString(b);
4.查找字符串位置
- indexOf(字符或字符的Unicode值):在字符串中搜索指定的字符或字串,返回字符串第一次出现的位置,索引从0开始
- lastIndexOf(字符或字符的Unicode值):在字符串中搜索指定的字符或字串,返回字符串第一次出现的位置
5.查找字符串
(1)获取第i个字符:charAt()
String str ="hello word";
char c1 = str.charAt(0);
char c2 = str.chatAt(6);
(2)获取指定位置的字符方法:getChars()
- getChars():将字符从字符串中赋值到目标字符数组
getChars(需要复制的字符串的开始索引,需要复制的字符串的结束索引,需要填充的数组,数组开始的索引号)
String s1 = "012345"
char[] chars = new char[9];
s1.getChars(2,4,chars,0);
System.out.println(chars);/截取字符串填充到数组中,输出为"23",只取到索引号4前面的字符串
6.修改字符串
三、字符串的应用
|