




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java笔试经典(基础部分 及答案和分析)1、一个.java源文件中是否可以包括多个类(不是内部类)?有什么限制? 7答:可以包括 多个类,但是最多只能有一个public修饰的类。2、Java有没有goto? 7答:java中有goto ,但只是保留字,用来兼容以前版本的再无其他用途。3、说说&和&的区别。 8答:&是按位与,左右两边同时为1这得1,其他情况都为0,而&是逻辑与,左右两边都为true这结果为true否则为false,并且&会发生短路,而& 不会发生短路4、在JAVA中如何跳出当前的多重嵌套循环? 8答:有两种方法:在循环体中boolean值和break搭配使用;使用continue和break对应的标识,运行到bcontinue或break处时跳出到对应标识处5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 9答:switch语句是使用int 型和枚举型的,而精度比int 型低的byte char short 都可以转化成int 型,所以byte是可以用在switch上的,但是系统不会将long型的转化成int型,所以不能使用long.而String是个类,而不是基本数据类型,系统也不会自动将String 转化成int的。6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9答:前一个错了,s1=s1+1处s1+1会使short型s1转化成int型,但是在将int型的值赋给short型的变量将会报错。后一个是对的,因为+=是一个复合型运算符,复合赋值运算符会自动地将运算结果转型为其左操作数的类型,不会对s1的类型进行改变。7、char型变量中能不能存贮一个中文汉字?为什么? 9答:char型的变量可以存贮一个中文字。应为Java是用Unicode来编码的,而Unicode编码是用16个字节来存贮char型的变量的,而一个汉字正好是用16个字节来存储的,所以可以。8、用最有效率的方法算出2乘以8等於几? 9答:23,将2左移3位。因为位运算是cpu直接运算的,所以效率最高。9、请设计一个一百亿的计算器 9答:10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11答:final关键字修饰一个变量是引用不能变,引用的对象还是可以改变的。如:StringBuffer stb=new StringBuffer(“abc”);Stb=new StringBuffer(“bcd”);/会报错。但是运行stb.append(“abdeae”);不会报错。11、=和equals方法究竟有什么区别? 11答:=是专门用来比较两个变量是否相等的,也就是比较两个变量对应的内存中的数值是否相等。用来比较基本类型的数据是否相等,两个引用是否相等(是否指向同一个对象),只能用“=”。对于equal方法,主要是用来比较对象是否相等。在Object类里的equal()方法没有重写的情况下,equal和=是一样的。但是重写后equal()是指的连个对象是否相等,即其对应的数据以及类型是否相等(hashCode()是否相等)。12、静态变量和实例变量的区别? 12答:在语法定义上看:静态变量在定义时需要加上static,而实例变量不需要。在程序运行上看:实例变量是属于一个实例的,当一个实例创建时系统才为之分配内存空间。而静态变量是属于一个类的,当程序加载到该类字节码时,就会开辟对应的静态空间,就可以是使用静态变量了,而不需要创建实例。实例变量需要通过对象才能使用,但是静态变量直接通过类来就还可以使用了。13、是否可以从一个static方法内部发出对非static方法的调用? 12答:不能,一个static方法只能调用static方法。应为非静态方法是通过实例来调用的,使用前必须先创建实例。但是static方法但调用可以不用创建实例的,所以在static方法中使用非static方法时,该非static方法没有创建对应的实力,这时是会报错的。14、Integer与int的区别 13答:int是Java提供的8中原始数据类型之一。Java为每个原始数据类型都提供了封装类,Integer是Java为int提供的封装类。Int的默认值为0,而integer的默认值为null,即integer可以区分null和0的区别,int则无法表示处为复制的情况,例如 想要表达出没有参加考试和参加了考试但是成绩为0分的区别,只能用Integer了。在JSP开发中Integerde 默认值为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 13答:12 和-11。Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。16、下面的代码有什么不妥之处? 131. if(username.equals(“zxx”)2. . int x = 1;return x=1?true:false;答:1可能报错(NullPointerException),因为username可能为null。2中不知道返回类型是否是int型,而且返回值一定是true,没有必要写成三元运算符。17、请说出作用域public,private,protected,以及不写时的区别 13答:作用域 当前类 同一package 子类 其他packagePublicYYYYProtectedYYYN默认(Friendly)YYNNPrivateYNNN18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14答:overload是重载,表示同一个类中可以有多个同名的方法,但是这些方法的参数列表不相同(参数的个数或者是类型不同)。Override是重写,表示子类中的方法可以与父类中的某个方法的名称和参数完全一样,通过子类创建实例对象调用这个方法时,将会调用子类中的定义方法,而将父类中的这个方法覆盖掉,这也是面向对象的一种表现形式。override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));2、不能通过访问权限、返回类型、抛出的异常进行重载;3、方法的异常类型和数目不会对重载造成影响;4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。19、构造器Constructor是否可被override? 15答:不能,应为构造器不能被继承,所以不能被重写,但是可以被重载。20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类,抽象类中可以有静态的main方法。21、写clone()方法时,通常都有一行代码,是什么? 15答:clone有缺省行为,Super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。22、面向对象的特征有哪些方面 15答:封装:封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。23、java中实现多态的机制是什么? 17答:靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。24、abstract class和interface有什么区别? 17答:含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static。25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 18答:不能。abstract需要重载,static为类方法,没有重载一说abstract为没有实现的方法,native为本机实现的方法,自相矛盾abstract方法没有实现,也不可能实际调用抽象方法,没有必要synchronized修饰,当然子类可以根据需要同步该方法.26、什么是内部类?Static Nested Class 和 Inner Class的不同。 19答:定义在封装类内部的类就是内部类。27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20答:内部内可以引用它的包含类的成员,如果不是静态内部类,就没有什么限制;但是如果是静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员,而只能访问外部类中的静态成员。28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21答:可以继承其他内,或者是想接口,但是不能用extends和implement关键词。29、super.getClass()方法调用 2130、String是最基本的数据类型吗? 22答:不是。最基本的数据类型是byte char short int long float double boolean这八种。而String是一个final类。31、Strings=Hello;s=s+world!;这两行代码执行后,原始的String对象中的内容到底变了没有? 22答:没有。原来的对象中的内容还是“Hello”,只是后来的s引用指向的是另一个对象“Hello world”而已。32、是否可以继承String类? 23答:不能继承String类,因为String 类是final的不能继承。33、String s = new String(xyz);创建了几个String Object? 二者之间有什么区别? 23答:创建了两个Stirng Object ,一个是对象“xyz”,一个是new String()来创建的。但是由new String()创建的对象是“xyz”的一个拷贝内容是完全一样的,使用equal()比较是true的,但是使用“=”比较是false的。34、String 和StringBuffer的区别 23答:StringBuffer是可变的,但是String是不可变的。String实例化以后所有的属性都是final的,而StringBuffer确不是。35、如何把一段逗号分割的字符串转换成一个数组? 2436、数组有没有length()这个方法? String有没有length()这个方法? 24答:数组有length属性没有length()方法。String有length()方法。37、下面这条语句一共创建了多少个对象:String s=a+b+c+d; 24答:共创建了7个对象。Stringss=“a”+”b”+”c”;/创建了5个对象Stringss=“a”+”b”+”c”+”d”;/创建了7个对象Stringss=“a”+”b”+”c”+”d”+”e”;/创建了9个对象Stringss=“a”+”b”+”c”+”d”+”e”+”f”;/创建了11个对象注:String是一个不可变的字符序列,每次字符相加操作都会有新的对象形成。38、try 里有一个return语句,那么紧跟在这个try后的finally 里的code会不会被执行,什么时候被执行,在return前还是后? 25答:会执行。如果finally没有return则在finally后执行。如果有这finally执行后就结束,不会执行try中的return。39、下面的程序代码输出的结果是多少? 2540、final, finally, finalize的区别。 27答:finally修饰符。用来修饰类、方法、属性。对应的类不可悲继承,对应的方法不可被覆盖。对应的属性不可被修改。Finally修饰符后面的语句一定会会被执行,长用在try catch 后面。Finalize()方法是在垃圾收集器对无用对象进行清理时对该对象进行调用的。41、运行时异常与一般异常有何异同? 27答:Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception。Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。Exception:表示可恢复的例外,这是可捕捉到的。Java提供了两类主要的异常:runtime exception和checked exception。checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。异常处理的目标之一就是为了把程序从异常中恢复出来。42、error和exception有什么区别? 28答:Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception。Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。Exception:表示可恢复的例外,这是可捕捉到的。43、Java中的异常处理机制的简单原理和应用。 2844、请写出你最常见到的5个runtime exception。 28NullPointerException ClassCastException SystemException UnknowTypeException BufferUnderflowException BufferOverFlowException UnknowElementExcepion 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗? 29答:在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。Throwable 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类,但是Exception是可以处理的,Error是不能处理的,它是由外部环境或事故造成。try、catch 和 finallytry 块:将一个或者多个语句放入 try 时,则表示这些语句可能抛出异常。编译器知道可能要发生异常,于是用一个特殊结构评估块内所有语句。catch 块:当问题出现时,一种选择是定义代码块来处理问题,catch 块的目的便在于此。catch 块是 try 块所产生异常的接收者。基本原理是:一旦生成异常,则 try 块的执行中止,JVM 将查找相应的 JVM。finally 块:还可以定义 finally 块,无论运行 try 块代码的结果如何,该块里面的代码一定运行。在常见的所有环境中,finally 块都将运行。无论 try 块是否运行完,无论是否产生异常,也无论是否在 catch 块中得到处理,finally 块都将执行。try-catch-finally 规则:1.必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。2.必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。3.catch 块与相应的异常类的类型相关。4.一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。5.可嵌套 try-catch-finally 结构。6.在 try-catch-finally 结构中,可重新抛出异常。7.除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。throws,throwthrow 用于手动抛出一个异常,一般抛出自定义异常throws的一个例子public static void main(String args) throws Exception Class.forName(java.lang.String);/本来这里要用try-catch处理 /这里使用throws,它是把异常抛出去,让调用本方法去处理,一般定于方法右边,如上main方法 46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29答: 有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被挂起的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。47、sleep() 和 wait() 有什么区别? 30答:1.sleep()方法介绍 sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程可能执行,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)醒来的线程具有更高的优先级。 (b)正在运行的线程因为其它原因而阻塞。2.wait()方法介绍 wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 当调用wait()后,线程会释放掉它所占有的锁标志,从而使线程所在对象中的其它synchronized数据可被别的线程使用。3.waite()和notify()的区别 waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronizedblock中进行调用。如果在non-synchronized函数或non-synchronizedblock中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常48、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 32答:同步(synchronized)和异步(asynchronized)是对于多线程(multi-threading)而言的同步可防止并发主要出于数据安全的考虑如某一线程在执行完对数据的加法操作后在还没来得及使用新数据之前被另一线程就抢先执行了减法操作这样它就没法得到它单一施加影响的数据结果,存在安全隐患异步允许并发ajax技术通常都是异步实现的去服务端请求数据的同时前台的操作不会阻塞而是异步进行节省时间的同时保证了效率50、多线程有几种实现方法?同步有几种实现方法? 33答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notifywait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。51、启动一个线程是用run()还是start()? . 33答: 启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。START()是方法,它调用RUN()方法.而RUN()方法是你必须重写的.run()方法中包含的是线程的主体。52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33答:分几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能。 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。 3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。 4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。53、线程的基本概念、线程的基本状态以及状态之间的关系 34答:一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。如果只是一个cpu,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu一会执行a线索,一会执行b线索,切换时间很快,给人的感觉是a,b在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为a传数据,一会为b传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34答:主要相同点:Lock能完成synchronized所实现的所有功能主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36package c08.temp;public class Thread1 static int j=10;public static void main(String args) Thread1 te=new Thread1();for(int i=0;i2;i+)Add a =te.new Add();a.start();Reduce r=te.new Reduce();Thread t=new Thread(r);t.start();class Add extends Threadpublic void run()inc();System.out.println(has added!);class Reduce implements Runnablepublic void run() dec();System.out.println(has reduced!);public synchronized void inc()j+;System.out.println(j has add 1 :+j);public synchronized void dec()j-;System.out.println(j has reduce 1 :+j);56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 3857、介绍Collection框架的结构 43答:58、Collection框架中实现比较要实现什么接口 43答;collection 实现的主要接口有 set list 59、ArrayList和Vector的区别 44答:安全方面 Vector是线程安全的,而ArrayList不是是线程安全的。数据增长方面 vector是以原来的一倍来增长的,而ArrayList是以原来的一半来增长得。60、HashMap和Hashtable的区别 441. Hashtable 是基于老版本的Dictionay类继承而来的,而HashMap是从Java1.2才有的2. Hashtable是线程安全的,而HashMap不是线程安全的。3. HashMap可以存贮null的键值,但是Hashtable不行。61、List 和 Map 区别? 45答:62、List, Set, Map是否继承自Collection接口? 45答:List和set是集成collection接口的,Map不是。63、List、Map、Set三个接口,存取元素时,各有什么特点? 45答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。64、说出ArrayList,Vector, LinkedList的存储性能和特性 46答:ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快65、去掉一个Vector集合中重复的元素 46Vector newVector = new Vector();For (int i=0;ivector.size();i+)Object obj = vector.get(i); if(!newVector.contains(obj); newVector.add(obj);66、Collection 和 Collections的区别。 47答:java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。 java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用=还是equals()? 它们有何区别? 4768、你所知道的集合类都有哪些?主要方法? 47CollectionListLinkedListArrayListVectorStackSetMapHashtableHashMapWeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:Iteratorit=collection.iterator();/获得一个迭代子while(it.hasNext()Objectobj=it.next();/得到下一个元素由Collection接口派生的两个接口是List和Set。List接口List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。LinkedList类LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:Listlist=Collections.synchronizedList(newLinkedList(.);ArrayList类ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。Vector类Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。Stack类Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。Set接口Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。请注意:必须小心操作可变对象(MutableObject)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。Map接口请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。Hashtable类Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。Hashtable通过initialcapacity和loadfactor两个参数调整性能。通常缺省的loadfactor0.75较好地实现了时间和空间的均衡。增大lo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省仪陇中学2023-2024学年高二上学期10月月考化学题 含解析
- 安徽省名校联盟2023-2024学年高三上学期实验班12月大联考化学含解析
- 山西工程职业学院《催化剂导论》2023-2024学年第二学期期末试卷
- 北京经济技术职业学院《汉彝翻译理论与实践》2023-2024学年第二学期期末试卷
- 浙江舟山群岛新区旅游与健康职业学院《汽轮机课程设计》2023-2024学年第二学期期末试卷
- 湖北健康职业学院《土地资源管理学》2023-2024学年第二学期期末试卷
- 河北交通职业技术学院《建筑意匠》2023-2024学年第二学期期末试卷
- 青岛职业技术学院《广播理论与业务》2023-2024学年第二学期期末试卷
- 西安城市建设职业学院《动物生产学牛羊》2023-2024学年第二学期期末试卷
- 山东科技大学《新闻采写基础》2023-2024学年第二学期期末试卷
- (完整版)建筑工程技术说专业、专业剖析
- 肝硬化护理查房个案介绍ppt
- 食堂巡查记录表
- 内分泌科糖尿病“一病一品”
- GB/T 42466-2023生物样本库多能干细胞管理技术规范
- 2023年大唐集团招聘笔试试题及答案
- 冠寓运营管理手册
- 学校意识形态工作存在的问题及原因分析
- Unit+1+Extended+reading课件高中英语牛津译林版(2020)选择性必修第一册
- 周1530安全教育记录(2021至2022)
- 物料管理入门部分真题含答案
评论
0/150
提交评论