這份來自「智樂軟件」的 J2ME 面試題,涵蓋 Java 基礎語法、位運算優化、JVM 機制、設計模式、遊戲開發核心、演算法優化 六大維度,極具代表性。本文將逐題拆解,提供標準答案與深度解析。
| 子題 | 代碼/問題 | 答案 | 解析重點 |
|---|---|---|---|
| a | int a=16,b=4,c=2; int expr = a + b / (c + 1) * 2; | 20 | 運算子優先級:() → * / → + - |
| b | while(n++ != 0){ expr++; n &= 3; } (n=1) | expr=3 | 後綴 ++、位元 AND、循環終止條件分析 |
| c | int a=8,b=4; int expr = a++ % ++b * 2; | 16 | 後綴/前綴 ++、% 與 * 同優先級左結合 |
| d | boolean expr = (a!=1 && (b!=2 || c==3)); | false | 短路邏輯運算子 && || 優先級 |
| e | int expr = (a>b) ? (a-b) : (b-c); (a=-3,b=2,c=-1) | 3 | 三元運算子,條件為假取後者 |
| f | int expr = 13 >> 2 << 2; | 12 | 移位運算左結合:13>>2=3, 3<<2=12 |
| g | int expr = -4321 >>> 30; | 1 | 無符號右移 >>> 補 0,負數高位 1 變 0 |
| h | int expr = 123 ^ 321 ^ 123; | 321 | XOR 自逆性:a^b^a = b |
| i | int a=255; int expr = (byte)a + ((byte)a) & 0xFFF; | 510 | byte 強制轉型符號擴展、& 0xFFF 保留 12 位 |
| j | "123454321".charAt(4) + 2 | 55 | charAt(4)='5' (ASCII 53) + 2 = 55 |
| k | 陣列原地修改迴圈 a[i+1] *= a[i] | 24 | 追蹤陣列值變化:[1,2,6,24] |
| l | 遞迴字串旋轉 func("Gameloft") | "ftGamelo" | 遞迴終止條件、substring、charAt 組合 |
| 原運算 | 位運算替代 | 原理 |
|---|---|---|
a = b * 256 | a = b << 8 | 2^8 = 256,左移 8 位 |
a = b % 16 | a = b & 0xF | 模 2^n 等價於 & (2^n-1) |
a = b / 13 | 無簡單位運算 | 13 非 2 的冪次,需乘法反向近似或查表 |
面試官意圖:考察位運算優化意識,但也測試候選人是否知道「過早優化是萬惡之源」——現代 JIT 編譯器會自動優化常數乘除。
System.gc() 建議、特定演算法閾值(如 Eden 區滿觸發 Minor GC)static 類欄位(單例模式)、依賴注入、ThreadLocal、ApplicationContext(框架層面)obfuscate 任務| 術語 | 全稱/含義 |
|---|---|
| J2ME | Java 2 Micro Edition,嵌入式/行動裝置 Java 平台 |
| Python | 動態解釯型腳本語言,常用於腳本化、AI、快速原型 |
| Ant | Java 建置自動化工具,XML 定義構建流程 |
| Javac | Java 編譯器,將 .java 編譯為 .class 字節碼 |
| CVS | Concurrent Versions System,早期版本控制系統(已被 SVN/Git 取代) |
| OpenGL | 跨平台 2D/3D 圖形渲染 API 標準 |
技術深度、解決問題能力、主動學習、溝通協作、擔當責任、工程規範意識、業務理解力。
boolean isOverlapped(int x1, int y1, int r1, int x2, int y2, int r2) {
int dx = x2 - x1;
int dy = y2 - y1;
int distSq = dx*dx + dy*dy; // 避免開根號
int rSum = r1 + r2;
return distSq <= rSum * rSum; // 距離平方 <= 半徑和平方
}
優化點:僅用整數加減乘,無浮點、無 sqrt、無分支預測失敗。
class Car {
// 物理屬性
float x, y; // 位置
float vx, vy; // 速度向量
float angle; // 朝向 (弧度)
float maxSpeed, accel, friction, turnSpeed;
// 狀態
boolean accelerating, braking, turningLeft, turningRight;
// 視覺
Image sprite;
int frameWidth, frameHeight;
void update(float dt) { /* 物理積分 */ }
void render(Graphics g) { /* 旋轉繪製 */ }
void handleInput(int keyCode) { /* 狀態機 */ }
}
關鍵:分離物理更新與渲染、使用定點數或浮點數(J2ME 早期無 FPU,建議定點數)、狀態機處理輸入。
int calculateLines(String text, int screenWidth) {
if (text == null || text.length() == 0) return 0;
int lines = 1;
int currentWidth = 0;
for (int i = 0; i < text.length(); i++) {
int charW = getCharWidth(text.charAt(i));
if (currentWidth + charW > screenWidth) {
lines++;
currentWidth = charW;
} else {
currentWidth += charW;
}
}
return lines;
}
假設 getCharWidth(char) 由平台提供。進階:支援換行符 \n、單詞不拆分(需回溯)、雙字節字元處理。