JAVA面试题解惑系列(六)——字符串(String)杂谈.docx_第1页
JAVA面试题解惑系列(六)——字符串(String)杂谈.docx_第2页
JAVA面试题解惑系列(六)——字符串(String)杂谈.docx_第3页
JAVA面试题解惑系列(六)——字符串(String)杂谈.docx_第4页
JAVA面试题解惑系列(六)——字符串(String)杂谈.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA面试题解惑系列(六)字符串(String)杂谈5 ) C$ B6 h5 P- p Z; V( ! g( n% v) n8 n: D# E作者:臧圩人(zangweiren): h* n3 |! M, P9 K& E! |# M网址: # ( O3 n$ g6 T: K/ g转载请注明出处! 0; i-) System.out.print(s.charAt(i - 1); 1 n- u$ pQ; c S8 T 6 U/ . U F# q / 也可以转换成数组后再反转,不过有点多此一举 2 / B7 Y; K( $ M* r char data = s.toCharArray(); ; A8 W* V3 H ) ( ci System.out.println(); System.out.print(反转后字符串:); for (int i = data.length; i 0; i-) System.out.print(datai - 1); 3 j3 i) u! q6 2 O# r0 o% s, T+ p5 f2 ?9 _m- e, DL运行结果:8 S V; t4 3 Z6 M) C ?5 _* j0 b T* , cs3 6 P. f1、原始的字符串:A quick brown fox jumps over the lazy dog.?4 o: PY( M8 a6 ?2、反转后字符串:.god yzal eht revo spmuj xof nworb kciuq A3、反转后字符串:.god yzal eht revo spmuj xof nworb kciuq A. x+ N, % x; U- _& 3 Vo* oG9 m |以上两种方式虽然常用,但却不是最简单的方式,更简单的是使用现有的方法:8 L( M; s( i8 D$ 6 d; |Java代码public class StringReverse w, - y! Y+ w1 T public static void main(String args) * V; , j, _1 Z8 m0 p U6 Oa/ S / 原始字符串 String s = A quick brown fox jumps over the lazy dog.; 2 Y) Q3 K% g; p5 Y1 R$ System.out.println(原始的字符串: + s); . p+ P, & S- ! L4 k# YD/ T p* 4 x8 A- A; T1 D/ A System.out.print(反转后字符串:); StringBuffer buff = new StringBuffer(s); 8 c; H* |0 U7 a; R+ R m / java.lang.StringBuffer类的reverse()方法可以将字符串反转 # s. _& m8 S v System.out.println(buff.reverse().toString(); & M0 O2 k4 R2 w 8 F K: ; X/ U; P( e+ d1 w7 运行结果:5 R) m5 e! ! H# 1、原始的字符串:A quick brown fox jumps over the lazy dog.2、反转后字符串:.god yzal eht revo spmuj xof nworb kciuq A四、按字节截取含有中文汉字的字符串。要求实现一个按字节截取字符串的方法,比如对于字符串我ZWR爱JAVA,截取它的前四位字节应该是我ZW,而不是我ZWR,同时要保证不会出现截取了半个汉字的情况。2 T+ w& 3 J6 5 Z# k3 L英文字母和中文汉字在不同的编码格式下,所占用的字节数也是不同的,我们可以通过下面的例子来看看在一些常见的编码格式下,一个英文字母和一个中文汉字分别占用多少字节。. , s/ z1 3 x& c, c8 P& PJava代码$ l2 a2 |. : 5 import java.io.UnsupportedEncodingException; public class EncodeTest 3 l3 d- I1 N9 d. q+ S) C# /*) l8 s1 D5 _8 j/ G# K( l * 打印字符串在指定编码下的字节数和编码名称到控制台 * * param s * 字符串 * param encodingName * 编码格式; H* D. d3 . : y Q8 oN */a1 J* k& A, k public static void printByteLength(String s, String encodingName) System.out.print(字节数:); / f4 k3 i+ ( T2 h* X try 9 B8 B3 Y, M# T2 T3 ? q System.out.print(s.getBytes(encodingName).length); catch (UnsupportedEncodingException e) e4 x. R# y; G3 e7 u e.printStackTrace(); System.out.println(;编码: + encodingName); $ + U& F; k! + u+ J7 y# C public static void main(String args) : d1 O. A! E9 % k String en = A; / # A. T6 m! t. o* J String ch = 人; 7 O& ?3 k% |9 7 M& , O2 l$ z! w2 g: _$ j/ a* c% m / 计算一个英文字母在各种编码下的字节数 System.out.println(英文字母: + en); % xT0 J, fV7 v6 S. EncodeTest.printByteLength(en, GB2312); 3 z! / t 9 j5 B) u, E EncodeTest.printByteLength(en, GBK); EncodeTest.printByteLength(en, GB18030); EncodeTest.printByteLength(en, ISO-8859-1); EncodeTest.printByteLength(en, UTF-8); EncodeTest.printByteLength(en, UTF-16); EncodeTest.printByteLength(en, UTF-16BE); ( r+ Q7 J5 D EncodeTest.printByteLength(en, UTF-16LE); System.out.println(); 2 $ w7 L! W2 sSr W / 计算一个中文汉字在各种编码下的字节数 System.out.println(中文汉字: + ch); EncodeTest.printByteLength(ch, GB2312); EncodeTest.printByteLength(ch, GBK); EncodeTest.printByteLength(ch, GB18030); EncodeTest.printByteLength(ch, ISO-8859-1); 5 a1 N( N; 9 d EncodeTest.printByteLength(ch, UTF-8); K! w; T2 D7 0 A y2 k c4 c EncodeTest.printByteLength(ch, UTF-16); $ 2 s& l! V0 I9 a E& w8 kw EncodeTest.printByteLength(ch, UTF-16BE); EncodeTest.printByteLength(ch, UTF-16LE); 4 y8 5 R1 E$ 3 3 T7 g $ R$ Q3 T q1 a6 p# o运行结果如下:1、英文字母:A2、字节数:1;编码:GB23123、字节数:1;编码:GBK4、字节数:1;编码:GB180301 o|K* y4 c9 a( I& L5、字节数:1;编码:ISO-8859-1 h, 8 G & R4 | q6、字节数:1;编码:UTF-8/ Q$ U0 O- U1 8 i Q p g7、字节数:4;编码:UTF-16( F. v0 | v4 j5 T8、字节数:2;编码:UTF-16BE- c3 j5 D# a* J9、字节数:2;编码:UTF-16LE10、11、中文汉字:人12、字节数:2;编码:GB2312* . l; Q8 z: $ a( t9 y13、字节数:2;编码:GBK14、字节数:2;编码:GB1803015、字节数:1;编码:ISO-8859-116、字节数:3;编码:UTF-8: x- & 6 L1 n! B17、字节数:4;编码:UTF-1618、字节数:2;编码:UTF-16BE19、字节数:2;编码:UTF-16LE4 n; T# k, z. ws) Y4 A2 J8 x4 UTF-16BE和UTF-16LE是UNICODE编码家族的两个成员。UNICODE标准定义了UTF-8、UTF-16、UTF-32三种编码格式,共有UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE七种编码方案。JAVA所采用的编码方案是UTF-16BE。从上例的运行结果中我们可以看出,GB2312、GBK、GB18030三种编码格式都可以满足题目的要求。下面我们就以GBK编码为例来进行解答。我们不能直接使用String类的substring(int beginIndex, int endIndex)方法,因为它是按字符截取的。我和Z都被作为一个字符来看待,length都是1。实际上我们只要能区分开中文汉字和英文字母,这个问题就迎刃而解了,而它们的区别就是,中文汉字是两个字节,英文字母是一个字节。! M: L+ _4 g4 U* ?Java代码 C4 Q/ O/ F4 t! U5 h, nimport java.io.UnsupportedEncodingException; O* n1 X1 Z% s x3 t Y apublic class CutString ; D; v Y0 Y0 O7 . q, 2 Y* x- U0 I3 I3 n F+ k /* * 判断是否是一个中文汉字: T$ H$ J3 B! F* W! x( | * * param c. U7 _ v z2 wL * 字符 * return true表示是中文汉字,false表示是英文字母 * throws UnsupportedEncodingException * 使用了JAVA不支持的编码格式 */ public static boolean isChineseChar(char c) 3 e8 c* f* J5 I* G7 N. P# throws UnsupportedEncodingException 9 d& + $ d w$ Q8 d / 如果字节数大于1,是汉字 / 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了 % X! & t, k7 d# ?0 K1 Q9 O! _ return String.valueOf(c).getBytes(GBK).length 1; m 8 g: L4 I; . E t( 9 : v: B* P, M2 T& ( Q /*9 4 Y( g; t: A- / A * 按字节截取字符串: b9 g T4 P) H5 n * X# ?) U3 q3 wP) a) p * param orignal * 原始字符串: ?0 o9 Z+ R+ K* g * param count * 截取位数 * return 截取后的字符串 * throws UnsupportedEncodingException5 / r6 r z& 2 D * 使用了JAVA不支持的编码格式+ y5 d5 E, i& Zx; P9 I5 */3 A# d/ & ?4 |# a% j public static String substring(String orignal, int count) ) ) B* U+ T2 Z$ h/ _& - throws UnsupportedEncodingException . x: R/ 1 H) ?2 l1 z- , D / 原始字符不为null,也不是空字符串 , J: J! Z3 R7 l, z% I if (orignal != null & !.equals(orignal) / 将原始字符串转换为GBK编码格式 orignal = new String(orignal.getBytes(), GBK); / 要截取的字节数大于0,且小于原始字符串的字节数 if (count 0 & count orignal.getBytes(GBK).length) StringBuffer buff = new StringBuffer(); char c; * B/ q. a% | for (int i = 0; i count; i+) c = orignal.charAt(i); & N5 Z& b) S6 + G* I7 d! F& R buff.append(c); if (CutString.isChineseChar(c) 4 _- w F& u& v 5 f1 / 遇到中文汉字,截取字节总数减1 7 g5 C& $ F% w5 o0 W( r6 M/ o. c -count; ( A8 A, Z! d+ K: x0 A3 y9 w* w5 / v+ g! P/ |; J2 |* p return buff.toString(); return orignal; 3 _2 U* E$ y, I9 & |; |+ x5 L, o8 d+ D6 w6 X- oY public static void main(String args) 2 D. f5 g. i1 t, V4 t5 h O / 原始字符串 * h: z% f! G,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论