자바 면접 학습 노트 String

String 의 length()방법 과 배열 의 length 속성 String 류 는 length()방법 이 있 습 니까?배열 에 length()방법 이 있 습 니까?String 류 는 당연히 length()방법 이 있 습 니 다.String 류 의 소스 코드 를 보면 알 수 있 습 니 다.이것 은 이 방법의 정의 입 니 다.
public int length() {
return count;
}

 String 의 길 이 는 실제 속성 인 char 형 배열 value 의 길이 입 니 다.배열 은 length()방법 이 없습니다.JAVA 에서 배열 도 대상 으로 처리 되 고 그 방법 은 모두 Object 류 에서 계승 되 는 것 을 잘 알 고 있 습 니 다.배열 에는 하나의 속성 length 가 있 습 니 다.이것 도 유일한 속성 입 니 다.모든 유형의 배열 에 대해 서 는 이 렇 습 니 다.중국어 한 자 는 char 에 중국어 한 자 를 저장 하면 char 형식 에 저장 할 수 있 습 니까?
public class ChineseTest {
public static void main(String[] args) {
//             char  
char a = ' ';
char b = ' ';
char c = ' ';
char d = ' ';
char e = ' ';
char f = ' ';
System.out.print(a);
System.out.print(b);
System.out.print(c);
System.out.print(d);
System.out.print(e);
System.out.print(f);
}
}

 컴 파일 이 틀 리 지 않 았 습 니 다.실행 결과:1.중국어 테스트 성공 답 은 말 할 필요 가 없습니다.왜 중국어 한 자 를 char 변수 에 저장 할 수 있 습 니까?JAVA 에서 하나의 char 는 2 개의 바이트(byte)이 고,하나의 중국어 한 자 는 하나의 문자 이자 2 개의 바이트 이기 때문이다.한편,영문 자 모 는 모두 하나의 바이트 이기 때문에 하나의 byte 에 저장 할 수 있 지만 중국어 한 자 는 할 수 없다.보 세 요:
public class ChineseTest {
public static void main(String[] args) {
//             byte  
byte a = 'a';
//             byte   ,     
// byte b = ' ';
System.out.println("byte a = " + a);
// System.out.println("byte b = "+b);
}
}

 실행 결과:1.byte a=97.보시 다시 피 저 희 는 문자'a'에 대응 하 는 ASCII 코드 값 을 byte 형 변수 a 에 할당 하 였 습 니 다.우리 고 개 를 돌려 최초의 예 를 살 펴 보 자.a,b,c,d,e,f 를 한데 연결 해서 출력 할 수 있 을 까?한번 해 봅 시다.
public class ChineseTest {
public static void main(String[] args) {
//             char  
char a = ' ';
char b = ' ';
char c = ' ';
char d = ' ';
char e = ' ';
char f = ' ';
System.out.print(a + b + c + d + e + f);
}
}

  운행 결과:156035 이것 은 분명히 우리 가 원 하 는 결과 가 아니다.그 렇 기 때문에'+'연산 자 를 잘못 사 용 했 기 때 문 입 니 다.문자열 과 문자열 사이,또는 문자열 과 다른 유형의 변수 사이 에 사 용 될 때 그 효 과 는 문자열 의 조합 입 니 다.그러나 문자 와 문자 사이 에 사 용 될 때 효 과 는 숫자 와 숫자 사이 에 사용 되 는 산술 연산 과 같다.그래서 우리 가 얻 은'156035'는'중','문','측','시','성','공'이라는 여섯 한자 가 각각 대응 하 는 수치 산술 을 더 한 결과 이다.문자열 의 반전 출력 도 면접 문제 에서 자주 보 는 것 이다.우 리 는 26 개의 영문 자 모 를 모두 포함 하 는 동시에 완전한 의 미 를 가 진 가장 짧 은 문장 을 예 로 들 어 해답 을 완성 했다.먼저 이 문장 을 살 펴 보 자.
