字符串创建的方法
String str1 = "Hello world";
String str2 = new String("Hello world");
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
关于字符串比较相等的问题:
String str1 = "abcde";
String str2 = new String("abcde");
System.out.println(str1 == str2); // false
String str3 = "abc" + "de";
System.out.println(str1 == str3) // true
String str4 = new String("abc") + new String("de");
System.out.println(str1 == str4) // false
String str5 = new String("abc") + "de";
System.out.println(str1 == str2) // false
- 上述代码中,因为字符串是引用类型,所以字符串之间的比较,比较的是str这个引用所存储的地址。str1的字符串是使用双引号直接定义在字符常量池中的,而str2是在堆中new了一个对象,str2中存放的是这个new的对象的地址,在堆中,所以,比较返回false。剩下的比较中,只要new了新的对象,地址一定不同,所以是false。str1与str3返回true是因为在字符常量池中定义好了以后在工程中是不会被删除的,所以str3再次定义字符串时,会先搜索字符常量池是否有该字符串,有的话会直接将地址给str3。
- 如果要比较两个字符串的内容是否相等,则使用
equals
String str1 = new String("Hello");
System.out.println(str1.equals("Hello")); //或
System.out.println("Hello".equals(str1));
// 但需要注意的是 如果str为空 即:
String str = null;
System.out.println(str.equals("Hello")); // 会报出空指针异常(java.lang.NullPointException)
System.out.println("Hello".equlas(str)) // 正常执行,返回false;
字符串的不可变
String str = "hello";
str = str + "world";
str += "!!!";
System.out.print(str); // 输出为 hello world!!!
- 上述虽然看起来是str发生了变化,但其实在内存中是str引用
字符,字节与字符串
1、字符与字符串
- 1、将字符数组中的内容变为字符串
public String(char value[])
(构造方法) - 2、将部分字符数组中的内容变为字符串
public String(char value[] int offset, int count)
(构造方法) - 3、取得指定索引位置的字符,索引从0开始
public char charAt(int index)
String str = "hello";
System.out.println(str.charAt(0)); //取0下标位置的字符 输出为h
// 索引值过大会产生 StringIndexOutOfBoundsException异常
- 4、将字符串变为字符数组返回
public char[] toCharArray()
;
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)); //从5下标开始往后5个位置,转换为字符串
例:给定一个字符串,判断其是否全部由数字组成
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;
}
public static void main(String[] args){
String str = "1a23456c";
System.out.println(isNumber(str)? "字符串由数字组成" : "字符串中有非数字成员");
}
2、字节与字符串
-
1、将字节数组变为字符串
public String(byte bytes[])
(构造) -
2、将部分字节数组中的内容变为字符串
public String(byte bytes[] ,int offset, int length)
(构造) -
3、将字符串以字节数组的形式返回
public byte[] getBytes()
-
4、编码转换处理
public byte[] getByets(String charsetName) throws UnsupportedEncodingException
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.print(new String(data));
字符串常见操作
1、字符串比较
- 1、区分大小写的比较
public boolean equals(Object anObject)
- 2、不区分大小写的比较
public boolean equalsIgnoreCase(String antherString)
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.euals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
- 3、比较两个字符串大小关系
public int compareTo(String anotherString)
相等返回0;小于返回小于0的数;大于返回大于0的数
2、字符串查找
- 1、判断一个子字符串是否存在
public boolean contains(CharSequence s)
JDK1.5之前只能使用indexOf()
返回的是子字符串第一个字符的索引位置,没有则返回-1。
String str = "helloworld";
System.out.println(str.contains("world")) // true
-
2、从开头查找指定字符串的位置,查找到了返回位置的索引,查找不到返回-1
public int indexOf(String str)
-
3、从指定位置开始查找子字符串位置
public int indexOf(String str, int fromIndex)
-
4、由后向前查找字符串位置
public int lastIndexOf(String str)
-
5、从指定位置由后往前查找
public int lastIndexOf(String str, int fromIndex)
String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2
System.out.println(str.indexOf("l",5)); // 8
System.out.println(str.lastIndexOf("l")); // 8
- 6、判断是否以指定字符串开头
public boolean startsWith(String prefix)
- 7、从指定位置开始判断是否以指定字符串开头
public boolean startsWith(String prefix, int toffset)
- 8、判断是否以指定字符串结尾
public boolean endsWith(String suffix)
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true
3、字符串替换
- 1、替换所有的指定内容
public String replaceAll(String regex, String replacement)
- 2、替换首个内容
public String replaceFirst(String regx String replacement)
由于字符串是不可变对象,替换不改变当前字符串,而是产生并一个新的字符串
String str = "hello"
System.out.println(str.replaceAll("l", "_")); //替换所有的l
System.out.println(str.replaceFiret("l", "_")); //替换第一个l
4、字符串拆分
- 1、将字符串全部拆分
public String[] split(String regex)
- 2、将字符串部分拆分,该数组长度就是limit极限(最多有limit个数组)
public String[] split(String regex, int limit)
注意:字符"|","*","+"
都得加上转义字符'\'
String str = "hello world give me five";
String[] result = str.split(" ");
String str1 = "192.168.1.1";
String[] result1 = str1.split("\\.");
- 多次拆分
String str = "name=zhangsan&age=18";
String[] result = str.split("&"); //以&将字符串分为一个数组
// name=zhangsan 是数组0下标
// age=18 是数组1下标
for(int i = 0; i < reslut.length; i++){
String[] temp = result[i].split("="); //遍历数组,对数组两个元素都以=在分割
System.out.println(temp[0] + " = " + temp[1])
//依然会打印出name = zhangsan 和 age = 18
//但此时,name = zhangsan是在一个数组,age = 18是在一个数组
}
5、字符串截取
- 1、从指定索引截取到结尾
public String substring(int beginIndex)
- 2、截取部分内容
public String substring(int beginIndex, int endIndex)
注意:索引是从0开始;部分截取是前闭后开写法,substring(0,5)
包含0好下标,不包含5号下标。
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
6、其他常用操作方法
- 1、去掉字符串中的左右空格,保留中间空格
public String trim()
- 2、字符串转大写
public String toUpperCase()
- 3、字符串转小写
public String toLowerCase()
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase()); //汉字和字符不会被大小写转换影响
- 4、字符串入池操作
public native String intern()
- 5、字符串连接,此操作相当于"+",不会入池
public String concat(String str)
- 6、取得字符串长度
public int length()
数组长度使用的是数组名.length
属性,而在String使用的是length()方法
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.length());
- 7、判断是否为空字符串,但不是null,而是长度为0
public boolean isEmpty()
StringBuffer与StringBuilder
public class Test{
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
fun(sb);
System.out.println(sb);
}
public static void fun(StringBuffer temp) {
temp.append("\n").append("www.bit.com.cn");
}
}
- String的内容无法修改,而StringBuffer的内容可以修改
- String变为StringBuffer,利用StringBuffer的构造方法或append()方法
- StringBuffer变String使用toString()方法
- StringBuffer中一些String类没有的方法
- 1、字符串反转
public synchronized StringBuffer reverse()
StringBuffer sb = new StringBuffer("helloword");
System.out.println(sb.reverse());
- 2、删除指定范围的数据
public synchronized StringBuffer delete(int star, int end)
StringBuffer sb = new StringBuffer("helloword");
System.out.println(sb.delete(5, 10));
- 3、插入数据
public synchronized StringBuffer insert(int offset, 各种数据类型 b)_
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "你好"));
Sting、StringBuffer、StringBuilder的区别:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
- StringBuffer与SringBuilder大部分功能相似
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作