最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中String使用方法及分析(UTF-8簡(jiǎn)單編碼/解碼器實(shí)現(xiàn))

 更新時(shí)間:2025年12月01日 09:48:27   作者:森林公園  
在Java中String類是用來(lái)表示和操作字符串的,它是Java中最常用的類之一,提供了豐富的方法來(lái)創(chuàng)建、操作和查詢字符串,這篇文章主要介紹了Java中String使用方法及分析(UTF-8簡(jiǎn)單編碼/解碼器實(shí)現(xiàn))的相關(guān)資料,需要的朋友可以參考下

0. Java中的字符串(String)

在 Java 語(yǔ)言中,字符串即 字符序列(這里的字符可以是一個(gè)英文字母例如 ‘A’,也可以是一個(gè)漢字例如 ‘楠’,也可以是一個(gè)韓語(yǔ)文字例如 ‘?’,也可以是一個(gè) emoji 表情符號(hào)例如 ‘?’ 或 ‘?’)。原生類型 char 用來(lái)定義一個(gè)字符變量,char 類型字符變量用于保存一個(gè)字符。String 類型用來(lái)表示一個(gè)字符串,Java 中所有字符串字面量都是 String 類型的對(duì)象實(shí)例,而 String 類內(nèi)部使用 char 類型的數(shù)組保存組成該字符串的字符序列,String 并沒(méi)有提供修改字符串即 字符序列的方法,但這并不因?yàn)椴荒茏龅?。下面是一個(gè) String 類的構(gòu)造器方法,如下:

public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

可見該方法使用一個(gè) String 類型的實(shí)例對(duì)象初始化/創(chuàng)建另一個(gè) String 對(duì)象,它們內(nèi)部都指向同一個(gè)字符序列,這是通常我們創(chuàng)建一個(gè) String 類型對(duì)象實(shí)例的方式之一:

String str = new String("this is string");

可見,下面的直接賦值的方法更簡(jiǎn)潔/高效一點(diǎn):

String str = "this is string";

Java中的字符串并非不能修改,下面的例子使用反射來(lái)修改字符串對(duì)象的值:

import java.lang.reflect.Field;

public class Test3 {
	public static void main(String[] args) throws NoSuchFieldException, 
	SecurityException, IllegalArgumentException, IllegalAccessException {
		String str1 = "真楠人";
		String str2 = "真楠人";
		// 打印字符串 str1 和 str2
		System.out.println("str1: " + str1 + ", str2: " + str2);
		// 通過(guò)反射更改字符串 str1 的值
		Field valueField = String.class.getDeclaredField("value");
		assert valueField != null;
		valueField.setAccessible(true);
		char[] value = (char[]) valueField.get(str1);
		value[0] = '假';
		// 再次打印字符串 str1
		System.out.println("str1: " + str1 + ", str2: " + str2);
	}
}

代碼執(zhí)行結(jié)果如下:

str1: 真楠人, str2: 真楠人
str1: 假楠人, str2: 假楠人

上述程序中,我們通過(guò)反射方法僅僅修改了字符串 str1 的內(nèi)容,但是最后字符串 str2 的內(nèi)容也一起改變了,原因在于 str1 和 str2 都是引用同一個(gè)字符串對(duì)象(字符串字面量 “真楠人” 為一個(gè) String 類型的對(duì)象實(shí)例,雖然這個(gè)字面量在代碼中出現(xiàn)多次,但是都是引用了同一個(gè) String 實(shí)例,可見相同字符序列的字符串共享同一個(gè) String 實(shí)例,即 共享字符串,這也解釋了為什么 String 類沒(méi)有提供修改字符串的公共方法以及String 類被設(shè)計(jì)為 final 類,都是為了共享字符串),這并不難理解。

1. Java中的字符(char)

下面的程序打印一個(gè)字符 ‘楠’ 字:

public class Temp_3 {
	public static void main(String[] args) {
		System.out.println('楠');
		System.out.println((char)26976);
		System.out.println('\u6960');
	}
}

運(yùn)行結(jié)果為:



可見,三次打印輸出的結(jié)果都一樣。Java 語(yǔ)言使用 Unicode 字符集,Unicode 為每一個(gè)字符都分配的一個(gè)唯一的數(shù)字,即 這個(gè)數(shù)字便代表與之對(duì)應(yīng)的字符,其中 ‘\u6960’ 即為字符 ‘楠’ 的 Unicode 十六進(jìn)制編碼,而十進(jìn)制數(shù) 26976 則為這個(gè)十六進(jìn)制數(shù)的十進(jìn)制數(shù)值,它倆是同一個(gè)數(shù)值的不同表示方式而已。

