一、简答题
1、语言的执行方式简单说?
答:语言根据执行方式的不同分类:第一是编译执行,如C,它把源程序由特定平台的编译器一次性编译为平台相关的机器码,它的优点是执行速度快,缺点是无法跨平台;第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,类似于同声翻译,它的优点是可以跨平台,缺点是执行速度慢,暴露源程序;第三种是从Java开始引入的“中间码+虚拟机”的方式,它既整合了编译语言与解释语言的优点,同时如虚拟机又可以解决如垃圾回收,安全性检查等这些传统语言头疼的问题,所以其后微软的.NET平台也使用的这种方式。
jdk(.class)->jre->jvm(跨平台)->java解释器
2、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
答:JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file )。类文件的组成包括 JVM 指令集,符号表以及一些辅助信息。
java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。
3、JDK和JRE的区别是什么?
答:
4、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
答:“static”关键字表明一个成员变量或者成员方法可以在没有所属类的实例变量的情况下被访问。
static修饰的方法是基于编译时静态绑定的,而方法覆盖是为了实现多态,是运行时动态绑定。static方法跟类的任何实例都不相关,所以static修饰的方法不需要被覆盖。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的。
5、是否可以在static环境中访问非static变量?
答:不可以。因为静态的成员属于类,随着类的加载而加载到静态方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员。类的加载先于实例的加载,因此静态环境中,不可以访问非静态。
6、Java支持的数据类型有哪些?什么是自动拆装箱?
答:八种基本数据类型:byte,short,int,long,float,double,boolean,char.
自动装箱是java编译器在基本数据类型和对应包装类型的转化。int->integer
自动拆箱:integer->int;
string是引用类型不是基本类型,引用变量是指该变量在栈内存中实际存储的是一个引用地址,实际值在堆中。string类还是final修饰的。
为什么要有基本数据类型到引用类型之间的转换?
引用类型可以new对象,调用包装类中封装好的方法,还有就是如果集合中想存放基本类型,泛型的限定类型只能是对应的包装类型。
7、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
答:覆盖是类与类之间实现多态,并且类之间是继承关系;子类重新定义了父类中的方法,必须有相同的方法名,参数列表和返回类型。
重写是类中实现多态,同一个类里两个或者多个方法的方法名相同但是参数不同的情况。
8、Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
答:当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。
9、接口和抽象类的区别是什么?
答:Java提供和支持创建抽象类和接口。从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
它们的实现有共同点,不同点在于:
1、接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
2、类可以实现很多个接口,但是只能继承一个抽象类
3、类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4、抽象类可以在不提供接口方法实现的情况下实现接口。
5、Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
6、Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
7、接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别
10、什么是值传递和引用传递?
答:对于函数参数中的基本数据类型:传入的是变量的真正值,在函数内部改变参数的值是不会改变传入变量的值;
对于函数参数中的引用数据类型:在java中传入的是变量的地址值副本,实际上在栈内存中就同时有两个引用指向了堆内存中的某个对象。
如:public void add(int a) { int b = a; } 这个可以看作是值传递,a是基本数据类型,他把他的值传给了b public void add(Object obj) { Object objTest = obj; } 这个可以看作是址传递,obj是引用数据类型,是把他栈中指向堆中的对象的地址值赋值给了objTest. 这时候就同时有两个引用指向了堆中的某个Object对象 其实这样看来,java应该只有值传递的。如果是基本数据类型,传递的就是实际的值. 如果是引用数据类型,传递的就是该引用的地址值.
详细讲解:http://guhanjie.iteye.com/blog/1683637
11、进程和线程的区别是什么?
2、一个进程可以有多个线程。线程又叫做轻量级进程。
4、 进程是资源分配的基本单位,线程是调度的基本单位。进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能占有这些资源的。
5、 进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。
6、 进程在执行的过程中,包含比较固定的入口,执行顺序,出口,而线程的这些过程会被应用程序所控制
答:
①继承Thread类(真正意义上的线程类),是Runnable接口的实现。
②实现Runnable接口,并重写里面的run方法。
③使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。
4、还有一种方式是实现Callable接口
调用线程的start():启动此线程;调用相应的run()方法
继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。
实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。
线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)
一般情况下,常见的是第二种。
* Runnable接口有如下好处:
*①避免点继承的局限,一个类可以继承多个接口。
*②适合于资源的共享
13、概括的解释下线程的几种可用状态?答:
当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。
14、同步方法和同步代码块的区别是什么?
答:1、同步锁不同:
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
15、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
答:在 java 虚拟机中, 每个对象( Object 和 class )通过某种逻辑关联监视器,每个监视器和一个对象引用相关联, 为了实现监视器的互斥功能, 每个对象都关联着一把锁 . 一旦方法或者代码块被 synchronized 修饰, 那么这个部分就放入了监视器的监视区域, 确保一次只能有一个线程执行该部分的代码 , 线程在获取锁之前不允许执行该部分的代码 另外 java 还提供了显式监视器( Lock )和隐式监视器( synchronized )两种锁方案
答:
- 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
- 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
- 这四个条件缺一不可,只要破坏了其中一个条件就可以破坏死锁,其中最简单的方法就是线程都是以同样的顺序加锁和释放锁,也就是破坏了第四个条件。
- 17、为什么集合类没有实现Cloneable和Serializable接口?
- 答:克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
- 18、什么是迭代器(Iterator)?
- 答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。
-
注意:iterator()方法是java.lang.Iterable接口,被Collection继承。1.使用next()获得序列中的下一个元素。2. 使用hasNext()检查序列中是否还有元素。3. 使用remove()将迭代器新返回的元素删除。
-
19、Iterator和ListIterator的区别是什么?
-
答:1、Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
2、Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
3、ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
20、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList? -
答:
ArrayList可以算是Array的加强版,(对array有所取舍的加强)。
存储内容比较:
Array数组可以包含基本类型和对象类型,
ArrayList却只能包含对象类型。
但是需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
空间大小比较:
它的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。
ArrayList的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大一倍的新数组,然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。(比较麻烦的地方)。arraylist的大小是自动变化的,如果在初始化的时候没有定义它的默认容量大小,那么默认是10,之后的增长规则是:((旧容量* 3) / 2) + 1
方法上的比较:
ArrayList作为Array的增强版,当然是在方法上比Array更多样化,比如添加全部addAll()、删除全部removeAll()、返回迭代器iterator()等。适用场景:
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组Array里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择ArrayList。而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。 -
21,Comparable和Comparator接口是干什么的?列出它们的区别。
- 答:Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象。
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
-
22,
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
- 23,如何权衡是使用无序的数组还是有序的数组?
-
有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。
-
有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。
- 24,Enumeration接口和Iterator接口的区别有哪些?
-
public interface Enumeration<E> {boolean hasMoreElements();E nextElement();}public interface Iterator<E> {boolean hasNext();E next();void remove();}(1) 函数接口不同Enumeration 只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
Iterator 有3个函数接口。 Iterator除了能读取集合的数据之外,也能数据进行删除操作。(2) Iterator 支持 fail-fast 机制,而 Enumeration 不支持
Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。
-
Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
- 当你的当前线程使用某个集合对象的迭代器访问集合内容的时候,
其他线程在你还没访问完事就已经更改了集合里面的内容。
本来你访问集合内容很迅速就能完事(可能几毫秒的事情),居然还有人(线程)比你(当前线程)还快。
这就叫快速失败。
- 当你的当前线程使用某个集合对象的迭代器访问集合内容的时候,
- 25,javac.exe是编译.java文件
java.exe是执行编译好的.class文件javadoc.exe是生成Java说明文档jdb.exe是Java调试器javaprof.exe是剖析工具26,throw与throws的区别:
- 区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;
throw语法:throw <异常对象>
在方法声明中,添加throws子句表示该方法将抛出异常。
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
其中:异常类可以声明多个,用逗号分割。
- 区别二:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使 用,然后再由处理异常的方法捕获。throws E1,E2,E3 只是告诉程序这个方法可能会抛出这些个异常,方法的调用者可能要处理这些异常。而这些异常E1,E2,E3可能是该函数体产生的。而throw是明确之处这个地方要抛出这个异常。
- 区别三:throw语句用在方法体内,表示抛出异常,由方法体内的语句处理
throws语句用在方法声明后面,表示再抛出异常,由调用这个方法的上一级方法中的语句来处理
- throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常。
throw是具体向外抛异常的动作,所以它是抛出一个异常实例。 - 1)throws出现在方法函数头;而throw出现在函数体;
2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常;
3)两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
-
collection与collections的区别
Collection:
是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。Collection接口时Set接口和List接口的父接口。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
Collections
是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作。最根本的是Collections是一个类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架
Collections.sort(list);//对list集合进行排序
二、collection集合
|--list 特点:有序,能重复
|--arraylist 查询快,增删慢 底层数据是数组数据结构
|--linklist 增删快,查询慢 底层数据是链表数据结构
-
|--
java.util.Vector也实现了List接口,其描述的也是可变长度的对象数组。
Vector类以类似数组的方式顺序地存储数据,但是具有比数组更强大的功能;它是允许不同类型元素共存的变长数组。
|--set 特点:无序,不可重复
|--hashset 底层数据是哈希表 无序
|--treeset 底层数据是二叉树 可以对set集合中的元素进行排序
其中对于arraylist和hashset来说,他们的查询方式不同
arraylist是依据equals来查询
hashset是先依据hashcode进行比较,若相同在进行equals比较来查询
因此在使用时一般都要复写hashcode()方法和equals()方法。
treeset 在使用时,添加数据会自动进行自然排序,若添加的都是new出来的对象,这个时候就无法排序而进行报错,处理办法就是让对象类实现compare接口并复写compareTo方法。
map集合
|--hashtable 不允许有null键null值得情况
|--hashmap 允许有null键null值得情况
|--treemap 可以对键进行排序
map集合特点:该集合存储 键-值 对,且键唯一。
简述Collection 与Map 的区别,并列举3种常用Collection类和Map类?
答案:容器内每个为之所存储的元素个数不同。
Collection 类型,每个位置只有一个元素。
Map 类型,持有 key-value对,像个小型数据库
1、内部类可以随意调用外部类的成员变量,也可以随意调用外部类的成员方法。2、内部类不可以用abstract修饰符定义为抽象类。把内部类声明为abstract,这意味着该类不能够被直接实例化。实际上实例化本类的时候会实例化它的内部类,编译器会报错.
3、权限访问修饰符
public,protected,default,private,这四种级别的修饰符都可以用来修饰类、方法和字段。
包外 子类 包内 类内
public yes yes yes yes
protected no yes yes yes
default no no yes yes
private no no no yes4、请简述final, finally, finalize三者间的区别。
(1)final:可以作为修饰符修饰变量、方法和类,被final修饰的变量只能一次赋值;被final修饰的方法不能够在子类中被重写(override);被final修饰的类不能够被继承。
(2)finally用在异常处理中定义总是执行代码,无论try块中的代码是否引发异常,catch是否匹配成功,finally块中的代码总是被执行,除非JVM被关闭(System.exit(1)),通常用作释放外部资源(不会被垃圾回收器回收的资源)。
(3)finalize()方法是Object类中定义的方法,当垃圾回收器将无用对象从内存中清除时,该对象的finalize()方法被调用。由于该方法是protected方法,子类可以通过重写(override)该方法以整理资源或者执行其他的清理工作。
5、JAVA中的包装类型?
基本类型的包装类:
Integer,Long,Short,Byte,Character,Double,Float,Boolean,BigInteger,
BigDecmail
其中BigInteger,BigDecmail没有相应的基本类型,主要应用于高精度的运算,
BigInteger支持任意精度的整数。BigDecmail
支持任意精度带小数点的运算。
为什么要提供包装类呢?
答:是为了在各种类型间转化,通过各种方法的调用
6.JAVA中break和continue关键字的区别?
break的作用是跳出当前循环块(for、while、do while)或程序块(switch)。在循环块中的作用是跳出当前正在循环的循环体。在程序块中的作用是中断和下一个case条件的比较。
continue用于结束循环体中其后语句的执行,并跳回循环程序块的开头执行下一次循环,而不是立刻循环体。只能用在循环结构中。
7,HashMap和Hashtable的区别。
答案:Hashtable 继承自Dictionary 类,而HashMap是Java1.2引进的Map interface的一个实现;
HashMap 允许将null作为一个entry的key或者value,而Hashtable不允许;
HashMap 把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable 和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
- 8,volatile能保证变量安全,不能保证线程安全;它用在多线程同步中,可保证读取的可见性;JVM保证从主内存加载到线程工作内存的值是最新的;它能禁止进行指令重排序。
1、
形式参数可被字段修饰符修饰
形式参数不可以是对象
形式参数为方法被调用时真正被传递的参数
形式参数可被视为local variable(局部变量)
1.访问控制修饰符
分别有:public private protected,缺省
2.其它修饰符
分别有:abstract,final,static,native,synchronized,transient,volatile等
对于形式参数只能用final修饰符,其它任何修饰符都会引起编译器错误 。但是用这个修饰符也有一定的限制,就是在方法中不能对参数做任何修改。
不过一般情况下,一个方法的形参不用final修饰。只有在特殊情况下,那就是:方法内部类。
一个方法内的内部类如果使用了这个方法的参数或者局部变量的话,这个参数或局部变量应该是final。
通过以上分析,你应该知道答案了吧。
因为字段修饰符包括很多(上面写的),但是方法修饰符只能用final这一个修饰符。
所以说这句话不对。
2、Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()
A ".*?(?=\\()"
C ".*(?=\\()"
D ".*(?=\()"
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
2.编程中如何区分两种模式
默认是贪婪模式;
非贪婪模式:在量词后面直接加上一个问号?。其实,正则表达式里面通用方法是,在表示重复字符元字符,后面加多一个”?”字符即可。
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
+表示匹配1-无穷
String text = "北京市(海淀区)(朝阳区)(西城区)";
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
3、阅读如下代码。 请问,对语句行 test.hello(). 描述正确的有()
package
NowCoder;
class
Test {
public
static
void
hello() {
System.out.println(
"hello"
);
}
}
public
class
MyApplication {
public
static
void
main(String[] args) {
// TODO Auto-generated method stub
Test test=
null
;
test.hello();
}
}
A,能编译通过,并正确运行
B,因为使用了未初始化的变量,所以不能编译通过
C,能编译通过,但因变量为null,不能正常运行
另外,在其他类的静态方法中也是可以调用公开的静态方法,此题hello方法是使用public修饰的所以在MyApplication中调用hello也是可以的。
<div style=”position:fixed;top:0;”></div><div style=”position:absolute;top:0;”></div>
<div style=”position:relative;top:0;”></div>
<div style=”margin-top:0;”></div>
5、以下js表达式返回false的是()?“”==false
false==nullnull==undefined
答:undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true;undefined值是派生自null值的,因此规定对它们的相等性测试要返回true;但null === undefined会返回false,因为它们是不同类型的值。
6、以下表达式中,正确的是()
byte i=128
boolean i=null
long i=0xfffL
double i=0.9239d
A byte ,1字节,值域-128至127; B boolean并非包装对象Boolean,不能赋值为null
- 2.1^3.1>3.1^2.1
- 2.1^3.1<3.1^2.1
- 2.1^4.1>4.1^2.1
- 2.1^4.1<4.1^2.1
答:比较a^b 与b^a的大小,可变为比较ln(a^b) = blna 与ln(b^a)=alnb的大小,则blna/alnb =
(lna/a)/(lnb/b)
设有f(x) = lnx/x f'(x) = (1-lnx)/x^2 令f'(x)=0,求出x=e
则,当xe时,递减。对称轴为x=e
故有,a=2.1 b=3.1时,a距离对称轴>b距离对称轴 f(a)a^b
==> 3.1^2.1 >2.1^3.1
当a=2.1 b=4.1时,a距离对称轴f(b) 则a^b >b^a
==>2.1^4.1 > 4.1^2.1
根据大于1小于1来判断
#include<stdio.h>
#include <unistd.h>
int main( ) {
fork( );
fork( );
fork( );
printf (“hello\n”);
return 0;
}
|
-
3
-
4
-
6
-
8
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
-
6
-
7
-
8
-
9
垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收
垃圾收集允许程序开发者明确指定释放 哪一个对象
垃圾回收机制保证了JAVA程序不会出现 内存溢出
进入”Dead”状态的线程将被垃圾回收器回收
以上都不对答:
B:垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
C:垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
D:进入DEAD的线程,它还可以恢复,GC不会回收
父类B静态代码块->父类B构造函数->子类A静态代码块->父类B非静态代码块->子类A构造函数->子类A非静态代码块父类B静态代码块->父类B构造函数->父类B非静态代码块->子类A静态代码块->子类A构造函数->子类A非静态代码块
父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
-
父类B构造函数->父类B静态代码块->父类B非静态代码块->子类A静态代码块->子类A构造函数->子类A非静态代码块
因为构造函数可能要给动态代码块的一些成员变量赋值,所以必须在这之前先执行动态代码块,要不然构造函数会出现相关的成员属性无定义。所以会先执行动态代码块,在执行构造函数。一般先按父类的执行,再按子类的执行。
16, 有如下4条语句:
Integer i01 = 59;
int i02 = 59;
Integer i03 = Integer.valueOf(59);
Integer i04 = new Integer(59);
以下输出结果为false的是?
-
System.out.println(i01==i02);
-
System.out.println(i01==i03);
-
System.out.println(i03==i04);
-
System.out.println(i02==i04);
①无论如何,Integer与new Integer不会相等。不会经历拆箱过程, ②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。 java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存 。 从jdk1.5开始,有“自动装箱”这么一个机制,在byte(-128到127)范围内(整型的八位二进制的表示的范围为-128到127),如果存在了一个值,再创建相同值的时候就不会重新创建,而是引用原来那个,但是超过byte范围还是会新建对象;③两个都是new出来的,都为false ④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
17. 下列Java代码中的变量a、b、c分别在内存的____存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
堆区、堆区、堆区
堆区、栈区、堆区
堆区、栈区、栈区
堆区、堆区、栈区
静态区、栈区、堆区
静态区、栈区、栈区
答:常量区:未经 new的常量
堆区:成员变量的引用,new出来的变量,接口
栈区:局部变量的引用
classA{ privateString a = “aa”; // a 为成员变量的引用,在堆区,“aa”为未经 new 的常量,在常量区 publicboolean methodB() { String b = “bb”; // b 为局部变量的引用,在栈区,“bb”为未经 new 的常量,在常量区 final String c = “cc”; // c 为局部变量的引用,在栈区,“cc”为未经 new 的常量,在常量区 } }
B C D 都是Object类中的方法
notify(): 是唤醒一个正在等待该对象的线程。
notifyAll(): 唤醒所有正在等待该对象的线程。
E sleep 是Thread类中的方法
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态。
四、填空题
2、哪些jvm的垃圾回收方式采用的是复制算法回收?1、对于满足SQL92标准的SQL语句:select foo,count(foo)from pokes where foo>10group by foo having count (*)>5 order by foo
其执行顺序应该是?
FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY