J2ME -->常见笔试题(收集共享)

来源:互联网 发布:军工软件 编辑:程序博客网 时间:2024/05/20 23:04

这些题用于巩固一下基础知识还是有必要的! 

 

1、 求下列代码执行以后expr的值  
a) int a = 8,b = 4; int expr = a++%++b*2 =6  

b) int expr = 20 / 8 * 8; =16  

c) int expr = 4 < < 2 + 1; =32即4 < <3  

d) int expr = -4321 >>>30; =3  

e) int expr = 123 ^ 321 ^ 123; =321  

f) int a = 255;  
int expr = (byte)a + (((byte)a) & 0xff); =254  

g) int expr = “123454321”.charAt(4) + 2; =55即为‘5’+2  

h) Integer a = new Integer(1234);  
Integer b = new Integer(1234);  
boolean expr = a == b; =false  

i) String func(String s){  
return s.length() > 0 ? func(s.substring(1)) + s.charAt(0) : “”;  
}  
Striing expr = func(“Gameloft”); =tfolemaG;

2、 知识题  
a) 什么是垃圾回收?什么时候触发垃圾回收?如何降低垃圾回收的触发频率?它能保证程序有足够的可用内存吗? 
垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。  
垃圾收集发生的不可预知性:由于实现了不同的垃圾收集算法和采用了不同的收集机制,所以它有可能是定时发生,有可能是当出现系统空闲CPU资源时发生

c)什么是混淆(obfuscate)?有什么好处?有哪些工具可以混淆jar文件?
答案:混淆是指通过对class文件中的变量名和部分方法名进行处理,来提高代码反编译的难度。
好处主要有2个:1、提高反编译以后代码阅读的难度 2、降低class文件的大小。
常见的混淆器有Proguard和RetroGuard两种。

d)什么是状态机?游戏开发中有那些地方能用到状态机?
答案:状态机(State Machine)是根据对应状态进行处理的一种机制,在游戏开发中最典型的应用是游戏人工智能(AI)等地方。

e)请根据你的知识,对以下计算机名次进行尽量简单的描述:
J2ME
J2ME是一种使用Java语言进行嵌入式设备开发的技术。
Python
Python是一种语法简单的面对对象的程序设计语言
Ant
Ant是一种简化和统一项目编译的工具软件。
Javac
Javac是Java语言的编译程序
Subversion
Subversion是新一代的版本工具
OpenGL
OpenGL是一套开发的图形界面开发库标准


3.final、finally和finalize有什么不同?
答: final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 .
finally再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)  
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的  

4.求2的3次方最快的方法是?  
答:2<<3

5.编写方法,判断int数组中的元素是否重复,如果重复则返回true,否则返回false
方法声明:public boolean isRepeated(int[] m){ }
  答: public boolean isRepeat(int[] m){

int length = m.length;
for(int i = 0; i <= length - 2; i ++){
for(int j = i; j <= length - 1; j ++){
if(m[i] == m[j]){
return true;
}
}
}

return false;
}

6.多线程的实现方式有几种,简单描述如何实现?
答: 继承Thread类; 实现Runnable多线程接口; 使用任务组合实现多线程
通过编写线程类继承Thread类并重写Thread类中的run()方法实现线程,当线程对象被运行时候将会自动执行run方法中的实体内容,从而开辟一个单独的线程并运行起来。
线程接口Runnable中只有一个抽象方法run,通过实现Runnable接口中的方法的类即可创建出有多线程特征的对象,但该对象并无法使其启动线程,需要作为参数并借助Thread的构造方法构造创建对象并调用start方法对线程进行启动。
利用任务处理组合类Timer和TimerTask, 可以使用他们实现多线程,简单说就是定时实现任务。Timer是JAVA中的一个定时器,可以实现在某一时间做某件事或者在某一时间段做某些事,分别通过方法schedule(TimerTask tt,long millis)和schedule(TimerTask tt,long start,long off)。TimerTask是一个任务类,通过继承该类并覆盖方法run即可创建一个任务。