我們知道 ASCII 字符集中,字符 ‘A’ 的編號(hào)為 65,即 可以對(duì) 65 進(jìn)行強(qiáng)制類型轉(zhuǎn)換即可得到其對(duì)應(yīng)的字符 ‘A’。數(shù)值 65 使用一個(gè)字節(jié)便可存儲(chǔ),顯然對(duì)于字符 ‘楠’(對(duì)應(yīng)數(shù)值為 26976) 一個(gè)字節(jié)無(wú)法存儲(chǔ),那么它需要多少個(gè)字節(jié)才合適呢?

我們可以看看其它編程語(yǔ)言中的情況,在 C 語(yǔ)言中也有一個(gè) char 數(shù)據(jù)類型,但是它僅僅表示一個(gè)字節(jié)的空間,看下面的 C 語(yǔ)言中的例子:

#include <stdio.h>
void main(){
    char c = '楠'; // 一個(gè)字節(jié)
    printf("%c, %d, size=%ld\n", c, c, sizeof c);
    char c2 = 'A'; // 一個(gè)字節(jié)
    printf("%c, size=%ld\n", c2, sizeof c2);
    char c3[] = "楠"; // 字符串
    printf("%s, size=%ld\n", c3, sizeof c3);
    char c4[] = "真楠人"; // 字符串
    printf("%s, size=%ld\n", c4, sizeof c4);
}

執(zhí)行結(jié)果如下:

ubuntu@cuname:~/dev/beginning-linux-programming/temp$ gcc -o use-char-string-test use-char-string-test.c
use-char-string-test.c: In function ‘main':
use-char-string-test.c:4:14: warning: multi-character character constant [-Wmultichar]
     char c = '楠';
              ^
use-char-string-test.c:4:14: warning: overflow in implicit constant conversion [-Woverflow]
ubuntu@cuname:~/dev/beginning-linux-programming/temp$ ./use-char-string-test
?, -96, size=1			// c
A, size=1				// c2
楠, size=4				// c3
真楠人, size=10			// c4

可以看到,將字符 ‘楠’ 賦值給 char 類型的變量時(shí),gcc 編譯器警告提示字符 ’楠‘ 為多字節(jié)字符常量,而變量 c 僅僅存儲(chǔ)了字符 ’楠‘ 的一個(gè)字節(jié)的數(shù)據(jù)(且其數(shù)值為 -96,-96 是字符 ‘楠’ 字編碼后的字節(jié)序列中的一個(gè)字節(jié),變量 c 顯示亂碼),繼續(xù)查看后續(xù)的輸出結(jié)果,發(fā)現(xiàn)字符 ’A‘ 的長(zhǎng)度為 1 個(gè)字節(jié),而每個(gè)漢字占 3 個(gè)字節(jié)的存儲(chǔ)空間(C 語(yǔ)言中的字符串字面量的內(nèi)部實(shí)現(xiàn)為 char 類型的數(shù)組,且以一個(gè)空字符 ’\0‘表示字符串結(jié)尾,所以 sizeof 計(jì)算的字符串長(zhǎng)度(即 字節(jié)數(shù))比實(shí)際長(zhǎng)度多一個(gè)字節(jié))。3 個(gè)字節(jié)能表示的最大數(shù)值為 ’2的24次方‘ - 1 = 16777215,遠(yuǎn)遠(yuǎn)大于 26976(即字符 ’楠‘ 對(duì)應(yīng)的數(shù)字),其實(shí) 2 個(gè)字節(jié)就足以存儲(chǔ)數(shù)值 26976(即字符 ’楠‘),而實(shí)際上字符 ’楠‘ 卻占用了 3 個(gè)字節(jié)空間,這是為啥?這與字符(即 數(shù)值)的編碼(即 存儲(chǔ))方式有關(guān),我們知道 Unicode 給每個(gè)字符分配一個(gè)唯一的數(shù)值來(lái)代表該字符,例如任一一篇文章很可能會(huì)有多個(gè)字符,但是在存儲(chǔ)或傳輸該文章時(shí),并不能就直接依次存儲(chǔ)或傳輸與每個(gè)字符對(duì)應(yīng)的十進(jìn)制數(shù)字序列,這里需要考慮 2 個(gè)問(wèn)題,第一如何從數(shù)字序列中識(shí)別一個(gè)字符,即每個(gè)字符的 ‘數(shù)字表示’ 其自身應(yīng)當(dāng)是一個(gè)整體,必須與其它的數(shù)字即與其相鄰的數(shù)字區(qū)分開,第二個(gè)問(wèn)題:成本,字符 ‘A’ 使用 1 個(gè)字節(jié)即可存儲(chǔ),但是字符 ‘楠’ 卻要使用至少 2 個(gè)字節(jié)才能滿足,這時(shí),如果要求每個(gè)字符都是使用例如 2 個(gè)字節(jié)存儲(chǔ),那么對(duì)于英語(yǔ)國(guó)家的用戶來(lái)說(shuō),相當(dāng)于增加并浪費(fèi)了 1 倍的成本,這是不能被接受!UTF-8 便是一種可變長(zhǎng)度的 Unicode 字符編碼解決方案,且被應(yīng)用于 Java 語(yǔ)言,于是求助于 UTF-8(即 Unicode Transformation Format 8-bit,)。

