![](/img/trans.png)
[英]What actually happens when using FileInputStream instead of FileReader?
[英]What actually happens when using char toUpperCase
我想確保我真正了解使用.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);
感謝每個人都以簡單和高度詳細的答案回答。 非常感激。
否。請參見http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html 。 toUpperCase
的簽名是
public static char toUpperCase(char ch)
換句話說,有一個char
進入,一個char
出來。 在您的示例中,根本沒有自動裝箱或自動拆箱。
除了其他答案,源代碼:
字符庫
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;
}
如您所見:裝箱/拆箱事件沒有發生。
在內部, toUpperCase
使用CharacterData
及其子類(私有包)來查找從小寫字符到大寫字母的映射。
實際上,大多數內部操作都是使用int
變量完成的。 轉換不涉及任何包裝器類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.