http://www.importnew.com/7174.html
本文由 [ImportNew](http://www.importnew.com/) - [邢 敏](http://www.importnew.com/author/xingmin) 翻译自 [programcreek](http://www.programcreek.com/2013/09/top-10-faqs-of-java-strings/)。欢迎加入[翻译小组](http://group.jobbole.com/category/feedback/trans-team/)。转载请见文末要求。
以下是10个最常见的Java字符串问题。
**1、如何比较字符串?使用“==”还是使用equals() ?**
简单地说,“==”测试引用同一地址,而equals()测试值是否相等。除非需要检查两个字符串是否是同一个对象,否则应该总是使用equals()方法。
如果你知道字符串驻留([string interning](http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/))的概念的就更好了。
*译注:字符串驻留是指为每个独立的String值只保留一个不可改变的拷贝,详细解释可参见[String interning词条](http://en.wikipedia.org/wiki/String_interning)。*
**2、为什么为在处理私密信息的时候,选择char [ ]比String好?**
String是不可改变的。这意味着一旦String对象被创建,那个地址上的值将保持不变,直到垃圾收集器有空来做自动清理。而使用char[ ]可以(在用完后)明确地修改它的元素。这种一来,私密信息(例如密码)就不会在系统的任何地方出现。
**3、我们可以在switch语句中用String作分支条件吗?**
从JDK 7开始是可以的。我们可以使用String符串作为Switch条件。第JDK 6之前,我们不能使用String作为Switch条件。
|
1
2
3
4
5
6
7
8
9
|
`// java 7 only!`
`switch` `(str.toLowerCase()) {`
`case` `"a"``:`
`value =` `1``;`
`break``;`
`case` `"b"``:`
`value =` `2``;`
`break``;`
`}`
|
**4 、如何转换String为int?**
|
1
|
`int` `n = Integer.parseInt(``"10"``);`
|
调用很简单,使用如此频繁以致有时会被忽略。
**5 、如何用空白符分割字符串?**
可以简单地使用正则表达式做分割。“ \s ”代表所有空格符,如“ ”、 “ \ ”、 “ \ r”、“ \ n ”。
|
1
|
`String[] strArray = aString.split(``"\\s+"``);`
|
**6 、substring() 具体干了些什么?**
在JDK 6中,substring() 提供了一个显示已有字符串char[]的接口,但不创建新字符串。如果需要创建一个新的char[]表示的字符串,可以像下面一样与一个空字符串相加:
|
1
|
`str.substring(m, n) +` `""`
|
这样会创建一个新的字符数组,表示新的字符串。示例方法有时可以使代码运行更快,因为垃圾收集器可以收集未使用的大字符串只保留子串。
在Oracle JDK 7中 ,substring()会创建一个新的字符数组而不是使用现有的。点击这个[链接](http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/)有图解说明JDK 6和JDK 7的substring()之间的差异。
**7、String vs StringBuilder vs StringBuffer**
* String 与StringBuilder的区别:StringBuilder的是可变的,这意味着可以在创建以后再作修改。
* StringBuilder与StringBuffer的区别: StringBuffer的是同步的,这意味着它是线程安全的,但速度比StringBuilder慢。
**8、如何重复一个字符串?**
在Python中,我们可以乘以一个数字来重复字符串。在Java中,我们可以使用Apache公共语言包(Apache Commons Lang package)中的repeat()。
|
1
2
3
|
`String str =` `"abcd"``;`
`String repeated = StringUtils.repeat(str,``3``);`
`//abcdabcdabcd`
|
**9、如何转换字符串为日期?**
|
1
2
3
4
|
`String str =` `"Sep 17, 2013"``;`
`Date date =` `new` `SimpleDateFormat(``"MMMM d, yy"``, Locale.ENGLISH).parse(str);`
`System.out.println(date);`
`//Tue Sep 17 00:00:00 EDT 2013`
|
**10、如何统计某字符在一个字符串中的出现次数?**
使用apache公共语言包中的StringUtils:
|
1
2
|
`int` `n = StringUtils.countMatches(``"11112222"``,` `"1"``);`
`System.out.println(n);`
|
**附加题**
你知道[如何检测一个字符串是否只包含大写字母吗](http://www.programcreek.com/2011/04/a-method-to-detect-if-string-contains-1-uppercase-letter-in-java/)?
- JVM
- 深入理解Java内存模型
- 深入理解Java内存模型(一)——基础
- 深入理解Java内存模型(二)——重排序
- 深入理解Java内存模型(三)——顺序一致性
- 深入理解Java内存模型(四)——volatile
- 深入理解Java内存模型(五)——锁
- 深入理解Java内存模型(六)——final
- 深入理解Java内存模型(七)——总结
- Java内存模型
- Java内存模型2
- 堆内内存还是堆外内存?
- JVM内存配置详解
- Java内存分配全面浅析
- 深入Java核心 Java内存分配原理精讲
- jvm常量池
- JVM调优总结
- JVM调优总结(一)-- 一些概念
- JVM调优总结(二)-一些概念
- VM调优总结(三)-基本垃圾回收算法
- JVM调优总结(四)-垃圾回收面临的问题
- JVM调优总结(五)-分代垃圾回收详述1
- JVM调优总结(六)-分代垃圾回收详述2
- JVM调优总结(七)-典型配置举例1
- JVM调优总结(八)-典型配置举例2
- JVM调优总结(九)-新一代的垃圾回收算法
- JVM调优总结(十)-调优方法
- 基础
- Java 征途:行者的地图
- Java程序员应该知道的10个面向对象理论
- Java泛型总结
- 序列化与反序列化
- 通过反编译深入理解Java String及intern
- android 加固防止反编译-重新打包
- volatile
- 正确使用 Volatile 变量
- 异常
- 深入理解java异常处理机制
- Java异常处理的10个最佳实践
- Java异常处理手册和最佳实践
- Java提高篇——对象克隆(复制)
- Java中如何克隆集合——ArrayList和HashSet深拷贝
- Java中hashCode的作用
- Java提高篇之hashCode
- 常见正则表达式
- 类
- 理解java类加载器以及ClassLoader类
- 深入探讨 Java 类加载器
- 类加载器的工作原理
- java反射
- 集合
- HashMap的工作原理
- ConcurrentHashMap之实现细节
- java.util.concurrent 之ConcurrentHashMap 源码分析
- HashMap的实现原理和底层数据结构
- 线程
- 关于Java并发编程的总结和思考
- 40个Java多线程问题总结
- Java中的多线程你只要看这一篇就够了
- Java多线程干货系列(1):Java多线程基础
- Java非阻塞算法简介
- Java并发的四种风味:Thread、Executor、ForkJoin和Actor
- Java中不同的并发实现的性能比较
- JAVA CAS原理深度分析
- 多个线程之间共享数据的方式
- Java并发编程
- Java并发编程(1):可重入内置锁
- Java并发编程(2):线程中断(含代码)
- Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
- Java并发编程(4):守护线程与线程阻塞的四种情况
- Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
- Java并发编程(6):Runnable和Thread实现多线程的区别(含代码)
- Java并发编程(7):使用synchronized获取互斥锁的几点说明
- Java并发编程(8):多线程环境中安全使用集合API(含代码)
- Java并发编程(9):死锁(含代码)
- Java并发编程(10):使用wait/notify/notifyAll实现线程间通信的几点重要说明
- java并发编程-II
- Java多线程基础:进程和线程之由来
- Java并发编程:如何创建线程?
- Java并发编程:Thread类的使用
- Java并发编程:synchronized
- Java并发编程:Lock
- Java并发编程:volatile关键字解析
- Java并发编程:深入剖析ThreadLocal
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Synchronized与Lock
- JVM底层又是如何实现synchronized的
- Java synchronized详解
- synchronized 与 Lock 的那点事
- 深入研究 Java Synchronize 和 Lock 的区别与用法
- JAVA编程中的锁机制详解
- Java中的锁
- TreadLocal
- 深入JDK源码之ThreadLocal类
- 聊一聊ThreadLocal
- ThreadLocal
- ThreadLocal的内存泄露
- 多线程设计模式
- Java多线程编程中Future模式的详解
- 原子操作(CAS)
- [译]Java中Wait、Sleep和Yield方法的区别
- 线程池
- 如何合理地估算线程池大小?
- JAVA线程池中队列与池大小的关系
- Java四种线程池的使用
- 深入理解Java之线程池
- java并发编程III
- Java 8并发工具包漫游指南
- 聊聊并发
- 聊聊并发(一)——深入分析Volatile的实现原理
- 聊聊并发(二)——Java SE1.6中的Synchronized
- 文件
- 网络
- index
- 内存文章索引
- 基础文章索引
- 线程文章索引
- 网络文章索引
- IOC
- 设计模式文章索引
- 面试
- Java常量池详解之一道比较蛋疼的面试题
- 近5年133个Java面试问题列表
- Java工程师成神之路
- Java字符串问题Top10
- 设计模式
- Java:单例模式的七种写法
- Java 利用枚举实现单例模式
- 常用jar
- HttpClient和HtmlUnit的比较总结
- IO
- NIO
- NIO入门
- 注解
- Java Annotation认知(包括框架图、详细介绍、示例说明)