【JAVA重温】String 类
2016-04-07 15:21
519 查看
重温String类
1. 构造方法
String类共有11种构造方法:a.
String str = new String("Welcome to JAVA");b.
String str = "Welcome to JAVA";c.
char[] charArray = {'W', 'e', 'c', 'o', 'm', 'e', ' ', '', 't', 'o', ' ', 'J', 'A', 'V', 'A'}; String str = new String(charArray);
2. String不可变性
String s = "Java"; s = "HTML";上面的String对象没发生变化,只是第二步新建了一个“HTML”对象将引用付给了s,造成第一个“Java”对象不可访问了。
下面贴上转载过来的一部分:
String池(原文链接)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public static void main(String[] args) throws IOException { String s1 = "a"; String s2 = "b"; String s3 = "ab"; String s4 = "ab"; System.out.println("s3==s4 -> "+ (s3==s4)); String s5 = "a"+"b"; System.out.println("s3==s5 -> "+ (s3==s5)); String s6 = s1+s2; System.out.println("s3==s6 -> "+ (s3==s6)); String s7 = new String("ab"); System.out.println("s3==s7 -> "+ (s3==s7)); final String s8 = "a" ; final String s9 = "b" ; String s10 = s8 + s9; System.out.println("s3==s10 -> "+ (s3==s10)); }输出结果为:
s3==s4 -> true s3==s5 -> true s3==s6 -> false s3==s7 -> false s3==s10 -> truejava中的字符串 :String类是不可变的(final),对String类的任何改变,都是返回一个新的String类对象。String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。
把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似。
String池 :String是不可改变的,为了提高效率 Java 引用了字符串池的概念,例如new String("abc");首先会在String池中创建一个对象“abc”,因为有NEW的存在所以会分配地址空间copy String池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。
s3、s4 -> 根据String的概念他们都指向了同一个缓冲池内的地址,所以结果为true。
s3、s5 -> 因为相加的两个为常量,所以编译器会把s5="a"+"b"优化为s5="ab",所以结果也为true。
s3、s6 -> 因为是两个变量的相加所以编译器无法优化,s1+s2即等同于(new StringBuilder(String.valueOf(s1))).append(s2).toString(); 在运行时,会有新的String地址空间的分配,而不是指向缓冲池中的“ab”。所以结果false。
s3、s7 -> 根据缓冲池的定义在new的时候实际会新分配地址空间,s7指向的是新分配的地址空间所以与缓冲池地址不同,所以为false。
s3、s10 -> 类似于s3与s5,因为是final类型编译器进行了优化所以相同。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以,总结一下 :String 池存储的是常量 String,当用没有关键字 new 的构造函数时,会首先在池中搜索是否已有该对象,有的话就将池中的该对象地址付给Str。但是当用new关键字构造String时会新开辟一块空间存储String。另外,编译器会自动优化final型的常量,进入String池,但是编译器没办法优化变量,也就会直接新建空间,而不是进入线程池搜索。
3. String之间的比较
a. == 与 equals== 检测前后两个string对象是否指向同一个地址;equals 方法检测前后两个string对象内容是否相同;
b. 比较两个string大小
要用 s1.compareTo(s2) 方法
4. 字符串长度
String 是对象,需要用 .length() 方法来获取内容长度,而对于普通数组,则只需要 .length 就可以。5. 获取子串
用 substring() 方法,范围为 beginIndex ~ endIndex - 1。6. Sting 和 Array 之间的转化
a. String--->>>Arraychar[] charArray = str.toCharArray();b. Array--->>>String
利用构造函数法:
String str = new String(new char[] {'J', 'A', 'V', 'A'});或者用String的静态方法valueOf():
String str = String.valueOf(new char[] {'J', 'A', 'V', 'A'});
相关文章推荐
- 如何给 eclipse 设置快捷键
- 深入理解java虚拟机--并发
- Java float保留两位小数或多位小数
- java项目WEB-INF目录作用
- 详解Spring应用作为EJB客户端调用EJB方法
- Spring3.0详解
- System.load 和 System.loadLibrary详解
- 深入理解java虚拟机--第七章类加载
- 深入理解java虚拟机--垃圾收集器与内存分配策略
- Java 线程的转换及状态
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- java 回调函数的入门Demo
- Rxjava 技术总结
- Java并发编程:并发容器之ConcurrentHashMap(转载)
- 深入理解java虚拟机--java内存区域与内存溢出异常
- bug_ _ java.lang.IllegalArgumentException: pointerIndex out of range 问题的两种解决办法
- 多线程笔记总结
- Spring中AOP动态代理
- spring整合freemarker 自定义标签
- Java IO:ByteArrayInputStream使用详解及源码分析