2. UTF-8編碼

  • 參考鏈接UTF-8 and Unicode
  • 下面是對(duì)UTF-8編碼-規(guī)范文檔的解讀(需要注意區(qū)分,Unicode 只是一個(gè)字符集,它為每個(gè)字符分配一個(gè)唯一的數(shù)字,從而可以用數(shù)字來(lái)表達(dá)字符,而 UTF-8 是一種編碼方式,描述怎樣實(shí)際存儲(chǔ)Unicode 字符對(duì)應(yīng)的數(shù)值)
  1. UTF-8 兼容 ASCII 字符集,即 將編號(hào) 0 - 127 留給 ASCII 字符集,這里(ASCII 字符集)總共 128 個(gè)數(shù)字(即 字符),使用 7 個(gè) bit 的空間即可表示,每個(gè) ASCII 字符占用一個(gè)字節(jié),且該字節(jié)的最高位始終為 0,反過(guò)來(lái),在 UTF-8 編碼中,最高位為 0 的字節(jié)始終表示一個(gè) ASCII 字符。
  2. UTF-8 使用 1 - 4 個(gè)字節(jié)來(lái)編碼 Unicode 字符對(duì)應(yīng)的數(shù)字編號(hào),規(guī)則如下圖

    上圖與 UTF-8 規(guī)范文檔中的圖有點(diǎn)不同:即 可編碼的最大值不同,文檔圖如下:

    再回到前面說(shuō)的字符 ‘楠’ 字,該字符的 Unicode 編號(hào)為 26976,而 26976 位于 2048 和 65535 之間,所以它使用 3 個(gè)字節(jié)進(jìn)行編碼并存儲(chǔ)。在進(jìn)行編碼時(shí),只需將 26976 的二進(jìn)制碼從低位到高位依次填入‘可用編碼位’ 即可得到字符 ‘楠’ 對(duì)應(yīng)的 UTF-8 編碼,操作如下圖:


    驗(yàn)證,使用 notepad++ 新建一個(gè)文本文件,并寫入字符 ‘楠’ 字(注意,使用 utf-8編碼),保存文件,然后使用 WinHex 打開該文本文件,結(jié)果如下:

    可見,結(jié)果正確。
  3. 上面是編碼一個(gè)字符,下面從 以UTF-8 編碼的字節(jié)數(shù)據(jù)中進(jìn)行解碼(解碼是編碼的反向操作,編碼是將數(shù)值位依次插入到對(duì)應(yīng)的可編碼位,解碼時(shí)則從可編碼位提取對(duì)應(yīng)的數(shù)值位并將它們拼接在一起,從而還原出原來(lái)的數(shù)值)。綜上可以發(fā)現(xiàn),以 UTF-8 編碼的數(shù)據(jù),其字節(jié)類型總共有 5 種,其中只有 4 中類型的字節(jié)是可作為一個(gè) UTF-8 編碼的起始字節(jié)(即標(biāo)識(shí)一個(gè)字符編碼的開始),如下圖:


    思路:將數(shù)值 240(即 ‘1111 0000’)與任意字節(jié)作 ‘&’ (即 ‘與’)位操作,其結(jié)果必定落在上圖中的某個(gè)取值范圍中,從而可以決定當(dāng)前字節(jié)的類型(是否為一個(gè)字符編碼的起始字節(jié))。
    簡(jiǎn)單 UTF-8 解碼器 Java 實(shí)現(xiàn),代碼如下:
