字符串是常量,创建之后不可改变。
字符串字面值存储在字符串池(在方法区里面)中,可以共享。(在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了)
引用类型的”变量“存在栈中,真实的对象存在堆中,而栈中的引用类型的变量里面存储的是指向堆中实际对象的地址
Object类有equals()方法,所有类继承自object类,String 这个类重写了equals方法(所以equals比较的是值,==比较的是地址)
equals在Object类中比的是地址,但是SUN公司在String类中重写了equals,重写为比较值,基本Sun公司在每一个类里都重写了equals
public class Dome2 {
public static void main(String[] args) {
String name ="成龙";//“成龙”这个常量存储在字符串池中
name = "阿祖";//”阿祖“赋值给name变量,给字符串赋值时,并没有修改数据,而是重新开辟一个空间
String name1="阿祖";//优先去匹配字符串池中对象,指向同一个对象
System.out.println(name.equals(name1));
//这里会创建两个对象,一个在堆里,一个在字符串池中
String str1= new String("java");
String str2= new String("java");
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
}
}
String常用方法
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) : 将旧字符串替换成新字符串。
//字符串的使用
//length();返回字符串的长度
//charAt(int index);返回某个位置的字符
//contains(String str);判断是否包含某个字符串
String str = " qwdefihe ifwh " ;
System.out.println(str.length());
System.out.println(str.charAt(3));
System.out.println(str.contains("fine"));
//toCharArray();返回字符串对应的数组,一般与Array.toString()连用
//indexOf();返回字符串首次出现的位置
//lastIndexOf();返回字符串最后一次出现的位置
System.out.println(Arrays.toString(str.toCharArray()));
System.out.println(str.indexOf("fu"));
System.out.println(str.indexOf("f",5));
System.out.println(str.lastIndexOf("wde"));
//trim();去掉字符串前后的空格,不去掉中间的空格
//toUpperCase(); 把小写转成大写、、toLowerCase();把大写转成小写
//endWith(str);判断是否以str结尾、、startWith(str);判断是否以str开头
System.out.println(str.trim());
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
System.out.println(str.endsWith(" "));
System.out.println(str.startsWith(" "));
//repalce(char old ,char new);用新的字符或字符串替换旧的字符或字符串
//split();堆字符串做拆分
System.out.println(str.replace(" ","ikun"));
String[] arr=str.split("f");
System.out.println(arr.length);
System.out.println(Arrays.toString(str.split("f")));
System.out.println(Arrays.toString(str.split("[ f]")));//选择了两个分隔,中括号后面加+,表示可以出现多个
for (String f : str.split("f")) {
System.out.println(f);
}
//补充两个方法:equals、compareTo();比较大小(先后顺序)
String s1 = "hello";
String s2 = "HEllO";
System.out.println(s1.equalsIgnoreCase(s2));//忽略大小写比较值
String s3 = "axd";//a--97
String s4 = "xyf";//x--120
System.out.println(s3.compareTo(s4));//等于97-120 第一个相同就比第二个,后面没比的不影响
//特殊的
String s5 = "abc";
String s6 = "abcdef";
System.out.println(s5.compareTo(s6));//比较的是两个的长度,用前面的减去后面的
案例演示
需求:已知String str = “this is a text “;
-
将str中的单词单独获取出来
-
将str中的text替换为practice
-
在text前面插入一个easy
-
将每个单词的首字母改为大写
import java.util.Arrays; public class Exercise1 { public static void main(String[] args) { String str ="this is a text"; System.out.println(Arrays.toString(str.split(" "))); System.out.println(str.replace("text","practice")); System.out.println(str.replace("text","easy text")); String[] arr=str.split(" "); for (int i = 0; i < arr.length; i++) { char first = arr[i].charAt(0); char upperfirst = Character.toUpperCase(first); String news =upperfirst+arr[i].substring(1);//截取字符串,从第几个开始 System.out.println(news); } } }
可变字符串
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全
StringBuilder:可变长字符串,JDK5.0提供,运行效率块、线程不安全
这两个与String的优点:效率高,节省内存
public class Dome3 { public static void main(String[] args) { //StringBuuffer和StringBuilder用法一样 StringBuffer sb = new StringBuffer("java好啊"); //追加 sb.append("确实好阿"); System.out.println(sb.toString()); //添加 sb.insert(0,"你以为"); System.out.println(sb); //替换 sb.replace(0,3,"臣复议");//含头不含尾 System.out.println(sb); //删除 sb.delete(0,3); System.out.println(sb); //清空 //sb.delete(0,sb.length()); //反转 sb.reverse(); System.out.println(sb); } }
验证这两个效率高:
public class Dome4 { public static void main(String[] args) { //开始时间 long start = System.currentTimeMillis(); String str =""; for (int i = 0; i < 999; i++) { str+=i; } System.out.println(str); //结束时间 long end = System.currentTimeMillis(); System.out.println("用时:"+(end-start)); //StringBuffer //开始时间 long start1 = System.currentTimeMillis(); StringBuffer sb =new StringBuffer(); for (int i = 0; i < 999; i++) { sb.append(i); } System.out.println(); //结束时间 long end1 = System.currentTimeMillis(); System.out.println("用时:"+(end1-start1)); } }