7.代码float f=3.4是否正确?为什么?
答:错,正确写法为float f=3.4f(float f=3.4F)或者float f= (float)3.4
3.4为Double型

8.编写一个方法判断同一平面上的两个圆是否相交,如果相交则返回true,否则返回false
方法声明:public boolean isCollis(int x1,int y1,int r1,int x2,int y2,int r2)
说明:(x1,y1)是第一个圆圆心的坐标,r1是该圆的半径
(x2,y2)是第二个左上角的坐标,r2是该圆的半径

public boolean isCollis(int x1,int y1,int r1,int x2,int y2,int r2){
float xSide=Math.abs(x1-x2);
float ySide=Math.abs(y1-y2);
float hypotenuse=(float) Math.sqrt(xSide*xSide+ySide*ySide);
if(hypotenuse<r1+r2)
return true;
return false;
}

9.Nokia S40手机又细分为几种?列举一些你熟悉的一些该系列机型的技术参数。
  S40v1, S40v2, S40v3, S40v5, S40v6,  
  3100支持java MIDP 1.0, 64kb的jar,
  6230支持java MIDP 2.0, 128kb的jar
  …参考(http://bbs.uc.cn/viewthread.php?tid=169285);

10.列举出8种基本数据类型在内存中占用的字节数
int ,4 short,2 long,8 float,4 double,8 boolean,false,true char,2 byte,1


11.实现一副扑克牌洗牌的功能。如果无法书写完整的代码,可以用文字描述出自己的实现思路。
答: int array[]=new int[54];
  for(int i=0;i<54;i++){
array[i]=i;
  }
  Random random=new Random();
int temp;
for(int i=0;i<26;i++){//洗牌次数自定,每一次交换2张牌
int index1=random.nextInt(54);
int index2= random.nextInt(54);
temp=array[index1];//交换元素
array[index1]=array[index2];
array[index2]=temp;
}
  }

 

1.如何理解J2ME中MIDlet类的运行机制?
答:一个MIDlet有三个种运行机制,分别是:运行状态,暂停状态,和中止状态。
JAM通过调用startApp()函数使MIDlet进入到开始状态,也就是说把我们的游戏进入开始状态;JAM通过调用pauseApp()使MIDlet进入暂停状态;通过调用destroyApp ()使之停止掉。MIDlet不允许直接调用System.exit()或Runtime.exit()来结束MIDlet的生命周期,这种方式会引起Java的安全异常。当MIDlet需要自己结束生命周期的时候,首先调用destroyApp(),然后通过notifyDestroyed()通知JAM结束MIDlet的运行。

2.什么是双缓冲?双缓冲技术的出现是基于怎样的编程思想?
答:造成屏幕闪烁的主要原因在于,画面在显示的同时程序又在改变它,于是画面闪烁。在内存中开辟一片区域作为后台画面,程序对它更新、修改,完成后再显示它。先把屏幕重画在缓冲之中,然后再绘制在显示屏幕上,而不是直接绘制在显示屏幕上。可以使用Canvas类的isDoubleBuffer方法判断设备是否具有双缓冲。

4.ServiceRepaints()方法的作用是什么?与repaint()方法在使用上有什么区别?ServiceRepaints()方法与repaint()方法同时存在的意义是什么?
答:SerivceRepaints()方法的作用是强制执行repaint()方法。
区别是repaint()可以单独使用,而SerivceRepaints()必须和repaint()同时使用,并且必须在repaint()之后调用。
意义:避免repaint方法被累积执行。

5.J2ME中的音乐播放有怎样的缺陷?如何在使用中规避这些缺陷?使用伪码或者文字描述一下,如何在游戏中切换背景音乐。举出切换过程中可能存在的问题,并写明解决方法。
答:J2ME中的音乐播放不支持混音。使用各大厂商的API。

6.你认为J2ME的哪种技术缺陷增加了游戏开发的难度?
答:内存的使用,尤其是图片加载的问题。