/** 簡(jiǎn)單 UTF-8 解碼器(實(shí)際應(yīng)用中,可能必須要注意/處理無(wú)效字符 即無(wú)效 unicode code-point 的情況) */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Random;

public class UTF_8_decoder {
	/** 1M,用于緩存數(shù)據(jù) */
	private static final int BUFFER_SIZE = 1024 * 1024;
	/** 文本文件 */
	private static final String filePath = "C:/Users/jokee/Desktop/data-for-test.txt";

	public static void main(String[] args) throws IOException {
		File file = new File(filePath);
		FileInputStream fileReader = new FileInputStream(file);
		/** 用于緩存文件字節(jié)數(shù)據(jù) 即 緩存待解碼的數(shù)據(jù) */
		byte[] buffer = new byte[BUFFER_SIZE];
		/** 緩存所有數(shù)據(jù) */
		final int bytesLength = fileReader.read(buffer, 0, buffer.length);
		String result = doDecoding(buffer, bytesLength);
		// 打印結(jié)果
		System.out.println("解碼字符如下:\n" + "---------------------------------------------\n"
				+ result);
		fileReader.close();
	}

	/**
	 * 執(zhí)行解碼操作,默認(rèn)大端字節(jié)序
	 * 
 bytes : 待解碼字節(jié)緩沖區(qū)
	 * 
 bytesLength :緩沖區(qū) bytes 中,待解碼的字節(jié)總數(shù)
	 */
	public static String doDecoding(byte[] bytes, int bytesLength) {
		/** 保存解碼后的數(shù)據(jù) */
		char[] charData = null;
		int charData_index = 0;
		String result = null;

		if (bytes != null 
				&& (bytesLength = Math.min(bytesLength, bytes.length)) > 0) {
			// 1 從一個(gè)隨機(jī)位置開始解碼
//			int startIndex = new Random().nextInt(bytesLength);	
			// 2 解碼所有字節(jié)數(shù)據(jù)
			int startIndex = 0;

			/** 字符類型(參考 getType 方法) */
			int type = 0;
			/** 保存一個(gè)字符的 UTF-8 編碼 */
			byte[] encodedCharData = new byte[4];
			int encodedCharData_index = 0;
			// 初始化
			charData = new char[BUFFER_SIZE];

			for (; startIndex < bytesLength; ++startIndex) {
				if (encodedCharData_index == 0 && (type = getType(bytes[startIndex])) < 0) {
					// 直到找到一個(gè) UTF-8 編碼的起始字節(jié)為止
					continue;
				}
				// 讀取一個(gè)字符的編碼
				encodedCharData[encodedCharData_index++] = bytes[startIndex];
				if (encodedCharData_index < type) {
					// 繼續(xù)讀取該字符剩余的其它字節(jié)
					continue;
				}
				// 解碼一個(gè)字符
				if (type == 1) {
					// 1
					// ascii 字符
					charData[charData_index++] = (char) Byte.toUnsignedInt(encodedCharData[0]);
				} else if (type == 2) {
					// 2
					// 提取第一個(gè)字節(jié),屏蔽前 3 個(gè) bit
					int b1 = 0b00011111 & Byte.toUnsignedInt(encodedCharData[0]);
					// 提取第二個(gè)字節(jié),屏蔽前 2 個(gè) bit
					int b2 = 0b00111111 & Byte.toUnsignedInt(encodedCharData[1]);
					int aChar = (b1 << 6) | b2;
					charData[charData_index++] = (char)aChar;
				} else if (type == 3) {
					// 3
					// 提取第一個(gè)字節(jié),屏蔽前 4 個(gè) bit
					int b1 = 0b00001111 & Byte.toUnsignedInt(encodedCharData[0]);
					// 提取第二個(gè)字節(jié),屏蔽前 2 個(gè) bit
					int b2 = 0b00111111 & Byte.toUnsignedInt(encodedCharData[1]);
					// 提取第三個(gè)字節(jié),屏蔽前 2 個(gè) bit
					int b3 = 0b00111111 & Byte.toUnsignedInt(encodedCharData[2]);
					int aChar = (b1 << 12) | (b2 << 6) | b3;
					charData[charData_index++] = (char)aChar;
				} else if (type == 4) {
					// 4
					// 提取第一個(gè)字節(jié),屏蔽前 3 個(gè) bit
					int b1 = 0b00000111 & Byte.toUnsignedInt(encodedCharData[0]);
					// 提取第二個(gè)字節(jié),屏蔽前 2 個(gè) bit
					int b2 = 0b00111111 & Byte.toUnsignedInt(encodedCharData[1]);
					// 提取第三個(gè)字節(jié),屏蔽前 2 個(gè) bit
					int b3 = 0b00111111 & Byte.toUnsignedInt(encodedCharData[2]);
					// 提取第四個(gè)字節(jié),屏蔽前 2 個(gè) bit
					int b4 = 0b00111111 & Byte.toUnsignedInt(encodedCharData[3]);
					int aChar = (b1 << 18) | (b2 << 12) | (b3 << 6) | b4;
					charData[charData_index++] = (char)aChar;
				}
				// 清理工作
				// 清除已緩存且已完成解碼的字符編碼,繼續(xù)處理下一個(gè)字符編碼
				encodedCharData_index = 0;
			}
			result = new String(charData, 0, charData_index);
		}
		return result;
	}

