标签:
属性
public final class String
字符串在java中是一个类,然后这个类是一个太监类
类面里面肯定有属性
private final char value[];
final
这个变量value的引用只能被初始化一次,而且引用没法进行修改
但是数组中的值还是可以被改变的
private
就保证这个char类型数组只能被当前类所使用
而且string类中没有提供设置数组的方法,禁止外部的修改
对于我们的字符串来讲,如果我们对字符串做了拼接,删除的操作,会重新创建新的字符串
内存分析
栈
堆
方法区
代码
静态变量
字符串常量池
字符串这种数据类型在日常生活中使用较频繁
常量池中的字符串对象有可能有多个引用同时指向,如果字符串的值是可变的,那其中一个引用把值给它改变了
所有的引用看到的结果都是改变后的, 数据的安全性就得不到保证
就是因为字符串是一个不可变的字符序列,所以每当发生改变的时候都会创建一个新的对象,所以常量池这种机制才能够使用
字符串比较
变量相加就先创建新的字符串,有独立的地址值 如b1="hello" b2="world" b1+b2!=helloworld
字符串和字符串相加就是普通的字符串加字符串 如 "hello"+"world" =helloworld
注意:基本数据类型只比较值,地址一不一样无所谓
引用类型比较地址值
应用
单纯值与值的比较
1 public class TestString { 2 public static void main(String[] args) { 3 4 String a1 = "abcdef"; 5 String a2 = "abcdef"; 6 7 System.out.println(a1 == a2); //true 8 9 }
1 public class TestString { 2 public static void main(String[] args) { 3 4 String b1 = "hello"; 5 String b2 = "world"; 6 7 String b3 = "helloworld"; 8 String b4 = "hello" +"world"; 9 10 System.out.println(b3 == b4); //true 11 12 }
地址值和地址值的比较
public class TestString { public static void main(String[] args) { String b1 = "hello"; String b2 = "world"; String b3 = "helloworld"; String b4 = b1+"world"; System.out.println(b3 == b4); //false }
String中的常用方法
charAt,返回value数组指定索引的值 value[index]
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 char c = string.charAt(1); 6 System.out.println(c); //b 7 } 8 }
codePointAt:char类型的字符对应的编码值
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 int i = string.codePointAt(26); 6 int i1 = string.codePointBefore(27); 7 int i2 = string.codePointCount(0, 26); 8 System.out.println(i); //20013 9 System.out.println(i1); //20013 10 System.out.println(i2); //26 11 } 12 }
compareTo:比较两个字符串的大小 大于正数 小于负数 相等0 ,考虑大小写,而且小写字母比大写字母大
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 String string1 = "a"; 4 String string2 = "A"; 5 System.out.println(string1.compareTo(string2)); //32 6 System.out.println(string1.compareToIgnoreCase(string2)); //0 7 } 8 }
concat:连接字符串,但会创建一个新的字符串并返回
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 String ss = string.concat("东南西北"); 6 System.out.println(ss == string); //false 7 } 8 }
contains:查询是否包含指定的字符串
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 boolean flag = string.contains("abcdef"); 6 System.out.println(flag); //true 7 } 8 }
startWith:以XXX开头 endsWith:以XXX结尾
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 boolean flag = string.startsWith("abcdefghijklmnopqrstuvwxyz"); 6 System.out.println(flag); //false 7 boolean flag1 = string.endsWith("发白"); 8 System.out.println(flag1); //true 9 } 10 }
equals:比较的是字符串的值,字符串重写了equals方法,将来我们的对象也可以重写equals
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 String str1 = new String("abcd"); 4 String str2 = new String("abcd"); 5 System.out.println(str1 == str2); //false 6 System.out.println(str1.equals(str2)); //true 7 } 8 }
hashCode:获取对象的哈希值,如果两个对象equals那么他们的hashcode一定相同,但hashcode相同不一定equals
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 String str1 = new String("abcd"); 4 String str2 = new String("abcd"); 5 System.out.println(str1.hashCode()); //2987074 6 System.out.println(str2.hashCode()); //2987074 7 } 8 }
getBytes:获取字符串对应的字节数组,有可能产生乱码
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 byte[] bytes = string.getBytes(); 4 for (int i = 0; i < bytes.length; i++) { 5 System.out.print(bytes[i]+" "); 6 } 7 } 8 } 9 输出:97 98 99 100 101 102 103 104 105 106 107 108 77 110 111 112 113 114 115 116 117 118 119 120 121 122 -42 -48 -73 -94 -80 -41 -42 -48 -73 -94 -80 -41
indexOf:返回当前字符串所在的索引值
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 int i = string.indexOf("bc"); 4 int i1 = string.indexOf(122); 5 int i2 = string.lastIndexOf("中"); 6 System.out.println(i); //1 7 System.out.println(i1); //25 8 System.out.println(i2); //29 9 } 10 }
length:返回当前字符串的长度
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 System.out.println(string.length()); //32 6 } 7 }
replace:替换
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 String newstring = string.replace("abc", "_"); 6 System.out.println(newstring); //_defghijklMnopqrstuvwxyz中发白中发白 7 8 } 9 }
split:拆分字符串
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 String[] ss = string.split("xyz"); 6 for (int i = 0; i < ss.length; i++) { 7 System.out.println(ss[i]); //abcdefghijklMnopqrstuvw 8 中发白中发白 9 } 10 } 11 }
substring:截取字符串 [1,5)
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 4 String string = "abcdefghijklMnopqrstuvwxyz中发白中发白"; 5 String news = string.substring(1, 5); 6 String news1 = string.substring(1, string.length()); 7 System.out.println(news); //bcde 8 System.out.println(news1); //bcdefghijklMnopqrstuvwxyz中发白中发白 9 } 10 }
trim:去掉前后两端的空格
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 String string4 = " Hello Bjsxt "; //Hello Bjsxt 4 5 } 6 }
toLowerCase/toUpperCase:转换为大小写
1 public class TestStringSkill { 2 public static void main(String[] args) { 3 System.out.println(string.toLowerCase() + "----" + string.toUpperCase()); //abcdefghijklmnopqrstuvwxyz中发白中发白----ABCDEFGHIJKLMNOPQRSTUVWXYZ中发白中发白 4 5 } 6 }
可变与不可变字符串序列
不可变字符串序列
String:
可变字符串序列
StringBuffer:安全性高效率低
StringBuilder:效率高安全性低
首先创建了一个长度为16的数组,当存放数据的时候,首先检查当前数组是否能够装下当前数据,如果存的下直接存放,
如果存不下,数组开始扩容,每次扩大 length*2+2,所以说我们可变字符串序列就是因为数组的大小在一直改变
synchronized 同步 --线程安全
int[] nums = new int[20];
length = 20
实际存放了多少数据:
标签:
原文地址:http://www.cnblogs.com/wcy123/p/5734475.html