가장 많이 사용 되 는 방법 은 각 위치의 문 자 를 역방향 으로 꺼 낸 다음 콘 솔 에 출력 하 는 것 입 니 다.
 
public class StringReverse {
public static void main(String[] args) {
//      
String s = "A quick brown fox jumps over the lazy dog.";
System.out.println("      :" + s);
System.out.print("      :");
for (int i = s.length(); i > 0; i--) {
System.out.print(s.charAt(i - 1));
}
//             ,        
char[] data = s.toCharArray();
System.out.println();
System.out.print("      :");
for (int i = data.length; i > 0; i--) {
System.out.print(data[i - 1]);
}
}
}

 
 실행 결과:1.원본 문자열:A quick brown fox jumps over the lazy dog.2.반전 후 문자열:.god yzal eht revo spmuj xof nworb kciuq A3.반전 후 문자열:.god yzal eht revo spmuj xof nworb kciuq A 이상 두 가지 방식 이 자주 사용 되 지만 가장 쉬 운 방식 은 아 닙 니 다.더 쉬 운 것 은 기 존의 방법 을 사용 하 는 것 입 니 다.
public class StringReverse {
public static void main(String[] args) {
//      
String s = "A quick brown fox jumps over the lazy dog.";
System.out.println("      :" + s);
System.out.print("      :");
StringBuffer buff = new StringBuffer(s);
// java.lang.StringBuffer  reverse()          
System.out.println(buff.reverse().toString());
}
}

  실행 결과:1.원본 문자열:A quick brown fox jumps over the lazy dog.2.반전 후 문자열:.god yzal eht revo spmuj xof nworb kciuq A
