一、概述
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。
如果需要对字符串做很多修改,那么应该选择使用StringBuffer & StringBuilder类,和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
二、String类
String是java中的字符串类,是一种引用类型,修改字符串的值时,会重新创建一个新字串:
StringDemo1.java
public class StringDemo1 {
public static void main(String[] args) {
String s1 = "Hello,world!";
String s2 = "Hello,world!"; //与s1指向同一地址,"Hello,world!"存储在堆的常量池中
String s3 = new String("Hello,world!"); //创建了一个新对象
System.out.println(s1==s2); //true 地址相等
System.out.println(s1==s3); //false
System.out.println(s1.equals(s3));//true 内容相等 重写了Object的
byte[] bytes={65,66,67,68}; 正数:字母 负数:汉字(两个字节)
String str=new String(bytes); // byte数组 转 字符串
String str=new String(bytes,1,2); //(数组,始值 个数)
byte[] bytes = str.getBytes(); // 字符串 转 byte数组
char[] ch={'中','a','2'};
String str=new String(ch); // 字符数组 转 字符串
String str=new String(ch,0,1); // 字符数组 转 字符串
char[] chs = str.toCharArray(); //字符串 转 字符数组
}
}
String的常用方法:
str.toString(); 获取字符串对象的内容 输出时 自动调用 str.isEmpty(); 判断字符串是不是空串 str.length(); 返回字符串长度 str.charAt(0); 返回索引处字符 str.equals(str2); 判断字符串 与 指定字符串的内容是否相同 str.equalsIgnoreCase(str3); 判断字符串内容是否相同 忽略大小写 str.substring(1); 截取开始索引 到最后 的字符串 str.substring(2, 4); 截取开始索引 到终止索引(不包括) 的字符串 str.indexOf("bcd"); 返回第一次出现该字符串的索引,没有返回-1 str.contains("bcd"); 判断是否包含指定字符串,返回true/false str.startsWith("Demo"); 判断是否以给定字符串开头 str.endsWith("java"); 判断是否以给定字符串结尾 str.toLowerCase(); 把字符串转换为小写字符串 str.toUpperCase(); 把字符串转换为大写字符串 str.trim(); 去掉字符串两端空格 str.replace(oldChar, newChar); 将替换字符串中的老字符替换为新字符 str.replace(oldstr, newstr); 将字符串中的老字符串,替换为新字符串 String[] strArray = str.split(","); 按照指定符号分割字符串
三、StringBuilder类
StringBuilder是java 1.5中新提供的字符串类,效率非常高,与StringBuffer类的用法相同。StringBuffer是线程安全的,StringBuilder是非线程安全的。
public class StringBuilderDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(); //构造方法 初始为空串
StringBuilder sb = new StringBuilder("world");//构造方法 str 转sb
String str = sb.toString(); //str 转sb 输出时 自动调用
StringBuilder sb2 = sb.append("hello");//添加数据(任意类型)
System.out.println(sb == sb2); //true 地址相同
sb.delete(1, 4); //删除 [1,4)字符
sb.deleteCharAt(1); //删除字符
sb.insert(2, "it"); //在指定位置插入
sb.replace(1, 4, "java");//替换[1,4)的字符串为"java"
sb.reverse();反转
sb.length(); //返回长度(字符数)
sb.charAt(0); //返回索引处的字符
sb.indexOf("java",5); //查找第一次出现字符串的索引 从指定索引处
String str = sb.substring(0,1); //截取 [0,1) 返回字符串
String str = sb.substring(1); //截取[1,最后] 返回字符串
sb.append("hello").append(true).append(100); //链式调用
}
}
四、类型转换
1、字符串、数组相互转换:
/**
* 本Demo是字符串和字符数组之间的相互转换功能的展示
*/
import java.util.Arrays;
public class StringConvertDemo1 {
public static void main(String[] args) {
String sVer = "小宇飞刀!";
char[] cArray;
//把一个字符串转换为字符数组
cArray = sVer.toCharArray();//或者直接:cArray = "小宇飞刀".toCharArray();
System.out.println("字符串sVer:"+sVer);
//使用foreach遍历输出数组中的元素值
System.out.print("数组cArray:");
for (char ch: cArray) {
System.out.print(ch);
}
//通过Arrays静态类提供的方法输出数组的内容:Arrays.toString(数组变量)
System.out.println("\n数组cArray:"+Arrays.toString(cArray));
System.out.println("-----------------------------------------------------------");
char[] cArray2 = {'中','国','人','民'};
String sVer2 = String.valueOf(cArray2);//或者:String sVer2 = new String(cArray2);
System.out.println("数组cArray2的内容:"+Arrays.toString(cArray2));
System.out.println("字符串sVer2的内容:"+sVer2);
System.out.println("-----------------------------------------------------------");
System.out.println("字符串sVer:"+sVer);
System.out.print("原始数组内容cArray:");
System.out.println(cArray);
System.out.println("sVer.equals(cArray):"+sVer.equals(cArray));
System.out.println("sVer.equals(String.valueOf(cArray)):"+sVer.equals(String.valueOf(cArray)));
}
}
2、字符串、数字相互转换:
public class StringConvertDemo2 {
public static void main(String[] args) {
// 字符串转成基本类型Xxx.parseXxx(String s); xxx:基本数据类型
String str="12";
System.out.println(str+1); // 121
int s1=Integer.parseInt(str); // str内容必须是int格式
System.out.println(s1+1); // 13
String str2="2.3";
double s2=Double.parseDouble(str2);
System.out.println(s2+1); // 3.3
//基本类型 转 字符串
String s=12+""; // 方法1
System.out.println(s);
String s3=String.valueOf(2.3); // 方法2
System.out.println(10+s3); // 102.3
String s4 = Integer.toString(12); // 方法3 有参数 不是重写obj
System.out.println(s4+1); // 13
}
}
3.字符串的格式化
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringFormatDemo {
public static void main(String[] args) {
int x = 16;
char ch = 'A';
byte bt = 97;
double dd = 7851412.957418;
System.out.println(x);
System.out.println(ch);
System.out.println(bt);
System.out.println(dd);
String s1 = String.format("%06d",x);
System.out.println(s1);
System.out.println(String.format("%-6d",x));
System.out.println(String.format("%,3.2f",dd));
System.out.printf("%c",ch); //使用printf()方法可以简化String.Format()的写法
System.out.printf("\n%c\n",bt);
Date dt = new Date(); //获取系统当前日期和时间
//Date对象的格式化串必须以 "%t"开始 F参数表示日期格式为yyyy-MM-dd T参数表示时间格式为HH:mm:ss
System.out.printf("%tF %tT",dt,dt);
System.out.println("\n===============================");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
更多有关字符串格式化的内容见博主的另一篇贴子:https://blog.csdn.net/xieyunc/article/details/102531684
五、演示DEMO源代码在github上的仓库地址:
https://github.com/xieyunc/java_demo.git