东软校招java笔试题及答案_第1页
东软校招java笔试题及答案_第2页
东软校招java笔试题及答案_第3页
东软校招java笔试题及答案_第4页
东软校招java笔试题及答案_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

东软校招java笔试题及答案东软校招Java笔试题及答案一、选择题(30分)1.关于Java中的基本数据类型,下列说法正确的是:A.boolean类型可以转换为int类型B.char类型占用2个字节C.float类型的精度比double类型高D.long类型默认值是0.0f答案:【B】解析:char类型在Java中占用2个字节,用于表示Unicode字符。boolean类型不能直接转换为int类型;float类型的精度比double类型低;long类型默认值是0L,不是0.0f。易错警示:很多考生混淆了long和float的默认值以及精度。2.下列关于Java中接口的说法,错误的是:A.接口中的方法默认是publicabstractB.接口可以包含静态方法C.接口可以包含默认方法D.接口可以包含构造方法答案:【D】解析:接口中不能包含构造方法,因为接口不能被实例化。Java8之后,接口可以包含静态方法和默认方法。接口中的方法默认是publicabstract。易错警示:很多考生不了解Java8对接口的增强特性。3.下列关于Java中异常处理的说法,正确的是:A.try-with-resources语句可以自动关闭实现了AutoCloseable接口的资源B.Error类型的异常可以被捕获和处理C.RuntimeException必须被声明或捕获D.finally块中的代码一定会执行答案:【A】解析:try-with-resources语句可以自动关闭实现了AutoCloseable接口的资源,这是Java7引入的特性。Error类型的异常通常不需要被捕获和处理;RuntimeException不需要被声明或捕获;finally块中的代码在try或catch块中有return语句时也可能不执行。易错警示:考生常误认为finally块中的代码一定会执行,实际上在某些特殊情况下可能不会执行。4.下列关于Java中集合框架的说法,错误的是:A.ArrayList的底层实现是数组B.LinkedList的随机访问效率高于ArrayListC.HashMap的键和值都可以为nullD.ConcurrentHashMap是线程安全的答案:【B】解析:LinkedList的随机访问效率低于ArrayList,因为LinkedList是基于链表实现的。ArrayList的底层实现是数组;HashMap的键和值都可以为null;ConcurrentHashMap是线程安全的。易错警示:考生常误以为LinkedList的随机访问效率高,实际上数组结构的随机访问效率更高。5.下列关于Java中多线程的说法,正确的是:A.使用synchronized关键字修饰的方法是非线程安全的B.volatile关键字可以保证原子性C.使用Thread.start()方法会立即执行run()方法D.实现Runnable接口比继承Thread类更灵活答案:【D】解析:实现Runnable接口比继承Thread类更灵活,因为Java不支持多重继承,而可以实现多个接口。使用synchronized关键字修饰的方法是线程安全的;volatile关键字不保证原子性;Thread.start()方法只是启动线程,线程调度器决定何时执行run()方法。易错警示:考生常混淆volatile和synchronized的作用,volatile主要用于保证可见性,不保证原子性。6.下列关于Java中泛型的说法,错误的是:A.泛型可以用于类、接口和方法B.泛型类型参数可以是基本数据类型C.泛型类型在运行时会被擦除D.可以使用通配符<?>表示未知类型答案:【B】解析:泛型类型参数不能是基本数据类型,只能是引用类型。泛型可以用于类、接口和方法;泛型类型在运行时会被擦除;可以使用通配符<?>表示未知类型。易错警示:考生常误以为泛型可以用于基本数据类型,实际上只能用于引用类型。7.下列关于Java中IO的说法,正确的是:A.字节流和字符流的区别在于处理的数据单位不同B.BufferedReader可以读取二进制文件C.使用FileInputStream读取文件时,如果文件不存在会抛出FileNotFoundExceptionD.序列化是将对象转换为字节的过程答案:【A】解析:字节流和字符流的区别在于处理的数据单位不同,字节流处理的是字节,字符流处理的是字符。BufferedReader不能读取二进制文件;使用FileInputStream读取文件时,如果文件不存在会抛出FileNotFoundException;序列化是将对象转换为字节的过程。易错警示:考生常混淆字节流和字符流的使用场景,字符流更适合处理文本数据。8.下列关于Java中垃圾回收的说法,正确的是:A.垃圾回收可以回收所有不再使用的对象B.finalize()方法一定会被调用C.可以通过System.gc()方法强制立即进行垃圾回收D.引用计数法是Java中使用的垃圾回收算法答案:【A】解析:垃圾回收可以回收所有不再使用的对象,但回收的时间是不确定的。finalize()方法不一定会被调用;通过System.gc()方法只是建议JVM进行垃圾回收,但不保证立即执行;Java使用的是可达性分析算法,而不是引用计数法。易错警示:考生常误以为可以精确控制垃圾回收的时机,实际上JVM决定何时进行垃圾回收。9.下列关于Java中Lambda表达式的说法,错误的是:A.Lambda表达式可以替代匿名内部类B.Lambda表达式只能用于函数式接口C.Lambda表达式可以访问非final局部变量D.Lambda表达式可以有多个参数答案:【C】解析:Lambda表达式只能访问effectivelyfinal(实际上是final的)局部变量。Lambda表达式可以替代匿名内部类;Lambda表达式只能用于函数式接口;Lambda表达式可以有多个参数。易错警示:考生常误以为Lambda表达式可以修改局部变量,实际上只能访问不能修改。10.下列关于Java中StreamAPI的说法,正确的是:A.Stream只能处理集合B.Stream操作是立即执行的C.Stream的中间操作会立即执行D.Stream可以并行处理数据答案:【D】解析:Stream可以并行处理数据,提高大数据量处理的效率。Stream不仅可以处理集合,还可以处理数组、I/O通道等;Stream操作是延迟执行的,只有终端操作才会触发执行;Stream的中间操作不会立即执行。易错警示:考生常混淆Stream的中间操作和终端操作,中间操作是延迟执行的。11.下列关于Java中String类的说法,错误的是:A.String类是final的,不能被继承B.String对象是不可变的C.使用"+"连接字符串时,JVM会使用StringBuilder优化D.String的equals()方法比较的是内存地址答案:【D】解析:String的equals()方法比较的是字符串内容,而不是内存地址。String类是final的,不能被继承;String对象是不可变的;使用"+"连接字符串时,JVM会使用StringBuilder优化。易错警示:考生常混淆equals()和==的区别,==比较的是内存地址,而equals()比较的是内容。12.下列关于Java中枚举的说法,正确的是:A.枚举类可以继承其他类B.枚举可以实现接口C.枚举的构造方法必须是public的D.枚举的值只能是字符串答案:【B】解析:枚举可以实现接口,但不能继承其他类。枚举的构造方法默认是private的,不能是public的;枚举的值不限于字符串,可以是任何类型。易错警示:考生常误以为枚举可以继承其他类,实际上枚举隐式继承了java.lang.Enum类。13.下列关于Java中注解的说法,错误的是:A.注解可以用于类、方法、字段等B.运行时注解可以通过反射获取C.注解可以继承D.元注解用于注解其他注解答案:【C】解析:注解不能继承。注解可以用于类、方法、字段等;运行时注解可以通过反射获取;元注解用于注解其他注解。易错警示:考生常误以为注解可以继承,实际上注解之间没有继承关系。14.下列关于Java中NIO的说法,正确的是:A.NIO是同步非阻塞IOB.NIO使用流式处理数据C.Buffer是NIO的核心组件之一D.Channel和Stream类似,都是单向的答案:【C】解析:Buffer是NIO的核心组件之一,用于存储数据。NIO是同步非阻塞IO;NIO使用缓冲区处理数据,而不是流式处理;Channel可以是双向的,而Stream是单向的。易错警示:考生常混淆NIO和BIO的区别,NIO是同步非阻塞IO,而BIO是同步阻塞IO。15.下列关于Java中模块系统(Java9+)的说法,错误的是:A.模块系统将JDK分为多个模块B.模块可以明确声明依赖关系C.模块系统提高了JAR文件的启动性能D.模块系统强制要求所有代码都在模块中答案:【D】解析:模块系统不强制要求所有代码都在模块中,非模块化代码仍然可以运行。模块系统将JDK分为多个模块;模块可以明确声明依赖关系;模块系统提高了JAR文件的启动性能。易错警示:考生常误以为模块系统强制要求所有代码都在模块中,实际上非模块化代码仍然可以运行。二、填空题(15分)1.Java中,关键字________用于表示一个常量。答案:【final】解析:final关键字用于表示一个常量,一旦赋值后不能被修改。定义常量时,通常使用全大写字母命名,例如:publicstaticfinalintMAX_VALUE=100;。易错警示:考生常混淆final和const,Java中没有const关键字。2.Java中,________接口是所有集合框架的根接口。答案:【Collection】解析:Collection接口是所有集合框架的根接口,它定义了集合的基本操作,如添加、删除、遍历等。List和Set接口都继承自Collection接口。易错警示:考生常误以为Collection是类,实际上它是接口。3.Java中,使用________关键字可以声明一个接口。答案:【interface】解析:interface关键字用于声明一个接口。接口是一种抽象类型,用于描述类应该具有的方法,但不提供实现。例如:publicinterfaceMyInterface{voidmethod();}。易错警示:考生常混淆interface和abstractclass,接口不能包含实例字段和构造方法。4.Java中,________方法用于获取当前时间戳,单位是毫秒。答案:【System.currentTimeMillis()】解析:System.currentTimeMillis()方法用于获取当前时间戳,单位是毫秒,是从1970年1月1日00:00:00UTC开始的毫秒数。常用于计算程序执行时间或作为时间基准。易错警示:考生常混淆currentTimeMillis()和nanoTime(),nanoTime()返回的是纳秒数,但不表示绝对时间。5.Java中,________关键字用于声明一个抽象类。答案:【abstract】解析:abstract关键字用于声明一个抽象类。抽象类不能被实例化,可以包含抽象方法和具体方法。抽象方法没有方法体,由子类实现。例如:publicabstractclassAnimal{publicabstractvoidmakeSound();}。易错警示:考生常误以为抽象类不能包含具体方法,实际上可以包含具体方法。6.Java中,________类用于生成随机数。答案:【Random】解析:Random类用于生成随机数。它可以生成各种类型的随机数,如int、long、double、float等。例如:Randomrandom=newRandom();intrandomNumber=random.nextInt(100);。易错警示:考生常混淆Random和Math.random(),Math.random()只能生成0.0到1.0之间的double类型随机数。7.Java中,________方法用于将字符串转换为小写。答案:【toLowerCase()】解析:toLowerCase()方法用于将字符串转换为小写。它返回一个新的字符串,其中所有字符都是小写的。例如:Stringstr="HelloWorld";StringlowerStr=str.toLowerCase();。易错警示:考生常混淆toLowerCase()和toUpperCase(),toUpperCase()用于将字符串转换为大写。8.Java中,________方法用于将字符串转换为整数。答案:【parseInt()】解析:parseInt()方法用于将字符串转换为整数。它是Integer类的一个静态方法,例如:intnum=Integer.parseInt("123");。如果字符串不能转换为整数,会抛出NumberFormatException异常。易错警示:考生常混淆parseInt()和valueOf(),valueOf()返回的是Integer对象,而parseInt()返回的是int基本类型。9.Java中,________关键字用于处理异常。答案:【try-catch-finally】解析:try-catch-finally关键字组合用于处理异常。try块包含可能抛出异常的代码,catch块处理特定类型的异常,finally块包含无论是否发生异常都会执行的代码。例如:try{//可能抛出异常的代码}catch(Exceptione){//异常处理代码}finally{//清理代码}。易错警示:考生常忽略finally块的使用,但finally块对于资源清理非常重要。10.Java中,________方法用于获取数组的长度。答案:【length】解析:length属性用于获取数组的长度。例如:int[]arr=newint[10];intlength=arr.length;。注意,对于字符串,使用length()方法获取长度,而对于数组,使用length属性。易错警示:考生常混淆数组的length和字符串的length(),数组使用length属性,字符串使用length()方法。三、判断题(10分)1.Java中,一个类可以实现多个接口,但只能继承一个类。答案:【正确】解析:Java中,一个类可以实现多个接口,但只能继承一个类,这是因为Java不支持多重继承。例如:publicclassMyClassextendsSuperClassimplementsInterface1,Interface2{}。易错警示:考生常误以为Java支持多重继承,实际上Java只支持单继承,但通过接口可以实现多重继承的效果。2.Java中,String类是可变的。答案:【错误】解析:Java中,String类是不可变的。一旦创建,String对象的内容就不能被修改。任何修改String对象的操作实际上都是创建了一个新的String对象。例如:Stringstr="hello";str=str+"world";//这里创建了一个新的字符串对象。易错警示:考生常误以为String对象是可变的,实际上它是不可变的,这也是为什么String是线程安全的原因。3.Java中,final修饰的类不能被继承。答案:【正确】解析:final修饰的类不能被继承。例如:publicfinalclassFinalClass{}。任何尝试继承FinalClass的代码都会导致编译错误。易错警示:考生常混淆final和abstract,abstract类不能被实例化,但可以被继承,而final类不能被继承。4.Java中,构造方法可以有返回值。答案:【错误】解析:Java中,构造方法没有返回值,包括void。构造方法的名称必须与类名相同,并且没有返回类型。例如:publicMyClass(){}。易错警示:考生常误以为构造方法可以有返回值,实际上构造方法没有返回值。5.Java中,静态方法不能访问非静态成员。答案:【正确】解析:Java中,静态方法不能访问非静态成员,因为静态方法属于类,而不是类的实例。非静态成员只有在创建实例后才能访问。例如:publicclassMyClass{privateintnonStaticVar;publicstaticvoidstaticMethod(){//nonStaticVar=10;//编译错误}}。易错警示:考生常误以为静态方法可以访问非静态成员,实际上不能直接访问,除非通过实例访问。6.Java中,equals()方法比较的是对象的内存地址。答案:【错误】解析:Java中,equals()方法默认比较的是对象的内存地址,但很多类重写了这个方法,用于比较对象的内容。例如:String类重写了equals()方法,用于比较字符串内容。易错警示:考生常混淆equals()和==,==比较的是内存地址,而equals()默认比较的是内存地址,但可以被重写。7.Java中,switch语句可以用于String类型。答案:【正确】解析:从Java7开始,switch语句可以用于String类型。例如:switch(str){case"hello"://处理"hello"break;case"world"://处理"world"break;}。易错警示:考生常误以为switch语句只能用于基本类型,实际上从Java7开始可以用于String类型。8.Java中,接口中可以包含构造方法。答案:【错误】解析:Java中,接口中不能包含构造方法,因为接口不能被实例化。接口中只能包含常量、抽象方法、默认方法和静态方法。易错警示:考生常混淆类和接口,类中可以有构造方法,但接口中不能有。9.Java中,try-with-resources语句可以自动关闭资源。答案:【正确】解析:Java中,try-with-resources语句可以自动关闭资源,只要资源实现了AutoCloseable接口。例如:try(FileInputStreamfis=newFileInputStream("file.txt")){//使用fis}//fis会自动关闭。易错警示:考生常忘记手动关闭资源,导致资源泄漏,使用try-with-resources可以避免这个问题。10.Java中,方法重写(override)和方法重载(overload)是同一个概念。答案:【错误】解析:Java中,方法重写(override)和方法重载(overload)是不同的概念。方法重写发生在子类中,用于重写父类的方法;方法重载发生在同一个类中,用于定义多个同名但参数不同的方法。易错警示:考生常混淆重写和重载,重写要求方法签名相同,而重载要求方法名相同但参数不同。四、简答题(20分)1.简述Java中的多态机制及其实现方式。答案:【多态是面向对象编程的三大特性之一,指的是同一个操作作用于不同的对象,可以有不同的解释和执行结果。Java中的多态主要通过以下方式实现:(1)继承:子类继承父类,重写父类的方法;(2)接口:实现接口的类必须实现接口中的方法;(3)方法重写:子类重写父类的方法,当通过父类引用调用该方法时,实际执行的是子类的方法;(4)方法重载:同一个类中定义多个同名但参数不同的方法,根据实际传递的参数决定调用哪个方法。多态提高了代码的可扩展性和可维护性,使得程序更加灵活。】解析:多态是面向对象编程的核心概念之一,它允许使用统一的接口操作不同类型的对象。Java中的多态主要通过继承和接口实现,方法重写是实现多态的关键。当父类引用指向子类对象时,通过该引用调用重写的方法,实际执行的是子类的方法。这种机制使得代码更加灵活,可以轻松扩展新的功能而不需要修改现有代码。易错警示:考生常混淆多态和方法重载,多态主要关注的是方法的动态绑定,而方法重载是静态的,在编译时确定调用哪个方法。2.解释Java中的异常处理机制,并说明checked异常和unchecked异常的区别。答案:【Java中的异常处理机制主要包括try-catch-finally语句和throw关键字。try块包含可能抛出异常的代码,catch块处理特定类型的异常,finally块包含无论是否发生异常都会执行的代码。throw关键字用于手动抛出异常。checked异常和unchecked异常的区别在于:(1)checked异常:在编译时检查,必须被捕获或声明抛出,否则程序无法编译。例如IOException、SQLException等。(2)unchecked异常:在运行时检查,不强制要求捕获或声明抛出,通常是程序逻辑错误。例如NullPointerException、ArrayIndexOutOfBoundsException等。checked异常通常是由外部因素引起的,如文件不存在、网络连接失败等;而unchecked异常通常是由程序逻辑错误引起的。】解析:异常处理是Java程序健壮性的重要保障。checked异常和unchecked异常的主要区别在于编译时的检查机制。checked异常要求程序员必须处理,这有助于处理可恢复的外部错误;而unchecked异常通常是程序逻辑错误,应该通过改进代码来避免,而不是通过异常处理。理解这两者的区别有助于编写更健壮的代码。易错警示:考生常误以为所有异常都必须被捕获,实际上unchecked异常不需要被捕获,但处理它们可以提高程序的健壮性。3.简述Java中的集合框架,并比较List、Set和Map的区别。答案:【Java中的集合框架是一组类和接口,用于存储和操作对象集合。集合框架主要包括Collection接口和Map接口两大分支。Collection接口的子接口包括List和Set。List和Set的区别在于:(1)List:有序集合,允许重复元素,可以通过索引访问元素。常见实现类有ArrayList、LinkedList等。(2)Set:无序集合(HashSet的顺序是不确定的),不允许重复元素。常见实现类有HashSet、TreeSet等。Map接口用于存储键值对,键是唯一的,值可以重复。常见实现类有HashMap、TreeMap等。List适合需要保持插入顺序和允许重复的场景;Set适合需要保证元素唯一性的场景;Map适合需要通过键快速查找值的场景。】解析:Java集合框架是Java编程中非常重要的部分,不同的集合类适用于不同的场景。List、Set和Map各有特点和适用场景。List保持元素的插入顺序,允许重复;Set不保持插入顺序,不允许重复;Map存储键值对,键是唯一的。理解这些区别有助于选择合适的集合类,提高程序效率。易错警示:考生常混淆Set和List的特点,Set不允许重复元素,而List允许重复元素,这是两者最根本的区别。4.解释Java中的多线程实现方式,并比较继承Thread类和实现Runnable接口的优缺点。答案:【Java中的多线程实现主要有两种方式:(1)继承Thread类:通过继承Thread类并重写run()方法来创建线程。例如:publicclassMyThreadextendsThread{publicvoidrun(){//线程执行代码}}。(2)实现Runnable接口:通过实现Runnable接口并实现run()方法来创建线程。例如:publicclassMyRunnableimplementsRunnable{publicvoidrun(){//线程执行代码}}。两种方式的优缺点比较:(1)继承Thread类的优点:实现简单,可以直接使用Thread类的方法;缺点:Java不支持多重继承,如果继承了Thread类,就不能再继承其他类。(2)实现Runnable接口的优点:Java支持多重实现,可以实现多个接口;缺点:需要额外创建Thread对象,代码稍显复杂。通常推荐使用实现Runnable接口的方式,因为它更加灵活。】解析:多线程是Java编程中的重要概念,提供了两种实现方式。继承Thread类的方式实现简单,但限制了类的继承;实现Runnable接口的方式更加灵活,适合复杂的类层次结构。在实际开发中,推荐使用实现Runnable接口的方式,因为它符合"面向接口编程"的原则,并且可以避免Java单继承的限制。易错警示:考生常误以为只能选择一种方式,实际上两种方式可以结合使用,例如可以将Runnable对象传递给Thread类的构造方法。五、编程题(25分)1.实现一个简单的图书管理系统,要求包含以下功能:-添加图书:包括书名、作者、ISBN号、价格等信息-删除图书:根据ISBN号删除图书-查询图书:根据ISBN号查询图书信息-显示所有图书:显示系统中所有图书的信息-按价格排序:按价格从低到高显示图书信息答案:【```javaimportjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;//图书类classBook{privateStringtitle;privateStringauthor;privateStringisbn;privatedoubleprice;publicBook(Stringtitle,Stringauthor,Stringisbn,doubleprice){this.title=title;this.author=author;this.isbn=isbn;this.price=price;}//GetterspublicStringgetTitle(){returntitle;}publicStringgetAuthor(){returnauthor;}publicStringgetIsbn(){returnisbn;}publicdoublegetPrice(){returnprice;}@OverridepublicStringtoString(){return"Book{"+"title='"+title+'\''+",author='"+author+'\''+",isbn='"+isbn+'\''+",price="+price+'}';}}//图书管理系统类classBookManager{privateList<Book>books;publicBookManager(){books=newArrayList<>();}//添加图书publicvoidaddBook(Bookbook){books.add(book);System.out.println("图书添加成功:"+book.getTitle());}//删除图书publicvoidremoveBook(Stringisbn){for(inti=0;i<books.size();i++){if(books.get(i).getIsbn().equals(isbn)){BookremovedBook=books.remove(i);System.out.println("图书删除成功:"+removedBook.getTitle());return;}}System.out.println("未找到ISBN号为"+isbn+"的图书");}//查询图书publicBookfindBook(Stringisbn){for(Bookbook:books){if(book.getIsbn().equals(isbn)){returnbook;}}returnnull;}//显示所有图书publicvoiddisplayAllBooks(){if(books.isEmpty()){System.out.println("系统中没有图书");return;}System.out.println("所有图书信息:");for(Bookbook:books){System.out.println(book);}}//按价格排序publicvoidsortByPrice(){Collections.sort(books,newComparator<Book>(){@Overridepublicintcompare(Bookb1,Bookb2){returnDpare(b1.getPrice(),b2.getPrice());}});System.out.println("按价格排序后的图书信息:");for(Bookbook:books){System.out.println(book);}}}//测试类publicclassBookManagementSystem{publicstaticvoidmain(String[]args){BookManagermanager=newBookManager();//添加图书manager.addBook(newBook("Java编程思想","BruceEckel","9787111213826",108.00));manager.addBook(newBook("EffectiveJava","JoshuaBloch","9787111255842",69.00));manager.addBook(newBook("深入理解Java虚拟机","周志明","9787115275790",119.00));//显示所有图书manager.displayAllBooks();//查询图书Bookbook=manager.findBook("9787111213826");if(book!=null){System.out.println("查询到的图书:"+book);}else{System.out.println("未找到该图书");}//删除图书manager.removeBook("9787111255842");//再次显示所有图书manager.displayAllBooks();//按价格排序manager.sortByPrice();}}```】解析:这个图书管理系统实现了基本的功能,包括添加、删除、查询和显示图书,以及按价格排序。Book类表示图书对象,包含书名、作者、ISBN号和价格等属性。BookManager类是图书管理系统的核心,使用ArrayList存储图书对象。添加图书使用add()方法,删除图书使用remove()方法,查询图书使用findBook()方法,显示所有图书使用displayAllBooks()方法,按价格排序使用sortByPrice()方法。sortByPrice()方法使用Collections.sort()方法和自定义的Comparator实现排序。测试类演示了如何使用这些功能。易错警示:在删除图书时,需要注意在删除后立即返回,避免继续遍历导致的问题;在排序时,需要正确实现Comparator接口,确保比较逻辑正确。2.实现一个简单的多线程银行账户管理系统,要求包含以下功能:-创建账户:包含账户ID、持有人姓名、余额等信息-存款操作:向指定账户存入指定金额-取款操作:从指定账户取出指定金额-查询余额:查询指定账户的余额-转账操作:从一个账户向另一个账户转账指定金额-确保多线程环境下的线程安全答案:【```javaimportjava.util.HashMap;importjava.util.Map;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;//账户类classAccount{privateStringaccountId;privateStringownerName;privatedoublebalance;privatefinalLocklock;publicAccount(StringaccountId,StringownerName,doubleinitialBalance){this.accountId=accountId;this.ownerName=ownerName;this.balance=initialBalance;this.lock=newReentrantLock();}//获取账户IDpublicStringgetAccountId(){returnaccountId;}//获取持有人姓名publicStringgetOwnerName(){returnownerName;}//获取余额publicdoublegetBalance(){returnbalance;}//存款publicvoiddeposit(doubleamount){lock.lock();try{if(amount<=0){thrownewIllegalArgumentException("存款金额必须大于0");}balance+=amount;System.out.println("存款成功:"+amount+",当前余额:"+balance);}finally{lock.unlock();}}//取款publicvoidwithdraw(doubleamount){lock.lock();try{if(amount<=0){thrownewIllegalArgumentException("取款金额必须大于0");}if(balance<amount){thrownewIllegalArgumentException("余额不足");}balance-=amount;System.out.println("取款成功:"+amount+",当前余额:"+balance);}finally{lock.unlock();}}}//银行类classBank{privateMap<String,Account>accounts;privatefinalLockbankLock;publicBank(){accounts=newHashMap<>();bankLock=newReentrantLock();}//创建账户publicvoidcreateAccount(StringaccountId,StringownerName,doubleinitialBalance){bankLock.lock();try{if(accounts.containsKey(accountId)){thrownewIllegalArgumentException("账户ID已存在");}Accountaccount=newAccount(accountId,ownerName,initialBalance);accounts.put(accountId,account);System.out.println("账户创建成功:"+accountId+",持有人:"+ownerName+",初始余额:"+initialBalance);}finally{bankLock.unlock();}}//存款publicvoiddeposit(StringaccountId,doubleamount){Accountaccount=findAccount(accountId);if(account!=null){account.deposit(amount);}}//取款publicvoidwithdraw(StringaccountId,doubleamount){Accountaccount=findAccount(accountId);if(account!=null){account.withdraw(amount);}}//查询余额publicdoublegetBalance(StringaccountId){Accountaccount=findAccount(accountId);if(account!=null){returnaccount.getBalance();}return0;}//转账publicvoidtransfer(StringfromAccountId,StringtoAccountId,doubleamount){AccountfromAccount=findAccount(fromAccountId);AccounttoAccount=findAccount(toAccountId);if(fromAccount==null||toAccount==null){System.out.println("账户不存在,转账失败");return;}//锁定两个账户,避免死锁if(fromAccountIpareTo(toAccountId)<0){fromAccount.lock.lock();try{toAccount.lock.lock();try{if(fromAccount.getBalance()<amount){System.out.println("余额不足,转账失败");return;}fromAccount.withdraw(amount);toAccount.deposit(amount);System.out.println("转账成功:"+amount+"从"+fromAccountId+"到"+toAccountId);}finally{toAccount.lock.unlock();}}finally{fromAccount.lock.unlock();}}else{toAccount.lock.lock();try{fromAccount.lock.lock();try{if(fromAccount.getBalance()<amount){System.out.println("余额不足,转账失败");return;}fromAccount.withdraw(amount);toAccount.deposit(amount);System.out.println("转账成功:"+amount+"从"+fromAccountId+"到"+toAccountId);}finally{fromAccount.lock.unlock();}}finally{toAccount.lock.unlock();}}}//查找账户

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论