认识String
- 创建字符串
// 方式一
String str = "Hello world";
System.out.println(str);
// 方式二
String str2 = new String("Hello world");
System.out.println(str2);
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
System.out.println(str3);
“hello” 这样的字符串字面值常量,类型也是 String。
String 也是引用类型.,String str = “Hello”。
2. 字符串比较相等
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3 == str4);
String 使用 == 比较并不是在比较字符串内容,而是比较两个引用是否是指向同一个对象。
3. 字符串常量池
String str1 = new String("hello") ;
String str2 = "hello" ;
System.out.println(str1 == str2);
String str3 = new String("hello").intern() ;
String str4 = "hello" ;
System.out.println(str3 == str4);
在JVM底层实际上会自动维护一个对象池(字符串常量池):
a. 如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。
b. 如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用。
4. 字符串不可变
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str);
形如 += 这样的操作,表面上好像是修改了字符串,其实不是。+= 之后 str 打印的结果却是变了,但是不是 String 对象本身发生改变,而是 str 引用到了其他的对象。
字符, 字节与字符串
- 字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换。
String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换
- 字节与字符串
字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换。
String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// byte[] 转 String
System.out.println(new String(data));
字符串的常见操作
字符串比较
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
System.out.println("A".compareTo("a"));
System.out.println("a".compareTo("A"));
System.out.println("A".compareTo("A"));
System.out.println("AB".compareTo("AC"));
System.out.println("刘".compareTo("杨"));
compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。
字符串查找
//使用contains()进行位置查找 最简单
String str = "hello world" ;
System.out.println(str.contains("world"));
//使用indexOf()方法进行位置查找
String str2 = "hello world" ;
System.out.println(str2.indexOf("world")); //
System.out.println(str2.indexOf("book")); //
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}
字符串拆分
//按照空格拆分
String str = "hello world hello boy" ;
String[] result = str.split(" ") ;
for(String s: result) {
System.out.println(s);
}
//字符串的部分拆分
String str2 = "hello world hello bit" ;
String[] result2 = str.split(" ",2) ;
for(String s: result2) {
System.out.println(s);
}
//拆分IP地址
String str3 = "192.168.1.1" ;
String[] result3 = str.split("\\.") ;
for(String s: result3) {
System.out.println(s);
}
//多次拆分
String str4 = "name=zhangsan&age=18" ;
String[] result4 = str.split("&") ;
for (int i = 0; i < result4.length; i++) {
String[] temp = result4[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}
字符串截取
String str = "hello world" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
字符串替换
String str = "hello world" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));
其他常用方法
public static void main(String[] args) {
//trim()方法的使用
String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");
//大小写转换
String str2 = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str2.toUpperCase());
System.out.println(str2.toLowerCase());
//字符串length()
String str3 = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str3.length());
//isEmpty()方法
System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());
//首字母大写
System.out.println(fistUpper("yuisama"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
public static String fistUpper(String str) {
if ("".equals(str)||str==null) {
return str ;
}
if (str.length()>1) {
return str.substring(0, 1).toUpperCase()+str.substring(1) ;
}
return str.toUpperCase() ;
}
StringBuffer使用
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
fun(sb);
System.out.println(sb);
//字符串反转
StringBuffer sb2 = new StringBuffer("hello world");
System.out.println(sb2.reverse());
//删除
StringBuffer sb3 = new StringBuffer("hello world");
System.out.println(sb3.delete(5, 10));
//插入
StringBuffer sb4 = new StringBuffer("hello world");
System.out.println(sb4.delete(5, 10).insert(0, "你好"));
}
public static void fun(StringBuffer temp) {
temp.append("\n").append("www.word.com.cn");
}
String、StringBuffer、StringBuilder的区别:
a. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。
b. StringBuffer与StringBuilder大部分功能是相似的。
c. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。