	/**
	 * 該方法用于確認(rèn)參數(shù)字節(jié) aByte 是否為一個(gè) UTF-8 編碼的起始字節(jié), 返回值說(shuō)明, 

	 * -1:字節(jié) aByte 非起始字節(jié), 

	 * 1:起始字節(jié),類型為 1,對(duì)應(yīng)字符占 1 個(gè)字節(jié)空間(實(shí)為 ASCII 字符) 

	 * 2:起始字節(jié),類型為 2,對(duì)應(yīng)字符占 2 個(gè)字節(jié)空間 

	 * 3:起始字節(jié),類型為 3,對(duì)應(yīng)字符占 3 個(gè)字節(jié)空間 

	 * 4:起始字節(jié),類型為 4,對(duì)應(yīng)字符占 4 個(gè)字節(jié)空間
	 */
	public static int getType(byte aByte) {
		int type = 0b11110000 & aByte; // ‘0b11110000' 為十進(jìn)制數(shù) 240 的二進(jìn)制表示
		if (0 <= type && type < 128) {
			return 1;
		} else if (128 <= type && type < 192) {
			return -1;
		} else if (192 <= type && type < 224) {
			return 2;
		} else if (224 <= type && type < 240) {
			return 3;
		} else if (240 <= type && type < 248) {
			return 4;
		}
		return -1;
	}
}
  1. 既然上面有了一個(gè)簡(jiǎn)單的解碼器,再加一個(gè)編碼器也不會(huì)多余,下面是一個(gè)簡(jiǎn)單的 UTF-8 編碼器實(shí)現(xiàn)(其中的位運(yùn)算必須要細(xì)心,容易出錯(cuò)):
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/** 簡(jiǎn)單的 UTF-8 編碼器(實(shí)際應(yīng)用中,可能必須要注意/處理無(wú)效字符 即無(wú)效 unicode code-point 的情況) */
public class UTF_8_encoder {
	/** 輸出文件 */
	private static final String filePath = "C:/Users/jokee/Desktop/data-for-test.txt";
	
	public static void main(String[] args) throws IOException {
		String text = "\u13A0,\u1B93,\u1D83,\u1F00,\u1F10,\u1910\nwo我愛wo家ya,wo愛北京天安門a,\nhei,今天又下雨了ne";
		int[] cs = new int[text.length()];
		for(int i = 0;i < text.length();i++) {
			cs[i] = text.charAt(i);
		}
		// do encoding
		Bytes bytes = doEncoding(cs, cs.length);
		// write to file
		FileOutputStream writer = new FileOutputStream(new File(filePath));
		writer.write(bytes.bytes, 0, bytes.length);
		writer.close();
		System.out.println("done.");
	}
	/** 將字符數(shù)組 chars 中的數(shù)量為 charsLength 的字符進(jìn)行編碼 */
	public static Bytes doEncoding(int[] chars, int charsLength) {
		Bytes bytes = null;
		if (chars != null && (charsLength = Math.min(chars.length, charsLength)) > 0) {
			int aChar = 0;
			int type = 0;
			/** 定義一個(gè)足夠容量的字節(jié)緩存區(qū):假設(shè)每個(gè)字符都是占用 4 個(gè)字節(jié) */
			bytes = new Bytes(4 * charsLength);
			for(int i = 0;i < charsLength;i++) {
				aChar = chars[i];
				type = getType(aChar);
				switch(type) {
				case 1:
					bytes.add((byte)aChar);
					break;
				case 2:
					{
						int code = 0b1100000010000000;
						code |= (aChar & 0b111111);
						code |= ((aChar & 0b11111000000) << 2);
						bytes.add((byte)(code >> 8));
						bytes.add((byte)code);
					}
					break;
				case 3:
					{
						int code = 0b111000001000000010000000;
						code |= (aChar & 0b111111);
						code |= ((aChar & 0b111111000000) << 2);
						code |= ((aChar & 0b1111000000000000) << 4);
						bytes.add((byte) (code >> 16));
						bytes.add((byte) (code >> 8));
						bytes.add((byte) code);
					}
					break;
				case 4:
					{
						int code = 0b11100000100000001000000010000000;
						code |= (aChar & 0b111111);
						code |= ((aChar & 0b111111000000) << 2);
						code |= ((aChar & 0b111111000000000000) << 4);
						code |= ((aChar & 0b111000000000000000000) << 6);
						bytes.add((byte) (code >> 24));
						bytes.add((byte) (code >> 16));
						bytes.add((byte) (code >> 8));
						bytes.add((byte) code);
					}
					break;
				default:
					// nothing to do.
				}
			}
		}else {
			// 返回一個(gè)空的字節(jié)緩存區(qū)
			bytes = new Bytes(0);
		}
		return bytes;
	}
	