7.阅读以下代码。
Image [ ] img = new Image [ 10 ];
for ( int i = 0 ; i < img.length ; i ++)
{
img [ i ] = Image.createImage (“/res/” + i +”. png”);
}
img = null;
以上代码在执行以后,是否释放了堆栈空间?说明理由。如果没有释放,写出正确的释放方法。
答:以上代码在执行以后,释放了堆栈空间。

8.J2ME在sun的JAVA体系中处于怎样的地位?分析一下J2ME出现的技术背景。
答:J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,它与J2SE、J2EE并称。根据Sun的定义:J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话和可视电话、数字,机顶盒、汽车导航系统等等。
J2ME技术在1999年的JavaOne Developer Conference大会上正式推出,它将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。

二.算法(可以使用伪码)
1.你如何分析并设计算法,通常的思路是怎样的?

2.列举你所知道的算法,写出其中一个的算法思想,并分析一下,如何在开发中使用这个算法,可以达到怎样的效果。

3.列举你所知道的数据结构,按照复杂程度排序。
答:简单到难:链表,堆栈,Vector,队列,树,二叉树。

4.选择一种你最熟悉的数据结构,写出存储和检索过程。
 答:private final int SIZE; // 队列大小
private int[] queue; // 队列
private int head; // 头
private int end; // 尾

public 数组队列(int size) {
SIZE = size;
queue = new int[SIZE];
head = 0;
end = 0;
}
// 下一个位置
private int next(int i) {
return (i + 1) % SIZE;
}

// 是否满列
public boolean isFull() {
return next(end) == head;
}
// 入列
public void offer(int data) throws Exception {
if (isFull()) {
throw new Exception("queue is full");
} else {
queue[end] = data;
end = next(end);
}
}

// 出列
public int poll() throws Exception {
if (isEmpty()) {
throw new Exception("队列已空!");
} else {
int result = queue[head];
head = next(head);
return result;
}
}

// 列的当前大小
public int size() {
return ((end + SIZE) - head) % SIZE;
}

// 是否空列
public boolean isEmpty() {
return end == head;
}

三.思想
1.谈谈你对一个完整的游戏流程的认识,用流程图表示。
答:策划案-程序框架架构-游戏架构-游戏测试-游戏发布和移植

2.与其他类型的应用软件开发相比,游戏开发在程序设计上有什么特点?
答:游戏开发在程序的上的特点是:

3.叙述一下你所知道的编程技术的演变与发展。

4.你认为应当如何评价一个程序员的技术水准? 你是否已经具备了成为一名合格程序员的条件?作为一名程序员,你觉得自己的优秀之处是什么?还欠缺什么?
 
5.MIDP2.0所支持的音乐格式有哪些? Midi,wav

二.算法   
1.列举你所知道的图片旋转算法,并写出其中一种的关键代码。   
2.列举你所知道的碰撞检测算法,并写出其中一个算法思想。   
3.选择一种你最熟悉的数据结构,写出存储和检索过程。
4.你认为一个合格的程序员需具有怎样的素养?你眼中的程序员群体现状和未来是怎样的?


一:整型(byte,short,int,long)

byte 类型为8 位,存储范围为 –2(7)~~~ 2(7)-1,及-128~~127(经过测试的),如果数值超出-128~127这个范围,则

数值会转为-128~127中的一个数值,特别适合于表示网络和文件的字节流.

short类型为16位,存储范围为 –2(15)~~~ 2(15)-1,及-32768~~32767,为了节省内存,可使用short代替int,但

是它限制数据的存储为高位在前,低位在后的数据格式,在某些机器中会出错.

int 类型为32位,存储范围为 –2(31)~~~ 2(31)-1,及-2147483648~~2147483647,及二十多个亿,最常用的类型

long类型为64位,存储范围为 –2(63)~~~ 2(63)-1,需要在其数值后加上L或l,如:long al=2L

当前 整型常量的默认为 int 类型

char 类型, 用于表示一个字符,java使用的是16位Unicode字符集,因此java字符是一个16位无符号整数,取

值范围0~65535,如:char a=’z’,char b=’王’,char c=0xf0abc1

在java中,字符类型数据不能作为整数使用,因为java中没有无符号整数类型,但是字符数据可以