중국어 한자 가 들 어 있 는 문자열 을 바이트 별로 자 르 는 방법 을 요구 합 니 다.예 를 들 어 문자열 인'나 ZWR 은 JAVA 를 사랑 합 니 다'에 대해 서 는'나 ZW'가 아니 라'나 ZWR'이 어야 합 니 다.그리고 한자 반 을 자 르 는 상황 이 발생 하지 않도록 해 야 합 니 다.영문 자모 와 중국어 한 자 는 서로 다른 인 코딩 형식 에서 차지 하 는 바이트 수 도 다르다.우 리 는 아래 의 예 를 통 해 흔히 볼 수 있 는 인 코딩 형식 에서 하나의 영문 자모 와 하나의 중국어 한 자 는 각각 몇 바이트 를 차지 하 는 지 볼 수 있다.
import java.io.UnsupportedEncodingException;
public class EncodeTest {
/**
*                         
*
* @param s
*    
* @param encodingName
*     
*/
public static void printByteLength(String s, String encodingName) {
System.out.print("   :");
try {
System.out.print(s.getBytes(encodingName).length);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(";  :" + encodingName);
}
public static void main(String[] args) {
String en = "A";
String ch = " ";
//                   
System.out.println("    :" + en);
EncodeTest.printByteLength(en, "GB2312");
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");
EncodeTest.printByteLength(en, "UTF-16LE");
System.out.println();
//                   
System.out.println("    :" + ch);
EncodeTest.printByteLength(ch, "GB2312");
EncodeTest.printByteLength(ch, "GBK");
EncodeTest.printByteLength(ch, "GB18030");
EncodeTest.printByteLength(ch, "ISO-8859-1");
EncodeTest.printByteLength(ch, "UTF-8");
EncodeTest.printByteLength(ch, "UTF-16");
EncodeTest.printByteLength(ch, "UTF-16BE");
EncodeTest.printByteLength(ch, "UTF-16LE");
}
}

 
실행 결 과 는 다음 과 같다.1.영문 자모:A2.바이트 수:1;인 코딩:GB 23123.바이트 수:1;인 코딩:GBK 4.바이트 수:1;인 코딩:GB 180305.바이트 수:1;인 코딩:ISO-8859-16.바이트 수:1;인 코딩:UTF-87.바이트 수:4;인 코딩:UTF-168.바이트 수:2;인 코딩:UTF-16BE 9.바이트 수:2;인 코딩:UTF-16LE 10.11.중국어 한자:사람 12.바이트 수:2;인 코딩:GB 231213.바이트 수:2;인 코딩:GBK 14.바이트 수:2;인 코딩:GB 1803015.바이트 수:1;인 코딩:ISO-8859-116.바이트 수:3;인 코딩:UTF-817.바이트 수:4;인 코딩:UTF-1618.바이트 수:2;인 코딩:UTF-16BE 19.바이트 수:2;인 코딩:UTF-16LEUTF-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 7 가지 인 코딩 방안 이 있다.JAVA 가 채택 한 인 코딩 방안 은 UTF-16BE 다.상례 의 운행 결과 에서 알 수 있 듯 이 GB 2312,GBK,GB 18030 세 가지 인 코딩 형식 은 모두 문제 의 요 구 를 만족 시 킬 수 있다.다음은 GBK 인 코딩 을 예 로 들 어 해답 을 드 리 겠 습 니 다.우리 가 직접 바이트 로 캡 처 하면 어떤 상황 이 벌 어 질 까?테스트 해 보 겠 습 니 다.
import java.io.UnsupportedEncodingException;
public class CutString {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = " ZWR JAVA";
//   GBK        
byte[] data = s.getBytes("GBK");
byte[] tmp = new byte[6];
//  data           tmp   
System.arraycopy(data, 0, tmp, 0, 6);
//                       
s = new String(tmp);
System.out.println(s);
}
}

 출력 결과:1.나 ZWR?앞의 여섯 개의 바 이 트 를 캡 처 할 때 두 번 째 한자 인'사랑'이 절반 으로 잘 려 서 정상적으로 나타 나 지 못 하 는 것 은 분명 문제 가 있다.문자 로 캡 처 되 었 기 때문에 String 류 의 substring(int beginIndex,int endIndex)방법 을 직접 사용 할 수 없습니다.나 와'Z'는 모두 하나의 문자 로 취급 되 고 length 는 모두 1 이다.실제로 우 리 는 중국어 한자 와 영문 자 모 를 구분 할 수 있다 면 이 문 제 는 쉽게 풀 릴 것 이다.그들의 차 이 는 바로 중국어 한 자 는 두 개의 바이트 이 고 영문 자 모 는 하나의 바이트 이다.
import java.io.UnsupportedEncodingException;
public class CutString {
/**
*            
*
* @param c
*   
* @return true       ,false       
* @throws UnsupportedEncodingException
*    JAVA        
*/
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
//        1,   
//                        ,       ,
         
return String.valueOf(c).getBytes("GBK").length > 1;
}
/**
*         
*
* @param orignal
*      
* @param count
*     
* @return        
* @throws UnsupportedEncodingException
*    JAVA        
*/
public static String substring(String orignal, int count)
throws UnsupportedEncodingException {
//       null,       
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;
for (int i = 0; i < count; i++) {
// charAt(int index)             
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
//       ,       1
--count;
}
}
return buff.toString();
}
}
return orignal;
}
public static void main(String[] args) {
//      
String s = " ZWR JAVA";
System.out.println("     :" + s);
try {
System.out.println("   1 :" + CutString.substring(s, 1));
System.out.println("   2 :" + CutString.substring(s, 2));
System.out.println("   4 :" + CutString.substring(s, 4));
System.out.println("   6 :" + CutString.substring(s, 6));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

 
실행 결과:1.원본 문자열:나 ZWR 사랑 JAVA 2.앞 자리 캡 처:나 3.앞 자리 캡 처:나 4.앞 자리 캡 처:나 ZW5.앞 자리 캡 처:나 ZWR 사랑

좋은 웹페이지 즐겨찾기