第一篇:JAVA编程习题1
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
JAVA编程习题1
4.test10097求两个数的和
/*输入n表示做n次下面的操作: 输入两个正整数,输出它们的和.例: 输入:
//表示n=2,做两次操作 10 11 20 30 输出: sum=21 sum=50 */
5.test20001求两个数的和与差
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
/*程序填空,不要改变与输入输出有关的语句。输入整数a和b,计算并输出a、b的和与差。例: 输入 2-8 输出 The sum is-6 The difference is 10*/
6.test20002求平方根
//程序填空,不要改变与输入输出有关的语句。输入1个实数x,计算并输出其平方根。例: 输入 1.21 输出
The square root of 1.21 is 1.1
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
7.test20003华氏温度转换成摄氏温度
/*程序填空,不要改变与输入输出有关的语句。
输入华氏温度f,计算并输出相应的摄氏温度c。c = 5/9(f-32).例:括号内是说明 输入
17.2(华氏温度)输出
The temprature is-8.****/
8.test20004计算旅途时间
程序填空,不要改变与输入输出有关的语句。
输入2个整数time1和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。
有效的时间范围是0000到2359,不需要考虑出发时间晚于到达时间的情况。
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
例:括号内是说明 输入
712 1411(出发时间是7:10,到达时间是14:11)输出
The train journey time is 6 hrs 59 mins.9.test20005数字加密
程序填空,不要改变与输入输出有关的语句。输入1个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将第1位和第3位上的数字互换,第2位和第4位上的数字互换,组成加密后的新数。例:括号内是说明 输入 1257 输出
The encrypted number is 4601(每一位上的数字加9除以10取余后,得0146,交换后得到4601)
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
10.test20006大小写字母转换
程序填空,不要改变与输入输出有关的语句。输入一个大写英文字母,输出相应的小写字母。例: 输入 G 输出 g
import java.io.*;public class T20006 {
public static void main(String[] args)throws IOException
{
char ch;
ch=(char)System.in.read();
/*------------------*/
ch=(char)(ch+32);
// 以ASCII码计算
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
}
System.out.println(ch);
} 11.Test20007计算三门课程的平均成绩
程序填空,不要改变与输入输出有关的语句。
已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。本题无输入。输出示例:
math = 87, eng = 72, comp = 93 average = 84
12.test20008计算存款利息
程序填空,不要改变与输入输出有关的语句。输入存款金额 money、存期 year 和年利率 rate,精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
根据下列公式计算存款到期时的利息 interest(税前),输出时保留2位小数。
interest = money(1+rate)^year10 / 2 =
(数字与运算符之间有一空格)输出 5 10 */ /*补充知识:in.next()与in.nextline()的区别
in.next只接受一个字,不能接受一个带有空格的字符串,如下: 例如输入: Show me--(回车)用next()只能得到Show,因为遇到空格表示结束,但是nextline()则要遇到回车才知道结束.可以看一个例子,演示给大家看,如下:----------
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
import java.util.Scanner;public class Test60011{
public static void main(String []args)
{
String s1_1,s1_2,s2;
Scanner in=new Scanner(System.in);
s1_1=in.next();
System.out.println(s1_1);
System.out.println(“----------”);
in.nextLine();// 把剩余的吃掉
s2=in.nextLine();
System.out.println(s2);
System.out.println(“----------”);
s1_1=in.next();
s1_2=in.next();
System.out.println(s1_1+“
”+s1_2);
} }------------*/
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
39.求1+1/2!+……1/N!//求1+1/2!+1/3!+....(用方法求n!)
40.求a+aa+aaa+……(用方法)//求a+aa+aaa+aa…a
41.统计一个整数中数字的个数
/*程序填空,不要改变与输入输出有关的语句。
输入一个正整数repeat(0 (repeat=3)-21902 2 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 345543 输出: count=2 (-21902中有2个2)count=1 (有1个2)count=0 (345543中没有2)*/ 42.判断素数(用方法) 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 NO (1不是素数) 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 YES (2是素数)NO (9不是素数)YES (17是素数) 43.统计素数并求和 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (素数就是只能被1和自身整除的正整数,1不是素数,2是素数)。要求定义并调用函数prime(m)判断m是否为素数。例:括号内是说明 输入: (repeat=3)1 10 (m=1, n=10)20 35(m=20, n=35)14 16(m=14, n=16)输出: count=4, sum=17 (1到10之间有4个素数:2,3,5,7)count=3, sum=83 (20到35之间有3个素数:23, 29, 31)count=0, sum=0 (14到16之间没有素数) 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 44.输出Fibonacci序列 /*程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 Fibonacci 序列(第1项起):1 1 2 3 5 8 13 21......要求定义并调用函数fib(n),它的功能是返回第n项Fibonacci数。例如,fib(7)的返回值是13。输出语句:System.out.print(f+“ ”); 例:括号内是说明 输入: (repeat=3)1 10 (m=1, n=10)20 100(m=20, n=100)1000 6000(m=1000, n=6000)输出: 1 2 3 5 8 (1到10之间的Fibonacci数)21 34 55 89 (20到100之间的Fibonacci数) 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 1597 2584 4181 (1000到6000之间的Fibonacci数)*/ 45.求完数 /*输入2 个正整数m和n(1<=m,n<=1000),输出m 到n之间的所有完数 (完数就是因子和与它本身相等的数)。 要求定义并调用函数factorsum(number),它的功能是返回number的因子和。 例如,factorsum(12)的返回值是16(1+2+3+4+6)。输出语句:System.out.print(i+“ ”);例:括号内是说明 输入: 2 (repeat=2)20 500(m=100, n=400)1 100 (m=1, n=100)输出: 28 496 1 6 288*/ 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 46.求各位数字的立方和等于它本身的数 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 输出语句:System.out.print(i+“ ”);例:括号内是说明 输入: 2 (repeat=2)100 400(m=100, n=400)1 100 (m=1, n=100)输出: 153 370 371(1*1*1+5*5*5+3*3*3=153;3*3*3+7*7*7=370;3*3*3+7*7*7+1*1*1=371)1 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 47.将一个整数逆序输出 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 要求定义并调用函数reverse(number),它的功能是返回number的逆序数。 例如reverse(12345)的返回值是54321。例:括号内是说明 输入 (repeat=4)123456-100-2 99 输出 654321-1-2 99 48。十进制转换二进制 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 程序填空,不要改变与输入输出有关的语句。 输入一个正整数 repeat(0 要求定义并调用函数 dectobin(n),它的功能是输出 n 的二进制。例如,调用dectobin(10),输出1010。 输出语句:System.out.print(t); //t为某位二进制数 例:括号内是说明 输入: 3 (repeat=3)15 100 0 输出: 1111 1100100 0 49。求平均值 程序填空,不要改变与输入输出有关的语句。 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 输入一个正整数repeat(0 (repeat=2)3 1 2-6 5 12 2 5 4 0 输出 aver=-1.0 aver=4.6 50。求最大值及其下标 /*输入一个正整数n(1 (设最大值惟一,下标从0开始)。例:括号内是说明 输入 (repeat=3)3 1 6 4 3 10 8 1 5 1 2 5 4 0 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 输出 max=6,index=1 (最大值6的下标是1)max=10,index=0 (最大值10的下标是0)max=5,index=2 (最大值5的下标是2)*/ 51。逆序输出 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (repeat=2)4 10 8 1 2 5 1 2 5 4 0 输出 2 1 8 10 0 4 5 2 1 52。交换最小值和最大值 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 最大值与最后一个数交换,然后输出交换后的n个数。例:括号内是说明 输入 (repeat=3)5 4 3 5 1 2 4 1 5 6 7 5 5 4 3 2 1 输出 1 3 2 4 5 1 5 6 7 1 4 3 2 5 53。排序 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (repeat=3)4 5 1 7 6 3 1 2 3 5 5 4 3 2 1 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 输出 7 6 5 1 3 2 1 5 4 3 2 1 54。矩阵运算 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (2+3+4+5+6+7+8=35) 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 55。加法口诀表 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (repeat=1)3 (n=3)输出: + 56。判断上三角函数 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (上三角矩阵,即主对角线以下的元素都为0, 主对角线为从矩阵的左 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 上角至右下角的连线)例:括号内是说明 输入: (repeat=2)3 1 2 3 0 4 5 0 0 6(n=3)2 1 0-8 2 (n=2)输出: YES NO 57。求矩阵每行元素之和 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (repeat=1)3 2(m=3, n=2)6 3 1-8 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 12 输出: sum of row 0 is 9 sum of row 1 is-7 sum of row 2 is 15 58。找鞍点 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 (repeat=2)4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9(n=4)2 1 7 4 1 (n=2)输出: a[2][1]=6 NO 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 59。求字符串长度 程序填空,不要改变与输入输出有关的语句。连续输入一批以 # 结束的多串字符。统计并输出每串字符的长度。输出使用:System.out.println(len);例:括号内是说明 输入: hello 12#abc+0# (连续输入2串字符“hello 12”和“abc+0”)输出: (“hello 12”的长度是8)5 (“abc+0”的长度是5) 60。统计大写辅音字母 程序填空,不要改变与输入输出有关的语句。输入一个正整数n(0 输入一行字符串,统计并输出字符串中大写辅音字母的个数(大写辅音字母:除“A”,“E”,“I”,“O”,“U”以外的大写字母)。例:括号内是说明 输入: 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 (输入3个字符串)HELLO IT12 uieiaba 输出: (“HELLO”中有3个大写辅音字母)1 (“IT12”中有1个大写辅音字母) 0 (“uieiaba”中没有大写辅音字母) 61。查找字符 程序填空,不要改变与输入输出有关的语句。 先输入一个字符ch。然后输入一个正整数n(0 输入一行字符串,在字符串中查找该字符(ch),如果找到,则输出 该字符在字符串中最后出现的位置(从0开始);否则输出“Not Found”。例:括号内是说明 输入: m (输入一个字符)3 (要输入3行字符串)moon 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 programming 1234 输出: 0 (m在“moon”中最后出现位置是0)7 (m在“programming”中最后出现位置是7)Not Found (“1234”中没有m) 62。字符串替换 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 对应字母 A ──→ Z B ──→ Y C ──→ X D ──→ W …… X ──→ C Y ──→ B 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 Z ──→ A 例:括号内是说明 输入: (输入3行字符串)A flag of USA IT12 oueiaba 输出: Z flag of FHZ RG12 oueiaba 63。十六进制转换十进制 程序填空,不要改变与输入输出有关的语句。 输入一个正整数repeat(0 个新字符串(十六进制形式),然后将其转换为十进制数后输出。例:括号内是说明 输入: 精心收集 精心编辑 精致阅读 如需请下载! 演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案 (输入3行字符串)10 Pf4+1-+A 输出: 16 3905 10 ----------------------- 精心收集 精心编辑 精致阅读 如需请下载! 第一章 面向对象开发方法概述 1.面向对象的软件开发有哪些优点? 1) 把软件系统看成是各种对象的集合,这更接近人类的自然思维方式。 2) 软件需求的变动性往往是功能的变动,而功能的执行者——对象,一般不会有多大的变化,比结构化更稳定。 3) 对象包括属性和行为,对象把数据及方法的具体实现方式一起封装起来,使得方法与之相关的数据不再分析,提高了每个子系统的相对对立性,从而提高软件的可维护性。 4) 支持封装,抽象,继承和多态。提高了软件的可重用性,可维护性和可扩展性。 2.在软件系统中,为什么说一个孤立的不对外提供任何服务的对象是没有意义的? 1) 每个对象都具有特定的功能,相对于其他对象而言,它的功能就是为其他对象提供的服务。 2) 从使用者角度出发,整个软件系统就是一个服务的提供者。 3) 在系统内部,每个子系统也都是服务的提供者,它们其他子系统提供服务。 4) 因此说一个孤立的部队为提供任何服务的系统是美欧任何意义的。 3.列举一些现实生活中的例子,来说明什么是依赖关系、什么是聚集关系,以及什么是关联关系。 1) 关联关系:关联是指类之间的特定对应关系,可以分为单向关联和双向关联,也可以分为一对一关联、一对多关联以及多对多关联。A关联B,是指Class A与Class B之间存在特定的对应关系。举例如学生和老师,订单和客户。 2) 依赖关系:类之间的调用关系。A依赖B,Class A访问Class B提供的服务。如Panel与Shape的关系。 3) 聚集关系:是整体与部分之间的关系 4.列举一些显示生活中的例子,来说明什么是封装,什么是接口。 1) 接口:对象中所有向使用者公开的方法的声明构成了对象的接口。 2) 封装:隐藏对象的属性和实现细节,仅仅对外公开接口。 3) 接口的优点:a.提高系统之间松散耦合b.提高了系统的可扩展性。 4) 封装的有点: a.便于使用者正确、方便地理解和使用系统,防止使用者错误修改系统的属性。 b.有助于建立各个系统之间的松耦合关系,提高系统的独立性。 c.提高软件的可重用性,没个系统都是一个相对独立的整体,可以在多种环境中得到重用。 d.降低构建大型系统的风险,即使整个系统不成功,个别的独立子系统有可能依然有价值。 5.抽象的最主要特征是什么? 抽象是指从特定角度出发,从已经存在的一些事物中抽取我们所关注的特性,形成一个新的事物的思维过程。 6.在建立对象模型时,要经历哪些抽象思维过程? 1) 从问题领域的事物到软件模型中对象的抽象。 2) 从对象到类的抽象。 3) 从子类到父类的抽象 7.类就是程序员自定义的类型。这种说法是否正确? 不正确,类是一组具有相同属性和行为的对象的抽象。类及类的关系构成了对象模型的主要内容。开发人员需要根据先识别对象,然后再进行分类(创建任意的数据模型)的思路来建立对象模型。 8.小王本来体重70kg,经过减肥,体重降到45kg,试从这个问题领域中识别对象、类、属性、状态和状态的变化。 1) 类:人。 2) 对象:小王。 3) 属性:体重。 4) 状态:70kg。 5) 状态的变化:小王的减肥行为导致体重下降。 9.在UML图中哪些框图描述了系统的动态结构,哪些框图描述了系统的静态结构? 1) 用例图、类框图、组件图、部署图构成了系统的静态模型。 2) 状态转换图、时序图、协作图则构成了系统的动态模型。 第二章 第一个Java应用 1.把一个类放在包里有什么用? 答:把类分包的作用: (1) 能够区分名字相同的类 (2) 有助于实施访问权限控制 (3) 有助于划分和组织Java应用中的各个类 2.JavaDoc文档是不是为软件的终端用户提供的使用指南? 答:不是的,JavaDoc文档是供Java开发人员阅读的,他们通过JavaDoc文档来了解其他开发人员开发的类的用法。Java开发人员应该养成经常阅读JavaDoc文档的良好习惯。 3.对于com.abc.dollapp.AppMain类,使用以下命令进行编译,编译出来的.class文件位于什么目录下? java –d C:classes –sourcepath C:src C:srccomabcdollappAppMain.java 答:将会存放在C:classescomabcdollapp下。 4.对于以上编译出来的AppMain类,以下哪个java命令能正确运行它? (a) java C:classescomabcdollappAppMain.class (b) java –classpath C:classes AppMain (c) java –classpath C:classescomabcdollapp AppMain (d) java –classpath C:classes com.abc.dollapp.AppMain 答:(b) 5.以下哪些main()方法的声明能够作为程序的入口方法? (a) public static void main() (b) public static void main(String[] string) (c) public static void main(String args) (d) static public int main(String[] args) (e) static void main(String[] args) 答:(b),主函数必须以public static void形式存在,参数必须为String数组形式。 6.假定以下程序代码都分别放在MyClass.java文件中,哪些程序代码能够编译通过? (a) import java.awt.*;package Mypackage; class MyClass{}; (b) package MyPackage; import java.awt.*; class MyClass{}; (c) /*This is comment*/ package MyPackage; import java.awt.*; public class MyClass{}; 答:(c),程序顺序必须按照import, package, class走,源文件必须以public类型的类命名。 7.对于以下Myprog类,运行命令”java Myprog good morning”,将会得到打印结果? public class Myprog { public static void main(String argv[]) { System.out.println(argv[2]); } } 答:打印结果为空。argv[0] = “good”, argv[1] = “morning”。 8.下面哪些是Java的关键字? (a) default (b) NULL (c) String (d) throws (e) long (f) true 答:(a),(d),(e),(f),java中所有的关键字都是小写。 9.当AppMain类的main()方法创建了5个Doll对象时,运行时数据区的数据如何分布的?参考2.4节的图2-13,画出此时运行时数据区的状态图。 运行时数据区(内存) Java栈区 执行main()方法的主线程的方法调用栈 局部变量beibei 局部变量jingjing 局部变量huanhuan 局部变量yingying 局部变量nini 堆区 Doll实例 name:贝贝 Doll实例 name:晶晶 Doll实例 name:欢欢 Doll实例 name:迎迎 Doll实例 name:妮妮 方法区 Doll类型信息 AppMain类型信息 (包含main()方法信息) 10.下面哪些是合法的Java标识符? (a) #_pound (b) _underscore (c) 5Interstate (d) Interstate5 (e) _5_ (f) class 答:(b),(d),(e)标识符命名规则如下: (1) 标识符首字母必须为字母、下划线“_”、美元“$”、人民币“¥”(2) 标识符由数字、大写字母、小写字母、下划线以及美元等组成 (3) 不能把关键字和保留字作为标识符 (4) 标识符没有长度的限制 (5) 标识符是大小写敏感的第三章 数据类型和变量 1.对于以下程序,运行“java Abs”,将得到什么打印结果? public class Abs { static int a = 0x11; //十六进制 static int b = 0011; //八进制 static int c = 'u0011'; //十六进制数据的Unicode字符编码 static int d = 011; //八进制 /** * @param args */ public static void main(String[] args) { System.out.println(“a=”+a); System.out.println(“b=”+b); System.out.println(“c=”+c); System.out.println(“d=”+d); } } 答:输出如下 a=17 b=9 c=17 d=9 2.以下哪段代码能正确编译通过? (a) char a = „a‟; char b = 1; char c = 08; (b) int a = „a‟; (c) long a =‟u00FF‟; (d) char a = „u0FF‟; (e) char d = “d”; 答:(b)、(c)能通过编译。(a)中“char c=08”将int赋值给char需要部分强制转换,“char c=8”就正确;(d)中unicode编码错误,java采用的是UCS-2编码,共16位;(e)字符赋值是使用单引号,字符串String赋值时才使用双引号。 3.下面哪些代码能编译通过? (a) short myshort=99S; (b) String name = „Excellent tutorial Mr Green‟;(c) char c = 17c; (d) int z = 015; 答:(d)可以编译通过。(a)中char赋值给short需要强制转换;(b)中String类型赋值用双引号;(c)中int赋值给char需要部分强制转换。 4.字符“A”的Unicode字符编码为65.下面哪些代码正确定义了一个代表字符“A”的变量? (a) Char ch=65; (b) Char ch=‟65‟; (c) Char ch =‟u0041‟; (d) Char ch=‟A‟; (e) Char ch =”A” 答:(c)、(d)可以得到”A”。(b)的输出为5,其他无法编译通过。 5.以下代码共创建了几个对象? String s1=new String(“hello”); String s2=new String(“hello”); String s3=s1; String s4=s2; 答:共创建了2个对象。栈区4个局部变量分别引用了堆区的2个实例,而2个实例又引用了工作区的同一个类。 6.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? class Test { static int myArg = 1; public static void main(String[] args) { Int myArg; System.out.println(myArg); } } 答:无法编译通过,因为局部变量myArg声明之后Java虚拟机就不会自动给它初始化为默认值,若在使用前未被初始化,编译会报错。 7.对于以下程序,运行“java Mystery Mighty Mouse”,将得到什么打印结果? public class Mystery { public static void main(String[] args) { Changer c = new Changer(); c.method(args); System.out.println(args[0]+“ ”+args[1]); } static class Changer { void method(String[] s) { String temp = s[0]; s[0] = s[1]; s[1] = temp; } } } 答:打印结果为“Mighty Mystery” 8.对于以下程序,运行“java Pass”,将得到什么打印结果? public class Pass { static int j = 20; public static void main(String[] args) { int i=10; Pass p = new Pass(); p.amethod(i); System.out.println(“i=”+i); System.out.println(“j=”+j); } public void amethod(int x) { x*=2; j*=2; } } 答:打印结果是 i=10 j=40 其中“int x”是传参,作用域仅在amethod之中。 第四章 操作符 1.以下哪些程序代码能够编译通过? (a) int i=0;if(i){ System.out.println(“hello”);} (b) boolean b1=true; boolean b2=true; if(b1==b2){ System.out.println(“So true”);} (c) int i=1; int j=2; if(i==1||j==i){ System.out.println(“ok”);} (d) int i=1; int j=2; if(i==1&|j==i){ System.out.println(“ok”);} 答:(b)、(c)能编译通过。(a)中int不能作为boolean出现,(d)中不能出现&|该操作符。 2.运行以下程序,将得到什么打印结果? System.out.println(-1>>>1); System.out.println(-1>>1); System.out.println(2>>1); System.out.println(1<<<1); 答:>>>是逻辑右移位操作符,也称不带符号右移位操作符,在移位的过程中二进制数开头填0;>>是右移位操作符,也称带符号右移位操作符,舍弃末尾,在开头填符号位;<<<操作符不存在; 11111111 11111111 11111111 11111111 -1>>>1 01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 -1>>1 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000010 2>>1 00000000 00000000 00000000 00000001 2147483647-1 1 3.以下temp变量最终取值是什么? long temp =(int)3.9; temp %= 2; 答:取值为1。 4.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? if(5 & 7 > 0 && 5 | 2)System.out.println(“true”); 答:int型不能作为boolean型出现。 5.以下代码能否编译通过?假如编译通过,运行时将得到什么打印结果? int output=10; boolean b1 = false; if((b1==true)&&((output+=10)==20)){ System.out.println(“We are equal”+output);} else { System.out.println(“Not equal!”+output);} 答:Not equal!10 6.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? int output=10; boolean b1 = false; if((b1==true)&((output+=10)==20)){ System.out.println(“We are equal”+output);} else { System.out.println(“Not equal!”+output);} 答:Not equal!20 7.对于以下声明: String s1=new String(“Hello”); String s2=new String(“there”); String s3=new String(); 下面哪些是合法的操作? (a) s3=s1+s2; (b) s3=s1-s2; (c) s3=s1&s2; (d) s3=s1&&s2; 答:(a)是合法操作。除了“+”能用于字符串的连接以外,其他操作符(如“-”、“&”、“&&”等)都不支持String类型的操作元。 第五章 流程控制 1.运行以下代码,将得到什么打印结果? int i = 3; int j = 0; double k = 3.2; if(i < k) if(i == j) System.out.println(i); else System.out.println(j); else System.out.println(k); 答:0 2.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? int i = 4; switch(i){ default: System.out.println(“default”); case 0: System.out.println(“zero”); break; case 1: System.out.println(“one”); case 2: System.out.println(“two”);} 答:可以编译通过,打印结果是: default zero 分析:default可以放在任何位置上,一旦符合一个case即从头执行到尾,不再判断case。 3.以下哪些是合法的 (a) int i;for(i=5, int j=10;i<10;j--){} (b) int i,j;for(i=0, j=10;i<10, j>0;i++, j--){} (c) int i,k;for(i=0, k=9;(i<10 && k>0);i++, k--){} (d) int i,j;for(i=0;j=10;i<10;i++,j--){} 答:(a)for语句中int定义要放在开头。编译不通过。 (b)循环判断语句不可以用逗号连接。编译不通过。 (c)合法。 (d)分号只能有2个。 4.运行以下代码,将得到什么打印结果? int i = 1; switch(i){ default: System.out.println(“default”); case 0: System.out.println(“zero”); break; case 1: System.out.println(“one”); case 2: System.out.println(“two”);} 答:分析同1,运行结果如下: one two 5.以下哪些代码合法? (a) float x=1; switch(x){ case 1; System.out.println(“Got a 1”); } (b) long x=1; switch(x){ case 1; System.out.println(“Got a 1”); } (c) byte x=1; switch(x){ case 1/1; System.out.println(“Got a 1”); } (d) int x=1; int c=1; switch(c){ case x; System.out.println(“Got a 1”);} (e) short x=1; switch(x){ case 3.2/2; System.out.println(“Got a 1”); } (f) short x=1; switch(x){ case 1,2,3; System.out.println(“Got a 1”); } 答:只有(c)是合法的。 6.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? for(int a=0, b=0;a<2;b=++a, System.out.println(“b=”+b)){ System.out.println(“a=”+a);} 答:可以通过编译,打印结果: a=0 b=1 a=1 b=2 7.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? int x=0;one: while(x<10) { two: System.out.println(++x); if(x>3) break two; } 答:不能通过编译。 JAVA编程心得 计算机3班 窦金霞 20104773 最近几周一直在弄程序,说实话真的很累,但累中也有成功的快乐。我觉得学到了很多东西,这是只看课本知识所不能学到的。 说实话,以前我一直没学过JAVA虽然我也知道JAVA的重要性,可是即使上课听了,不实践还是掌握不了。因为种种原因,今年我没有买笔记本。没有机器,仅仅靠每周一次的上机练习是绝对不够的。所以我就插空调程序,在舍友们不用的时候自己再接她们的电脑调。 调上一个WEB版的通讯录程序时我已经感觉到学的很吃力,好多东西都不懂。这次做的这个学生成绩管理系统更复杂了,所以一开始调的时候感觉特别吃力.所以我告诉自己不能放弃,慢慢来,就这样我从最基本的sql语句session对象开始学起,我觉得我还有太多不懂得所以要比别人付出更多的努力。就这样我一点一点的学着„„ 说心里话,在做上一个web版的通讯录时,我就感觉到成功的喜悦。好多地方我都是一点一点的问的,在问的过程中,我也学会了很多,像:Servlet和jsp之间跳不过去时有两种解决办法,一是关闭底层类中的db.close;二是将Servlet中的throws Exception改成try catch以捕捉异常;我还学到了集中查找错误的方法,可以加上两个双斜杠“//”将具体的方法屏蔽掉,一检查是方法错误还是Servlet错误,还有就是写上System.out.println()将获得的数据输出,用来检查数据传输过程有没有错误等等。 虽然在别人看来,这些方法可能都很常规,但是确实我自己学会的,我觉得很有成就感。我已经做好计划了,暑假的时候去买本本用自己的本本练习一下JAVA,虽然下学期不学JAVA了,但是我对JAVA的热情不会因为这个而削减的! 做完这个学生成绩管理系统后,我觉得我对JAVA的看法已经改变了。一前总以为JAVA很繁琐很难,听同学说JAVA不好学,开始又有一些听不懂,所以一直很畏惧JAVA。但真正做了这个系统以后我才感觉到其实任何事都没有难与不难之分,只要你肯努力的去做,世上无难事只怕有心人! 我现在对java学习充满了热情,我知道我还有很多的不足 还有很多需要努力的地方,所以我的JAVA之旅将继续进行„„ Java多线程编程总结 2007-05-17 11:21:59 标签:java 多线程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/27069 Java多线程编程总结 下面是Java线程系列博文的一个编目: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上)Java线程:新特征-锁(下)Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结 ---- 下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多的内容,因此建议大家看上面的系列文章的内容,与时俱进,跟上Java发展的步伐。---- 一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。 现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。比如运行的MSN就对应一个MSN的进程,如果你用的是windows系统,你就可以在任务管理器中看到操作系统正在运行的进程信息。 一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。 多线程的目的是为了最大限度的利用CPU资源。 Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。 一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。 对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。 实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。 在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。 所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”。众所周知,CPU都有个时钟频率,表示每秒中能执行cpu指令的次数。在每个时钟周期内,CPU实际上只能去执行一条(也有可能多条)指令。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步执行的。 用一句话做总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的,呵呵。 二、Java与多线程 Java语言的多线程需要操作系统的支持。 Java 虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。 在Java中,多线程的实现有两种方式: 扩展java.lang.Thread类 实现java.lang.Runnable接口 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。 当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止: 调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。 三、扩展java.lang.Thread类 /** * File Name: TestMitiThread.java * Created by: IntelliJ IDEA.* Copyright: Copyright(c)2003-2006 * Company: Lavasoft([url]http://lavasoft.blog.51cto.com/[/url])* Author: leizhimin * Modifier: leizhimin * Date Time: 2007-5-17 10:03:12 * Readme: 通过扩展Thread类实现多线程 */ public class TestMitiThread { public static void main(String[] rags){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);new MitiSay(“A”).start();new MitiSay(“B”).start();System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} } class MitiSay extends Thread { public MitiSay(String threadName){ super(threadName);} public void run(){ System.out.println(getName()+ “ 线程运行开始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + getName());try { sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(getName()+ “ 线程运行结束!”);} } 运行结果: main 线程运行开始!main 线程运行结束!A 线程运行开始!0 A 1 A B 线程运行开始!2 A 0 B 3 A 4 A 1 B 5 A 6 A 7 A 8 A 9 A A 线程运行结束!2 B 3 B 4 B 5 B 6 B 7 B 8 B 9 B B 线程运行结束!说明: 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用MitiSay的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。 在一个方法中调用Thread.currentThread().getName()方法,可以获取当前线程的名字。在mian方法中调用该方法,获取的是主线程的名字。 注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。 从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。 Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。 实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。 四、实现java.lang.Runnable接口 /** * 通过实现 Runnable 接口实现多线程 */ public class TestMitiThread1 implements Runnable { public static void main(String[] args){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);TestMitiThread1 test = new TestMitiThread1();Thread thread1 = new Thread(test);Thread thread2 = new Thread(test);thread1.start();thread2.start();System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} public void run(){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + Thread.currentThread().getName());try { Thread.sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} } 运行结果: main 线程运行开始!Thread-0 线程运行开始!main 线程运行结束!0 Thread-0 Thread-1 线程运行开始!0 Thread-1 1 Thread-1 1 Thread-0 2 Thread-0 2 Thread-1 3 Thread-0 3 Thread-1 4 Thread-0 4 Thread-1 5 Thread-0 6 Thread-0 5 Thread-1 7 Thread-0 8 Thread-0 6 Thread-1 9 Thread-0 7 Thread-1 Thread-0 线程运行结束!8 Thread-1 9 Thread-1 Thread-1 线程运行结束!说明: TestMitiThread1类通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。 在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target)构造出对象,然后调用Thread对象的start()方法来运行多线程代码。 实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。 五、读解Thread类API static int MAX_PRIORITY 线程可以具有的最高优先级。static int MIN_PRIORITY 线程可以具有的最低优先级。static int NORM_PRIORITY 分配给线程的默认优先级。 构造方法摘要 Thread(Runnable target)分配新的 Thread 对象。Thread(String name)分配新的 Thread 对象。 方法摘要 static Thread currentThread()返回对当前正在执行的线程对象的引用。ClassLoader getContextClassLoader()返回该线程的上下文 ClassLoader。long getId()返回该线程的标识符。String getName()返回该线程的名称。int getPriority()返回线程的优先级。Thread.State getState()返回该线程的状态。ThreadGroup getThreadGroup()返回该线程所属的线程组。static boolean holdsLock(Object obj)当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。void interrupt()中断线程。 static boolean interrupted()测试当前线程是否已经中断。boolean isAlive()测试线程是否处于活动状态。boolean isDaemon()测试该线程是否为守护线程。boolean isInterrupted()测试线程是否已经中断。void join()等待该线程终止。void join(long millis)等待该线程终止的时间最长为 millis 毫秒。void join(long millis, int nanos)等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。void resume()已过时。该方法只与 suspend()一起使用,但 suspend()已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。void setContextClassLoader(ClassLoader cl)设置该线程的上下文 ClassLoader。void setDaemon(boolean on)将该线程标记为守护线程或用户线程。 static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。void setName(String name)改变线程名称,使之与参数 name 相同。void setPriority(int newPriority)更改线程的优先级。 void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置该线程由于未捕获到异常而突然终止时调用的处理程序。static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。static void sleep(long millis, int nanos)在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行)。void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。void stop()已过时。该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅《为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。void stop(Throwable obj)已过时。该方法具有固有的不安全性。请参阅 stop()以获得详细信息。该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。void suspend()已过时。该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。String toString()返回该线程的字符串表示形式,包括线程名称、优先级和线程组。static void yield()暂停当前正在执行的线程对象,并执行其他线程。 六、线程的状态转换图 线程在一定条件下,状态会发生变化。线程变化的状态转换图如下: 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。 4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种: (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。 (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。 (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。 5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。 七、线程的调度 1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。 Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量: static int MAX_PRIORITY 线程可以具有的最高优先级,取值为10。static int MIN_PRIORITY 线程可以具有的最低优先级,取值为1。static int NORM_PRIORITY 分配给线程的默认优先级,取值为5。 Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。 每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。 线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。 2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。 3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0)一样。 4、线程让步:Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。 5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。 6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。注意:Thread中suspend()和resume()两个方法在JDK1.5中已经废除,不再介绍。因为有死锁倾向。 7、常见线程名词解释 主线程:JVM调用程序mian()所产生的线程。 当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。 前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。 本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/27069 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'n'.【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 【程序9】 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。 【程序10】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? 【程序11】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 【程序12】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 【程序13】 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析: 【程序14】 题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。 【程序15】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 【程序16】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 【程序17】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 【程序18】 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 【程序19】 题目:打印出如下图案(菱形) * *** ****** ******** ****** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。 【程序20】 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 1.程序分析:请抓住分子与分母的变化规律。 【程序21】 题目:求1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 【程序22】 题目:利用递归方法求5!。 1.程序分析:递归公式:fn=fn_1*4! 【程序23】 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。 【程序24】 题目:给一个不多于5位的正整数,要求: 一、求它是几位数,二、逆序打印出各位数字。 【程序25】 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 【程序26】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。 【程序27】 题目:求100之内的素数 【程序28】 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。 【程序29】 题目:求一个3*3矩阵对角线元素之和 1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。 【程序30】 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 1.程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。 【程序31】 题目:将一个数组逆序输出。 1.程序分析:用第一个与最后一个交换。 【程序32】 题目:取一个整数a从右端开始的4~7位。 程序分析:可以这样考虑: (1)先使a右移4位。 (2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4) (3)将上面二者进行&运算。 【程序33】 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析:2 13 3 14 6 4 15 10 10 5 1 【程序34】 题目:输入3个数a,b,c,按大小顺序输出。 1.程序分析:利用指针方法。 【程序35】 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。 【程序36】 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 【程序37】 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 【程序38】 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。 【程序39】 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) 【程序40】 题目:字符串排序。 【程序41】 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子? 【程序42】 题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。 【程序43】 题目:求0—7所能组成的奇数个数。 【程序44】 题目:一个偶数总能表示为两个素数之和。 【程序45】 题目:判断一个素数能被几个9整除 【程序46】 题目:两个字符串连接程序 【程序47】 题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。 【程序48】 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。 【程序49】 题目:计算字符串中子串出现的次数 【程序50】 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件“stud”中。第二篇:Java面向对象编程习题总结
第三篇:JAVA编程心得体会
第四篇:Java多线程编程总结
第五篇:Java基础编程题