0

.toUpperCase を使用すると何が起こっているのかを実際に理解していることを確認したいと思います。これは正常に動作するコードです。私のコメントが何が起こっているのかを正しく説明しているかどうかを知りたいだけです。

char first = 'j';   //Declare char variable & initialize it's value: j

/* toUpperCase method of the Character Class Wrapper is invoked
 * char primitives are autoboxed to Character Objects
 * toUpperCase method unboxes the converted Characters to char primitives
 */

char firstUp = Character.toUpperCase(first);

シンプルで非常に詳細な回答の両方で回答してくれた皆さんに感謝します。とても有難い。

4

3 に答える 3

2

いいえ。 http://docs.oracle.com/javase/7/docs/api/java/lang/Character.htmlを参照してください。の署名toUpperCase

public static char toUpperCase(char ch)

つまり、acharが入り、acharが出てきます。あなたの例では、オートボクシングまたはオートアンボクシングはまったく発生しません。

于 2013-11-08T02:00:30.683 に答える
1

他の回答に加えて、ソースコード:

Character.java

public static char toUpperCase(char ch) {
    return (char)toUpperCase((int)ch);
}

public static int toUpperCase(int codePoint) {
    return CharacterData.of(codePoint).toUpperCase(codePoint);
}

CharacterData.java

static final CharacterData of(int ch) {
    if (ch >>> 8 == 0) {     // fast-path
        return CharacterDataLatin1.instance;
    } else {
        switch(ch >>> 16) {  //plane 00-16
        case(0):
            return CharacterData00.instance;
        case(1):
            return CharacterData01.instance;
        case(2):
            return CharacterData02.instance;
        case(14):
            return CharacterData0E.instance;
        case(15):   // Private Use
        case(16):   // Private Use
            return CharacterDataPrivateUse.instance;
        default:
            return CharacterDataUndefined.instance;
        }
    }
}

CharacterData00.java (例)

int toUpperCase(int ch) {
    int mapChar = ch;
    int val = getProperties(ch);

    if ((val & 0x00010000) != 0) {
      if ((val & 0x07FC0000) == 0x07FC0000) {
        switch(ch) {
          // map chars with overflow offsets
        case 0x00B5 : mapChar = 0x039C; break;
        case 0x017F : mapChar = 0x0053; break;
        case 0x1FBE : mapChar = 0x0399; break;
          // map char that have both a 1:1 and 1:M map
        case 0x1F80 : mapChar = 0x1F88; break;
        case 0x1F81 : mapChar = 0x1F89; break;
        case 0x1F82 : mapChar = 0x1F8A; break;
        case 0x1F83 : mapChar = 0x1F8B; break;
        case 0x1F84 : mapChar = 0x1F8C; break;
        case 0x1F85 : mapChar = 0x1F8D; break;
        case 0x1F86 : mapChar = 0x1F8E; break;
        // Many more
       }
      }
      else {
        int offset = val  << 5 >> (5+18);
        mapChar =  ch - offset;
      }
    }
    return mapChar;
}

ご覧のとおり、ボックス化/ボックス化解除はまったく発生しません。

于 2013-11-08T02:06:53.037 に答える
0

およびそのサブクラス (パッケージ プライベート) を内部的にtoUpperCase使用CharacterDataして、小文字から対応する大文字へのマッピングを見つけます。

実際、ほとんどの内部操作はint変数を使用して行われます。変換に関与するラッパーの型はありません。

于 2013-11-08T02:08:32.223 に答える