不可变的字符串:String:当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象. 可变的 字符串:StringBuilder/StringBuffer:当对象创建完毕之后,该对象的内容可以发生改变,当内容发生改变的时候,对象保持不变. 字符串的本质(底层是什么其实就是char[]),char表示一个字符,数组表示同一种类型的多个数据如何理解char[]:
String str = “ABCDEFG”; //定义一个字符串对象,等价于 char[] cs = new char[]{'A','B','C','D','E','F','G'};-String类:表示不可变的字符串,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象.
1):直接赋一个字面量: String str1 = “ABCD”; 2):通过构造器创建: String str2 = new String(“ABCD”); 两种方式有什么区别,分别在内存中如何分布?
String对象的空值: 1):表示引用为空(null): String str 1 = null; 没有初始化,没有分配内存空间. 2):内容为空字符串: String str2 = “”; 已经初始化,分配内存空间,不过没有内容.判断字符串非空: 1):引用不能为空(null);2):字符内容不能为空字符串(“”); 字符串的比较操作: 1):使用”==”号: 只能比较引用的内存地址是否相同. 2):使用equals方法: 在Object类中和”==”号相同,建议子类覆盖equals方法去比较自己的内容. String类覆盖equals方法,比较的是字符内容.
常量池:专门存储常量的地方,都指的方法区中. 编译常量池: 把字节码加载斤JVM的时候,存储的是字节码的相关信息.(不研究) 运行常量池: 存储常量数据(研究).
下列代码分别创建了几个String对象.
String str1 = "ABCD"; 最多创建一个String对象,最少不创建String对象.如果常量池中,以及存在”ABCD”,那么str1直接引用,此时不创建String对象.否则,先在常量池先创建”ABCD”内存空间,再引用. String str2 = new String(“ABCD”); 最多创建两个String对象,至少创建一个String对象.new关键字:绝对会在堆空间,创建内存区域. 所以至少创建一个String个对象.说说下面String对象,彼此之间是否相等.
private static String getStr(){ return "AB"; } private static void main(String args){ String str1="ABCD"; String str2="AB"+"CD"; String str3="A"+"B"+"C"+"D"; String str4=new String("ABCD"); String str5=getStr()+"CD"; String temp="AB"; String str6=temp+"CD"; } String对象比较: 以上编译之后的结果 String str1="ABCD"; String str2="ABCD"; String str3="ABCD"; String str4=new String("ABCD"); String str5=(new StringBuilder(String.valueOf(getStr()))).append("CD").toString(); String str6=(new StringBuilder(String.valueOf(temp))).append("CD").toString(); 1):单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中; 2):使用new String("")创建的对象会存储到堆内存中,是运行期才创建; 3):使用只包含直接量的字符串连接符如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中(str2和str3); 4):使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作.1):String的创建和转换: byte[] getBytes():把字符串转换为byte数组 char[] toCharArray():把字符串转换为char数组 String(byte[] bytes):把byte数组转换为字符串 String(char[] value):把char数组转换为字符串 2):获取字符串信息 int length() 返回此字符串的长度 char charAt(int index) 返回指定索引处的 char 值 int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。 int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引
3):字符串比较判断 boolean equals(Object anObject) 将此字符串与指定的对象比较。 boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写 boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 比较
4):字符串大小写转换 String toUpperCase() 把当前字符串转换为大写(谁调用该方法,谁就是当前字符) String toLowerCase() 把当前字符串转换为小写
随机数………………………………..