String
- 字符串是常亮,创建之后不可改变。
- 字符串字面值储存在字符串池中,可以共享。
- String s = “Hello”;产生一个对象,字符串池中储存
- String s = new String(“Hello”);//产生两个对象,堆、池各储存一个。
String name = "zhangsan";
name = "李四";
-
以上,我们给一个String类型赋值,在字符串池中就会生成一个值。这时我们再给同一个String类型赋另一个值“李四”。
刚才的“zhangsan”并不会从字符串池中消失,而是在字符串池中新建一个“李四”。
栈中的String类型就会断开对“zhangsan”的连接转而连接“李四”。
如果再次给这个String类型赋值“zhangsan”的话,会现在字符串池中判断有没有这个值,有就连接,没有就新建。
-
通过上图看代码我们发现两个String类型的值是一样的,在字符串池中也不会创建两个”王五“,相对比的输出结果却是false。
那是因为new出来的对象是指向堆的,每new一下堆都会创建一个对象,他们的地址不同,“==”对比的是地址而不是值,所以才会输出false。
所以字符串类型对比我们一般使用“equals”来对比值。
常用方法
-
public int length(); 返回字符串的长度。
-
public char charAt(int index); 根据下标获取字符。
-
public boolean contains(String str); 判断当前字符串中是否包含str。
-
public char[] toCharArray(); 将字符串转换成数组。
-
public int indexOf(String str); 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1.
-
public int lastIndexOf(String str); 查找字符串在当前字符串中最后一次出现的下标索引。
-
public String trim(); 去掉字符串前后的空格。
-
public String toUpperCase(); 将小写转成大写
-
public boolean endWith(String str); 判断字符串是否以str结尾
-
public String replace(char oldChar,char newChar); 将旧字符串替换成新字符串
-
public String[] split(String str); 根据str做拆分,假设:是按 “!”拆分,如果 “!”有多个,那么就在中括号后加“+”号。
-
compareTo(); 比较大小
-
实例:
String name = "zhangsan"; name = "李四"; String n1 = new String("王五"); String n2 = new String("王五"); System.out.println(n1==n2);// 输出false System.out.println(n1.equals(n2)); System.out.println("------------------------------"); // public int length(); 返回字符串的长度。 // public char charAt(int index); 根据下标获取字符。 // public boolean contains(String str); 判断当前字符串中是否包含str。 String contents = "One Piece;One Piece;One Piece"; System.out.println(contents.length());// 返回字符串的长度 System.out.println(contents.charAt(0));// 根据下标位置返回值 第一位 System.out.println(contents.charAt(contents.length()-1));// 最后一位 System.out.println(contents.contains("O"));// 查看字符串中有没有这个值 // public char[] toCharArray(); 将字符串转换成数组。 // public int indexOf(String str); 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1. // public int lastIndexOf(String str); 查找字符串在当前字符串中最后一次出现的下标索引。 System.out.println(Arrays.toString(contents.toCharArray()));// 将字符串转换成数组 System.out.println(contents.indexOf("One"));// 寻找字符第一次出现的位置 System.out.println(contents.indexOf("One",3)); // 从下标第几位找字符第一次出现的位置 System.out.println(contents.lastIndexOf("One"));// 寻找字符最后出现的位置 // public String trim(); 去掉字符串前后的空格。 // public String toUpperCase(); 将小写转成大写 toLowerCase() 将大写转换为小写 // public boolean endsWith(String str); 判断字符串是否以str结尾 startsWith(String str)判断字符串是否以str开头 String cont = " Hello World "; System.out.println(cont.trim());// 去掉字符串前后的空格 System.out.println(cont.toUpperCase());// 将小写转成大写 System.out.println(cont.toLowerCase());// 将大写转换为小写 String wj = "java.jpg"; System.out.println(wj.endsWith("jpg"));// 判断字符串是否以str结尾 System.out.println(wj.startsWith("java"));// 判断字符串是否以str开头 System.out.println("===========replace替换============="); String con = "罗小黑战记"; System.out.println(con.replace("黑","白")); System.out.println("===========split根据……分割============="); String str = "你是 谁啊? 哈哈 想起来了。。。嗯!好"; String[] s = str.split("[ ?。!]+"); // split分割出是数组类型 所以要用数组类型接收 for (String s1:// 遍历 s 数组 s) { System.out.println(s1); } System.out.println("===========compareTo()比较大小============="); String ch1 = "abc"; String ch2 = "xyz"; System.out.println(ch1.compareTo(ch2));// compareTo比较大小只比较第一位 输出 -23 String ch3 = "abc"; String ch4 = "axy"; System.out.println(ch3.compareTo(ch4));// 如果第一位相同就比较第二位的大小 输出 -23 String ch6 = "abc"; String ch7 = "abcxyzzz"; System.out.println(ch6.compareTo(ch7));// 如果只是这种情况,那么比的就是字符串的长度大小 输出 -5 // equalsIgnoreCase 除去大小写比值 String r1 = "abc"; String r2 = "ABC"; System.out.println(r1.equalsIgnoreCase(r2));
小题
-
需求:
- 已知String str = “this is a text”;
- 1.将str中的单词单独获取出来
- 2.将str中的text替换为practice
- 3.在text前面插入一个easy
- 4.将每个单词的首字母改为大写
String str = "this is a text"; // 1.将str中的单词单独获取出来 String[] s = str.split("[ ]"); for (String s1:s) { System.out.println(s1); } // 2.将str中的text替换为practice System.out.println(str.replace("text","practice")); // 3.在text前面插入一个easy System.out.println(str.replace("text","easy text")); // 4.将每个单词的首字母改为大写 for (int i = 0; i < s.length; i++) { char c = s[i].charAt(0); char c1 = Character.toUpperCase(c); String news = c1+s[i].substring(1); System.out.println(news); }
可变字符串
-
StringBuffer:可变长的字符串,JDK1.0提供,运行效率慢、线程安全。
-
StringBuilder:可变长字符串,JDK1.5提供,运行效率快、线程不安全。,
-
实例:
// StringBuilder和StringBuffer的用法一样,只不过StringBuilder更快,StringBuffer安全 // 单线程推荐StringBuilder StringBuffer sb = new StringBuffer(); // 在字符串的最后追加字符串 sb.append("来日方长"); System.out.println(sb.toString()); sb.append(",何惧车遥马慢"); System.out.println(sb.toString()); // 在下标0添加字符串 sb.insert(0,"呵呵"); System.out.println(sb.toString()); // 替换下标0-2的字符串 sb.replace(0,2,"笑谈:"); System.out.println(sb.toString()); // 删除下标0-3的字符串 sb.delete(0,3); System.out.println(sb.toString()); // 删除所有 sb.delete(0,sb.length()); System.out.ntln(sb.length());[]