Java String ç±»
å—符串广泛应用 在 Java 编程ä¸ï¼Œåœ¨ Java ä¸å—符串属于对象,Java æ��供了 String ç±»æ�¥åˆ›å»ºå’Œæ“�作å—符串。
创建å—符串
创建å—符串最简å�•的方å¼�如下:
在代ç �ä¸é�‡åˆ°å—符串常é‡�时,这里的值是 "Runoob",编译器会使用该值创建一个 String 对象。
å’Œå…¶å®ƒå¯¹è±¡ä¸€æ ·ï¼Œå�¯ä»¥ä½¿ç”¨å…³é”®å—å’Œæž„é€ æ–¹æ³•æ�¥åˆ›å»º String 对象。
ç”¨æž„é€ å‡½æ•°åˆ›å»ºå—符串:
String 创建的å—符串å˜å‚¨åœ¨å…¬å…±æ± ä¸ï¼Œè€Œ new 创建的å—ç¬¦ä¸²å¯¹è±¡åœ¨å †ä¸Šï¼š
String 类有 11 ç§�æž„é€ æ–¹æ³•ï¼Œè¿™äº›æ–¹æ³•æ��ä¾›ä¸�å�Œçš„å�‚æ•°æ�¥åˆ�始化å—符串,比如æ��供一个å—符数组å�‚æ•°:
StringDemo.java 文件代ç �:
以上实例编译�行结果如下:
runoob
注æ„�:String 类是ä¸�å�¯æ”¹å�˜çš„ï¼Œæ‰€ä»¥ä½ ä¸€æ—¦åˆ›å»ºäº† String å¯¹è±¡ï¼Œé‚£å®ƒçš„å€¼å°±æ— æ³•æ”¹å�˜äº†ï¼ˆè¯¦çœ‹ç¬”记部分解æž�)。
如果需è¦�对å—符串å�šå¾ˆå¤šä¿®æ”¹ï¼Œé‚£ä¹ˆåº”该选择使用 StringBuffer & StringBuilder 类。
å—符串长度
用于获�有关对象的信�的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回å—符串对象包å�«çš„å—符数。
下é�¢çš„代ç �执行å�Žï¼Œlen å�˜é‡�ç‰äºŽ 14:
StringDemo.java 文件代ç �:
以上实例编译�行结果如下:
�鸟教程网�长度 : 14
连接å—符串
String ç±»æ��供了连接两个å—符串的方法:
返回 string2 连接 string1 的新å—符串。也å�¯ä»¥å¯¹å—符串常é‡�使用 concat() 方法,如:
"我的å��å—æ˜¯ ".concat("Runoob");
更常用的是使用'+'æ“�作符æ�¥è¿žæŽ¥å—符串,如:
"Hello," + " runoob" + "!"
结果如下:
"Hello, runoob!"
下é�¢æ˜¯ä¸€ä¸ªä¾‹å�:
StringDemo.java 文件代ç �:
以上实例编译�行结果如下:
1��鸟教程网�:www.runoob.com
åˆ›å»ºæ ¼å¼�化å—符串
我们知é�“è¾“å‡ºæ ¼å¼�化数å—å�¯ä»¥ä½¿ç”¨ printf() å’Œ format() 方法。
String 类使用��方法 format() 返回一个String 对象而�是 PrintStream 对象。
String 类的é�™æ€�方法 format() 能用æ�¥åˆ›å»ºå�¯å¤�ç”¨çš„æ ¼å¼�化å—符串,而ä¸�仅仅是用于一次打å�°è¾“出。
如下所示:
ä½ ä¹Ÿå�¯ä»¥è¿™æ ·å†™
String 方法
下�是 String 类支�的方法,更多详细,�看 Java String API 文档:
| SN(��) | 方法�述 |
|---|---|
| 1 |
char charAt(int index) 返回指定索引处的 char 值。 |
| 2 |
int compareTo(Object o) 把这个å—符串和å�¦ä¸€ä¸ªå¯¹è±¡æ¯”较。 |
| 3 |
int compareTo(String anotherString) 按å—典顺åº�比较两个å—符串。 |
| 4 |
int compareToIgnoreCase(String str) 按å—典顺åº�比较两个å—符串,ä¸�考虑大å°�写。 |
| 5 |
String concat(String str) 将指定å—符串连接到æ¤å—符串的结尾。 |
| 6 |
boolean contentEquals(StringBuffer sb) 当且仅当å—符串与指定的StringBuffer有相å�Œé¡ºåº�çš„å—符时候返回真。 |
| 7 |
static String copyValueOf(char[] data) 返回指定数组ä¸è¡¨ç¤ºè¯¥å—符åº�列的 String。 |
| 8 |
static String copyValueOf(char[] data, int offset, int count) 返回指定数组ä¸è¡¨ç¤ºè¯¥å—符åº�列的 String。 |
| 9 |
boolean endsWith(String suffix) 测试æ¤å—符串是å�¦ä»¥æŒ‡å®šçš„å�Žç¼€ç»“æ�Ÿã€‚ |
| 10 |
boolean equals(Object anObject) å°†æ¤å—符串与指定的对象比较。 |
| 11 |
boolean equalsIgnoreCase(String anotherString) å°†æ¤ String 与å�¦ä¸€ä¸ª String 比较,ä¸�考虑大å°�写。 |
| 12 |
byte[] getBytes() 使用平å�°çš„默认å—ç¬¦é›†å°†æ¤ String ç¼–ç �为 byte åº�列,并将结果å˜å‚¨åˆ°ä¸€ä¸ªæ–°çš„ byte 数组ä¸ã€‚ |
| 13 |
byte[] getBytes(String charsetName) 使用指定的å—ç¬¦é›†å°†æ¤ String ç¼–ç �为 byte åº�列,并将结果å˜å‚¨åˆ°ä¸€ä¸ªæ–°çš„ byte 数组ä¸ã€‚ |
| 14 |
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) å°†å—符从æ¤å—符串å¤�åˆ¶åˆ°ç›®æ ‡å—符数组。 |
| 15 |
int hashCode() 返回æ¤å—符串的哈希ç �。 |
| 16 |
int indexOf(int ch) 返回指定å—符在æ¤å—符串ä¸ç¬¬ä¸€æ¬¡å‡ºçŽ°å¤„çš„ç´¢å¼•ã€‚ |
| 17 |
int indexOf(int ch, int fromIndex) 返回在æ¤å—符串ä¸ç¬¬ä¸€æ¬¡å‡ºçŽ°æŒ‡å®šå—符处的索引,从指定的索引开始æ�œç´¢ã€‚ |
| 18 |
int indexOf(String str) 返回指定å�å—符串在æ¤å—符串ä¸ç¬¬ä¸€æ¬¡å‡ºçŽ°å¤„çš„ç´¢å¼•ã€‚ |
| 19 |
int indexOf(String str, int fromIndex) 返回指定å�å—符串在æ¤å—符串ä¸ç¬¬ä¸€æ¬¡å‡ºçŽ°å¤„çš„ç´¢å¼•ï¼Œä»ŽæŒ‡å®šçš„ç´¢å¼•å¼€å§‹ã€‚ |
| 20 |
String intern() 返回å—符串对象的规范化表示形å¼�。 |
| 21 |
int lastIndexOf(int ch) 返回指定å—符在æ¤å—ç¬¦ä¸²ä¸æœ€å�Žä¸€æ¬¡å‡ºçŽ°å¤„çš„ç´¢å¼•ã€‚ |
| 22 |
int lastIndexOf(int ch, int fromIndex) 返回指定å—符在æ¤å—ç¬¦ä¸²ä¸æœ€å�Žä¸€æ¬¡å‡ºçŽ°å¤„çš„ç´¢å¼•ï¼Œä»ŽæŒ‡å®šçš„ç´¢å¼•å¤„å¼€å§‹è¿›è¡Œå��å�‘æ�œç´¢ã€‚ |
| 23 |
int lastIndexOf(String str) 返回指定å�å—符串在æ¤å—ç¬¦ä¸²ä¸æœ€å�³è¾¹å‡ºçŽ°å¤„çš„ç´¢å¼•ã€‚ |
| 24 |
int lastIndexOf(String str, int fromIndex) 返回指定å�å—符串在æ¤å—ç¬¦ä¸²ä¸æœ€å�Žä¸€æ¬¡å‡ºçŽ°å¤„çš„ç´¢å¼•ï¼Œä»ŽæŒ‡å®šçš„ç´¢å¼•å¼€å§‹å��å�‘æ�œç´¢ã€‚ |
| 25 |
int length() 返回æ¤å—符串的长度。 |
| 26 |
boolean matches(String regex) 告知æ¤å—符串是å�¦åŒ¹é…�给定的æ£åˆ™è¡¨è¾¾å¼�。 |
| 27 |
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个å—符串区域是å�¦ç›¸ç‰ã€‚ |
| 28 |
boolean regionMatches(int toffset, String other, int ooffset, int len) 测试两个å—符串区域是å�¦ç›¸ç‰ã€‚ |
| 29 |
String replace(char oldChar, char newChar) 返回一个新的å—符串,它是通过用 newChar 替æ�¢æ¤å—符串ä¸å‡ºçŽ°çš„æ‰€æœ‰ oldChar 得到的。 |
| 30 |
String replaceAll(String regex, String replacement) 使用给定的 replacement 替æ�¢æ¤å—符串所有匹é…�给定的æ£åˆ™è¡¨è¾¾å¼�çš„å�å—符串。 |
| 31 |
String replaceFirst(String regex, String replacement) 使用给定的 replacement 替æ�¢æ¤å—符串匹é…�给定的æ£åˆ™è¡¨è¾¾å¼�的第一个å�å—符串。 |
| 32 |
String[] split(String regex) æ ¹æ�®ç»™å®šæ£åˆ™è¡¨è¾¾å¼�的匹é…�拆分æ¤å—符串。 |
| 33 |
String[] split(String regex, int limit) æ ¹æ�®åŒ¹é…�给定的æ£åˆ™è¡¨è¾¾å¼�æ�¥æ‹†åˆ†æ¤å—符串。 |
| 34 |
boolean startsWith(String prefix) 测试æ¤å—符串是å�¦ä»¥æŒ‡å®šçš„å‰�缀开始。 |
| 35 |
boolean startsWith(String prefix, int toffset) 测试æ¤å—符串从指定索引开始的å�å—符串是å�¦ä»¥æŒ‡å®šå‰�缀开始。 |
| 36 |
CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的å—符åº�列,它是æ¤åº�列的一个å�åº�列。 |
| 37 |
String substring(int beginIndex) 返回一个新的å—符串,它是æ¤å—符串的一个å�å—符串。 |
| 38 |
String substring(int beginIndex, int endIndex) 返回一个新å—符串,它是æ¤å—符串的一个å�å—符串。 |
| 39 |
char[] toCharArray() å°†æ¤å—符串转æ�¢ä¸ºä¸€ä¸ªæ–°çš„å—符数组。 |
| 40 |
String toLowerCase() 使用默认è¯è¨€çŽ¯å¢ƒçš„è§„åˆ™å°†æ¤ String ä¸çš„æ‰€æœ‰å—符都转æ�¢ä¸ºå°�写。 |
| 41 |
String toLowerCase(Locale locale) 使用给定 Locale çš„è§„åˆ™å°†æ¤ String ä¸çš„æ‰€æœ‰å—符都转æ�¢ä¸ºå°�写。 |
| 42 |
String toString() 返回æ¤å¯¹è±¡æœ¬èº«ï¼ˆå®ƒå·²ç»�是一个å—符串ï¼�)。 |
| 43 |
String toUpperCase() 使用默认è¯è¨€çŽ¯å¢ƒçš„è§„åˆ™å°†æ¤ String ä¸çš„æ‰€æœ‰å—符都转æ�¢ä¸ºå¤§å†™ã€‚ |
| 44 |
String toUpperCase(Locale locale) 使用给定 Locale çš„è§„åˆ™å°†æ¤ String ä¸çš„æ‰€æœ‰å—符都转æ�¢ä¸ºå¤§å†™ã€‚ |
| 45 |
String trim() 返回å—符串的副本,忽略å‰�导空白和尾部空白。 |
| 46 |
static String valueOf(primitive data type x) 返回给定data type类型xå�‚æ•°çš„å—符串表示形å¼�。 |
| 47 |
contains(CharSequence chars) åˆ¤æ–æ˜¯å�¦åŒ…å�«æŒ‡å®šçš„å—符系列。 |
| 48 |
isEmpty() 判æ–å—符串是å�¦ä¸ºç©ºã€‚ |
tianqixin
429***967@qq.com
String 类是��改�的解�,例如:
String s = "Google"; System.out.println("s = " + s); s = "Runoob"; System.out.println("s = " + s);输出结果为:
从结果上看是改�了,但为什么说 String 对象是���的呢?
åŽŸå› åœ¨äºŽå®žä¾‹ä¸çš„ s å�ªæ˜¯ä¸€ä¸ª String 对象的引用,并ä¸�是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原æ�¥çš„ "Google" 还å˜åœ¨äºŽå†…å˜ä¸ã€‚
tianqixin
429***967@qq.com
豆妮的�奴隶
861***743@qq.com
length() 方法,length 属性和 size() 方法的区别:
这个例å�æ�¥æ¼”示这两个方法和一个属性的用法:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { String array[] = { "First", "Second", "Third" }; String a = "HelloWorld"; List<String> list = new ArrayList<String>(); list.add(a); System.out.println("数组array的长度为" + array.length); System.out.println("å—符串a的长度为" + a.length()); System.out.println("listä¸å…ƒç´ 个数为" + list.size()); } }输出的值为:
豆妮的�奴隶
861***743@qq.com
Helen
109***2166@qq.com
�考地�
1.å¯¹æ•´æ•°è¿›è¡Œæ ¼å¼�化:%[index$][æ ‡è¯†][最å°�宽度]转æ�¢æ–¹å¼�
æ ¼å¼�化å—符串由4部分组æˆ�ï¼Œç‰¹æ®Šçš„æ ¼å¼�常以%index$开头,index从1开始å�–值,表示将第index个å�‚æ•°æ‹¿è¿›æ�¥è¿›è¡Œæ ¼å¼�化,[最å°�宽度]çš„å�«ä¹‰ä¹Ÿå¾ˆå¥½ç�†è§£ï¼Œå°±æ˜¯æœ€ç»ˆè¯¥æ•´æ•°è½¬åŒ–çš„å—符串最少包å�«å¤šå°‘ä½�æ•°å—。剩下2个部分的å�«ä¹‰ï¼š
æ ‡è¯†ï¼š
转�方�:
d-å��进制 o-八进制 x或X-å��å…进制
上é�¢çš„说明过于枯燥,我们æ�¥çœ‹å‡ 个具体的例å�。需è¦�特别注æ„�çš„ä¸€ç‚¹æ˜¯ï¼šå¤§éƒ¨åˆ†æ ‡è¯†å—符å�¯ä»¥å�Œæ—¶ä½¿ç”¨ã€‚
System.out.println(String.format("%1$,09d", -3123)); System.out.println(String.format("%1$9d", -31)); System.out.println(String.format("%1$-9d", -31)); System.out.println(String.format("%1$(9d", -31)); System.out.println(String.format("%1$#9x", 5689)); //结果为: //-0003,123 // -31 //-31 // (31) // 0x1639 2.å¯¹æµ®ç‚¹æ•°è¿›è¡Œæ ¼å¼�化:%[index$][æ ‡è¯†][最少宽度][.精度]转æ�¢æ–¹å¼�
我们�以看到,浮点数的转�多了一个"精度"选项,�以控制�数点��的�数。
æ ‡è¯†ï¼š
转�方�:
3.对å—ç¬¦è¿›è¡Œæ ¼å¼�化:
对å—ç¬¦è¿›è¡Œæ ¼å¼�化是é�žå¸¸ç®€å�•的,c表示å—ç¬¦ï¼Œæ ‡è¯†ä¸'-'表示左对é½�,其他就没什么了。
Helen
109***2166@qq.com
�考地�
hunter
hun***es@126.com
关于 String 为啥是��改�的
这里å�¯ä»¥æ ¹æ�® jdk çš„æº�ç �æ�¥åˆ†æž�。
å—符串实际上就是一个 char 数组,并且内部就是å°�装了一个 char 数组。
并且这里 char 数组是被 final 修饰的:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];并且 String ä¸çš„æ‰€æœ‰çš„æ–¹æ³•,都是对于 char 数组的改å�˜ï¼Œå�ªè¦�是对它的改å�˜ï¼Œæ–¹æ³•内部都是返回一个新的 String 实例。
hunter
hun***es@126.com
hunter
hun***es@126.com
java ä¸çš„å—ç¬¦ä¸²çš„åŠ ç®—æ³•
相当于:
对于å—ç¬¦ä¸²çš„åŠ è¿�算,当编译æˆ� class 文件时,会自动编译为 StringBuffer æ�¥è¿›è¡Œå—符串的连接æ“�作。
å�Œæ—¶å¯¹äºŽå—符串常é‡�æ± ï¼š
当一个å—符串是一个å—é�¢é‡�时,它会被放到一个常é‡�æ± ä¸ï¼Œç‰å¾…å¤�用。
String a = "saff"; String b = "saff"; String c = new String("saff"); System.out.println(a.equal(b)); // true System.out.println(a.equal(c)); // true这个就是å—符串的常é‡�æ± ã€‚
hunter
hun***es@126.com
惊梦
135***65476@163.com
�考地�
String 类的常��试问题
�试题一:
String s1 = "abc"; // 常é‡�æ± String s2 = new String("abc"); // å †å†…å˜ä¸ System.out.println(s1==s2); // false两个对象的地å�€å€¼ä¸�ä¸€æ ·ã€‚ System.out.println(s1.equals(s2)); // trueé�¢è¯•题二:
java ä¸å¸¸é‡�优化机制,编译时 s1 å·²ç»�æˆ�为 abc 在常é‡�æ± ä¸æŸ¥æ‰¾åˆ›å»ºï¼Œs2 ä¸�需è¦�å†�创建。
�试题三:
先在常é‡�æ± ä¸åˆ›å»º ab ,地å�€æŒ‡å�‘ s1, å†�创建 abc ,指å�‘ s2。对于 s3,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,å†�调用 toString() 转æ�¢å¾—到的地å�€æŒ‡å�‘ s3。故 (s3==s2) 为 false。
惊梦
135***65476@163.com
�考地�
惊梦
135***65476@163.com
�考地�
Java:String�StringBuffer 和 StringBuilder 的区别
String:å—符串常é‡�,å—符串长度ä¸�å�¯å�˜ã€‚Javaä¸String 是immutable(ä¸�å�¯å�˜ï¼‰çš„ã€‚ç”¨äºŽå˜æ”¾å—符的数组被声明为finalçš„ï¼Œå› æ¤å�ªèƒ½èµ‹å€¼ä¸€æ¬¡ï¼Œä¸�å�¯å†�更改。
StringBuffer:å—符串å�˜é‡�(Synchronized,å�³çº¿ç¨‹å®‰å…¨ï¼‰ã€‚如果è¦�频ç¹�对å—符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转æˆ� String 类型,å�¯ä»¥è°ƒç”¨ StringBuffer çš„ toString() 方法。Java.lang.StringBuffer 线程安全的å�¯å�˜å—符åº�列。在任æ„�时间点上它都包å�«æŸ�ç§�特定的å—符åº�列,但通过æŸ�些方法调用å�¯ä»¥æ”¹å�˜è¯¥åº�列的长度和内容。å�¯å°†å—符串缓冲区安全地用于多个线程。
StringBuilder:å—符串å�˜é‡�(é�žçº¿ç¨‹å®‰å…¨ï¼‰ã€‚在内部 StringBuilder 对象被当作是一个包å�«å—符åº�列的å�˜é•¿æ•°ç»„。
基本原则:
惊梦
135***65476@163.com
�考地�
阿颖
553***793@qq.com
public class Main { public static void main(String[] args) { String str1 = "hello world"; String str2 = new String("hello world"); String str3 = "hello world"; String str4 = new String("hello world"); System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str2==str4); } }执行结果为:
解�:
String str1 = "hello world"; å’Œ String str3 = "hello world"; 都在编译期间生æˆ�了å—é�¢å¸¸é‡�和符å�·å¼•用,è¿�行期间å—é�¢å¸¸é‡� "hello world" 被å˜å‚¨åœ¨è¿�行时常é‡�æ± ï¼ˆå½“ç„¶å�ªä¿�å˜äº†ä¸€ä»½ï¼‰ã€‚通过这ç§�æ–¹å¼�æ�¥å°† String 对象跟引用绑定的è¯�,JVM 执行引擎会先在è¿�行时常é‡�æ± æŸ¥æ‰¾æ˜¯å�¦å˜åœ¨ç›¸å�Œçš„å—é�¢å¸¸é‡�,如果å˜åœ¨ï¼Œåˆ™ç›´æŽ¥å°†å¼•用指å�‘å·²ç»�å˜åœ¨çš„å—é�¢å¸¸é‡�ï¼›å�¦åˆ™åœ¨è¿�行时常é‡�æ± å¼€è¾Ÿä¸€ä¸ªç©ºé—´æ�¥å˜å‚¨è¯¥å—é�¢å¸¸é‡�,并将引用指å�‘该å—é�¢å¸¸é‡�。 
 众所周知,通过 new 关键嗿�¥ç”Ÿæˆ�å¯¹è±¡æ˜¯åœ¨å †åŒºè¿›è¡Œçš„ï¼Œè€Œåœ¨å †åŒºè¿›è¡Œå¯¹è±¡ç”Ÿæˆ�的过程是ä¸�会去检测该对象是å�¦å·²ç»�å˜åœ¨çš„ã€‚å› æ¤é€šè¿‡ new æ�¥åˆ›å»ºå¯¹è±¡ï¼Œåˆ›å»ºå‡ºçš„一定是ä¸�å�Œçš„对象,å�³ä½¿å—符串的内容是相å�Œçš„。
阿颖
553***793@qq.com
GritHub
147***6963@qq.com
String ç±»ä¸ concat() 方法和 + å�·çš„区别:
pubic class Demo{ pulic satic void main(String[] args){ String str1 = "a".concat("b").concat("c"); String str2 = "a"+"b"+"c"; String str3 = "abc"; String str4 = new String("abc"); System.out.println(str1 == str2); //�行结果为false System.out.println(str1 == str3); //�行结果为false System.out.println(str2 == str3); //�行结果为ture System.out.println(str2 == str4); //�行结果为false System.out.println(str1.equals(str4)); //�行结果为true } }执行结果为:
解�:
首先关于 new 出æ�¥çš„对象和 String s = "å—符串" çš„ == 执行结果为 false å°±ä¸�å¤šèµ˜è¿°äº†ï¼Œå› ä¸º == 比较的是两个对象的地å�€å€¼ï¼Œequals() 比较的是å—é�¢å€¼ã€‚那么 concat 方法和 + å�·çš„区别在这里有体现了,我们查看concat方法的æº�ç �å�¯ä»¥çœ‹åˆ°ï¼Œå®ƒæ˜¯é€šè¿‡å¤�制数组在通过 char 数组进行拼接生æˆ�一个新的对象,所以地å�€å€¼ä¼šæœ‰å�˜åŠ¨ï¼Œè€Œ + å�·ä¸�会。(作者很è�œï¼Œåˆ�æ�¥ä¹�到,å‰�辈多包涵)
GritHub
147***6963@qq.com