	/**
	 * 返回值表示一個(gè)字符 aChar 的編碼空間(即 需占用的字節(jié)數(shù)),返回值如下 4 種:
	 * 
 1,表示使用 1 個(gè)字節(jié)編碼字符 aChar 對(duì)應(yīng)的數(shù)值
	 * 
 2,表示使用 2 個(gè)字節(jié)編碼字符 aChar 對(duì)應(yīng)的數(shù)值
	 * 
 3,表示使用 3 個(gè)字節(jié)編碼字符 aChar 對(duì)應(yīng)的數(shù)值
	 * 
 4,表示使用 4 個(gè)字節(jié)編碼字符 aChar 對(duì)應(yīng)的數(shù)值
	 * <b4> 如果 aChar 是無(wú)效的 UTF-8 字符,可選擇拋出異常:IllegalArgumentException,或忽略
	 */
	public static int getType(int aChar) {
		if (!Character.isValidCodePoint(aChar)) {
//			throw new IllegalArgumentException(aChar + " is invalid code point");			
			return 0;
		}
		if(0 <= aChar && aChar <= 127) {
			// a char of ascii
			return 1;
		}else if(128 <= aChar && aChar <= 2047) {
			return 2;
		}else if(2048 <= aChar && aChar <= 65535) {
			return 3;
		}else if(65536 <= aChar && aChar <= 2097151) {
			return 4;
		}else {			
//			throw new IllegalArgumentException(aChar + " is invalid code point");
			return 0;
		}
	}
	
	/** 組合一個(gè)字節(jié)緩存區(qū) bytes 及其 長(zhǎng)度值 length */
	public static class Bytes {
		private int length;
		private final int capacity;
		private byte[] bytes;
		public Bytes(int capacity) {
			this.length = 0;
			this.capacity = capacity;
			this.bytes = new byte[capacity];
		}
		/** 向該緩存區(qū)中添加一個(gè)字節(jié) */
		public void add(byte aByte) {
			if (length < capacity) {				
				bytes[length++] = aByte;
			}else {
				throw new ArrayIndexOutOfBoundsException("當(dāng)前緩存區(qū)已滿,capacity = length is " + capacity);
			}
		}
		public int getLength() {
			return length;
		}
		public byte[] getBytes() {
			return bytes;
		}
		public int getCapacity() {
			return capacity;
		}
	}
}

總結(jié) 

到此這篇關(guān)于Java中String使用方法及分析的文章就介紹到這了,更多相關(guān)Java中String使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

萨嘎县| 广汉市| 行唐县| 满洲里市| 梁平县| 宣化县| 元江| 和林格尔县| 南汇区| 新闻| 日喀则市| 环江| 都兰县| 屏边| 澎湖县| 灌南县| 利辛县| 宁化县| 长兴县| 政和县| 三穗县| 金阳县| 年辖:市辖区| 喀喇沁旗| 麟游县| 彭州市| 车险| 当阳市| 望江县| 桦南县| 报价| 绍兴市| 鄢陵县| 朝阳市| 泾川县| 镇原县| 霸州市| 延吉市| 镇康县| 宁化县| 兖州市|