转换为整数来计算。

/uddd: 3位八进制数所表示的字符(ddd)

/uxxxx:4位十六进制数所表示的字符(xxxx),例如 /u0061表示ISO拉丁字符集中的a

/n:表示换行

二:进制数

十进制数: 默认表示形式,是最长用的。
十六进制数:经常用到,其每一位数相当于4个二进制0和1的组合。范围0~F,十六进制整数必须以0x作为

开头,0xff:对应十进制为255,0xffL:对应十进制为255L

八进制:每一位数值相当于3个二进制数0和1的组合,开头必须为O,如:O11 十进制为9,二进制为1001

三:浮点数

也被称为 实型,用来表示一个带小数的十进制数,它分为float和double两种.

单精度 float型数据范围为 32位,双精度 double类型数据范围为 64位

float类型: 3.14F

double类型:3.14或3.14D

在手机开发中,LCDC1.0规范中不支持float和double类型,只有CLDC1.0规范中才开始支持float和double类型

四:基本数据类型和对应类间的关系

基本类型 对应类 基本类型 对应类  
short Short Float Float  
Byte Byte double Double  
long Long char Char  
int Ingeger boolean Boolean  

五:

1:J2ME一般又称为Kjava,有两个虚拟机,KVM(K Virtual Machine K虚拟机)和CVM(C Virtual Machine,C虚拟

机),都是JVM(Java Virtual Machine)的子集,KVM的功能比CVM的功能稍差,其上可以使用CLDC配置和MIDP

简表。

2:J2ME中有两个可选配置-CDC(Connected Device Configuration,连接设备配置)和CLDC(Connected Limited Device

Configuration,有限连接设备配置)

3:MIDlet(Mobile Information Devices let,移动信息设备小程序),就是可以在KVM上运行的应用程序.

4:J2ME程序需要MANIFEST.MF和JAD文件,很多开发工具,如NetBeans等都提供了自动完成的功能,能自动的

创建并更新这些文件.

5:JCP(Java Community Process,Java标准化组织)

JSR37: 属于MIDP1.0(Mobile Information Device Profile 1.0,移动信息设备简表)规范

JSR118:属于MIDP2.0(Mobile Information Device Profile 2.0,移动信息设备简表)规范

JSR120:属于WMA(Wireless Messaging API,无线信息规范)规范

JSR30: 属于CLDC1.0规范

JSR139: 属于CLDC1.1规范

JSR135: 属于移动媒体开发的Mobile Media API规范

JSR184: 属于移动3D图形开发的Mobile 3D Graphics API规范

JSR75: 属于手机文件系统API规范

六:多线程

1: 对多线程技术的支持是Java语言的一个特色,在手机开发中的很多地方都要使用多线程进行开发。

2: 线程同步方法:线程的同步,必须使用synchronized语句可以对共享数据的访问语句进行保护,synchronized语句

会在访问数据时为共享数据加一个锁,加锁后其它线程就不能访问该共享数据了。

3: 当在一个类中有三个方法,p1(),synchronized p2(),synchronized p3(),则当某个线程访问了p2()后,在p2()没

有执行完成的情况下,其它线程不可以访问p2(),也不可以访问p3(),但是可以访问p1(),因为p1()没有加s

ynchronized。

4: 当一个客户用synchronized块或synchronized方法操作一个共享变量时,其他线程就必须等待,直到该线程执行完

该方法或同步块。

七:简单的程序

import javax.microedition.lcdui.Displayable;

import javax.microedition.midlet.MIDlet;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

public class Midlet extends MIDlet implements CommandListener{

Command commandTest;

public void startApp(){

Display display=Display.getDisplay(this);

Form form=new Form(”最简单的例子”);

commandTest=new Command(”测试”,Command.OK,1);

form.addCommand(commandTest);

form.setCommandListener(this);

display.setCurrent(form);

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

public void commandAction(Command command, Displayable displayable) {

if(command==commandTest){

System.out.println(”使用对象相等的比较,还是第一次见到!”);

}

}

}

八:JCP(Java Community Process,Java标准化组织)