-
String类的两种实例化方式
(1)、直接赋值:
public class Test1{
public static void main(String[] args) {
String str = "hello"; // str是一个对象,“hello”应该保存在堆中
System.out.println(str);
}
}
在JVM底层实际上会自动维护一个对象池(字符串对象池),如果现在采用了直接赋值的模式进行String类的对象 实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。如果下次继续使用直接赋值的模式 声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将 其保存在对象池之中以供下次使用。
(2)传统方法:
public class Test1{
public static void main(String[] args) {
String str = new String("hello"); // 用new进行对象实例化
System.out.println(str);
}
}
通过分析可知,如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间。除了这 一缺点之外,也会对字符串共享产生问题。
1.1 字符串的相等比较(equals())
(1)可以使用“==”来判断
// 基本数据类型比较
int x = 10 ;
int y = 10 ;
System.out.println(x==y); //true
// 在string对象上比较
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1==str); // false
(2)用String类提供的equals方法。
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1.equals(str));
释String类"=="与"equals"的区别:
1. ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
2. “equals()”:可以进行字符串内容的比较
释String类中两种对象实例化的区别:
1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2. 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用intern() 方法手工入池。
1.2 string类中字符与字符串的操作方法
字符串就是一个字符数组,所以在String类里面支持有字符数组转换为字符串以及字符串变为字符的操作方法。
语法:
在此之前先说明求字符串和数组的长度方法:例如:有一个字符串str ,数组str
a:字符串的长度用方法来描述(str.length())
b:数组的长度用属性来描述(str.length)
(1)将字符数组中的所有内容变为字符串()
public class Test1{
public static void main(String[] args) {
char[] chars = new char[] {'w','o','r','l','d'}; // 数组的静态初始化
System.out.println(chars.length); // 打印数组长度
System.out.println(new String(chars).length()); // 数组转化为字符串 并打印长度
// 重载 从下标为 0 开始 打印 长度为 3 的字符
System.out.println((new String(chars,0,3)));
}
}
(2)将字符数组转化为字符串
public class Test1{
public static void main(String[] args) {
String str = "hello";
// 求字符串的长度 用方法来描述
System.out.println(str.length());
// 求数组的长度 用属性来描述
System.out.println(str.toCharArray().length); // 把字符串转变为字符数组
// 取得字符 e
System.out.println(str.charAt(1));
}
}
还可以通过一道题来熟悉这两个方法。
例题:判断一个指定的字符串是否是有数字组成的
public class Test1{
public static void main(String[] args) {
String str = "12a3456";
System.out.println(isNumber(str) ? "字符串由数字构成!" : "字符串中有非数字成员!");
}
public static boolean isNumber(String str){
// 把字符串转为字符数组
char[] data = str.toCharArray();
for(int i = 0; i < data.length; i++){
if(data[i]<'0' || data[i]>'9'){ // 不是数字
return false;
}
}
return true;
}
}
1.3 String中字节与字符串的操作方法
字节常用于数据传输以及编码转换的处理之中,在String中提供有对字节的支持。
字节数组转化为字符数组、字符数组转化为字节数组可以通过一个实例来说明
例1:将一个字符串按指定格式(GBK格式)先编码,再解码,最后输出这个字符串
public class Test1{
public static void main(String[] args) throws Exception {
String str = "你好世界";
// 将字符转化为指定的字节数组 String--->byte[]
byte[] data = str.getBytes("GBK"); // 按照GBk格式,编码
// 将字节数组转化为指定的字符 byte[]--->String
String result = new String(data,"GBK"); // 按照GBK格式,解码
System.out.println(result);
// 因为编解码的格式不一样,所以最终输出的结果解释乱码
}
}
主要过程:第一步:先让字符串转化为字节数组
第二步:对字节进行编码(GBK格式)
第三步:再把字节数组转化为字符串并输出。
例2:将小写的字符串转化为大写的字符串并输出。
public class Test1{
public static void main(String[] args) {
String str = "abcdef";
byte[] data = str.getBytes(); // 将字符串转化为字节数组
for(int i = 0; i < data.length; i++){ // 小写字母和大写字母相差32
data[i] -= 32;
}
String result = new String(data); // 字节数组转化为字符串
System.out.println(result);
}
}
1.4 String中的字符串比较方法
上面使用过String类提供的equals()方法,该方法本身是可以进行区分大小写的相等判断。除了这个方法之外,String 类还提供有如下的比较操作:
a:不区分大小写方法
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equalsIgnoreCase(str2)); // true
b:区分大小写方法
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内 容:
1. 相等:返回0.
2. 小于:返回内容小于0.
3. 大于:返回内容大于0。
1.5 String中字符串查找
语法如上的表格中,下面请看代码:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
String str1 = "@@!!hello world$$";
System.out.println(str.contains("world")); // 判断是否存在world(true
System.out.println(str.contains("this")); // 判断是否存在this (false
System.out.println(str.indexOf("l")); // 从头开始查找第一个 l 的位置 (2
System.out.println(str.indexOf("l",5)); // 从下标为5 的位置开始查找遇到的第一个 l (9
System.out.println(str.lastIndexOf("l")); // 从后往前开始查找遇到第一个 l (9
System.out.println(str1.startsWith("@@")); // 判断是不是以字符@@开头(true
System.out.println(str1.startsWith("!!",2)); // 从下标为2的位置开始判断是不是以字符!!开头(true
System.out.println(str1.endsWith("$$")); // 判断是不是以$$结尾(true
}
}
1.6 String中字符替换方法
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
代码:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
System.out.println(str.replaceFirst("l", "A")); // 把第一个 l 换成 A
System.out.println(str.replaceAll("l", "A")); // 把所有的 l 替换为 A
}
}
1.7 String字符串拆分方法
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。 可用方法如下:
注意:一般的拆分,直接使用语法正常操作就好,如果发现有些内容无法拆分开就需要使用"\"转义,转义之后再拆分。
public class Test1{
public static void main(String[] args) {
String str = "hello world hello sky";
String[] data = str.split(" "); // 按照空格拆分
for(String str1 : data){
System.out.println(str1);
}
String[] data1 = str.split(" ",2); // 按照空格拆分,拆分的长度为2
for(String str2 : data1){
System.out.println(str2);
}
}
}
输出结果:
例题:有一个字符串str = xingming:zhangsan|nianling:18 ,把姓名和年龄拆分开。(模式:姓名:年龄|姓名:年龄|..)
代码:
public class Test1{
public static void main(String[] args) {
String str = "xingming:zhangsan|nianling:18";
// 要拆分出姓名 和 年龄
// 1、按照 | 拆分 (但是要转义)
String[] temp = str.split("\\|");
// 按照|拆分完 得到两个字符数组 再按照:拆分
for(int i = 0; i < temp.length; i++){
String[] result = temp[i].split(":"); // 按照 : 拆分
System.out.println(result[1]); // 取得拆分后的第二个 字符串 就是想要的
}
}
}
运行结果:
1.8 String 中字符串的截取
从一个完整的字符串之中截取出部分内容。可用方法如下:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
System.out.println(str.substring(1)); // 从 下标1 开始 截取到最后
System.out.println(str.substring(1,8)); // 从下标1截取到下标8
}
}
字符串截取的应用:可以用来实现字符串的首字母大写
实现代码:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
// 先截取首字母 把首字母大写后 加上 首字母之后的
System.out.println(str.substring(0,1).toUpperCase()+str.substring(1));
}
}
1.9 字符串的其他操作方法
其他的语法和上面的大同小异,就不一一介绍了。主要说一下trim()方法和isEmpty()方法。
trim()方法: 主要是去除字符串开头和结尾的空格,字符串中间的不影响。
isEmpty()方法:字符串的判空操作。具体的以实例来看
代码实现:
public class Test1{
public static void main(String[] args) {
// 先判空 不为空去除左右的空格
String str = " hello world ";
System.out.println("["+str+"]");
if(!(str == null || str.isEmpty())){
System.out.println("["+str.trim()+"]");
}
}
}
运行结果:
从运行结果看,字符串左右两端的空格去除了,但是中间的还在,因此使用时候注意别人要求什么。