java题型解答

一、JDK 和 JRE 有什么区别?

Java运行环境(Java Runtime Enviroment) 是运行Java程序的基本的Java虚拟机,包括执行applet的浏览器插件。JDK (Java Development Kit) 是为了开发,编译和执行Java应用程序,针对Java的全功能的软件开发包,包含了JRE,编译器和工具(好比说 JavaDocJava Debugger)。html

二、jvm由哪些部分组成,分别起什么做用

由类加载器、内存空间、执行引擎,垃圾收集、本地方法接口组成。java

类加载器找到类文件,并验证解析类文件,最后加载到内存空间各个区域中spring

内存空间包括堆、栈、方法区等,用来存储对象引用、对象数据,类方法等。windows

垃圾收集回收内存中的过时数据,释放内存空间。浏览器

本地方法接口提供了jvm调用本地其余非java类库的功能。oracle

三、java类生命周期分为哪些部分

类的生命周期包括加载、验证、准备、解析、初始化、使用、清理七个阶段。app

四、java的类加载器有几种,分别是什么,描述一下类加载的双亲委派机制?

类加载器分为启动类加载器,扩展类加载器、应用程序类加载器、线程上下文类加载器。jvm

双亲委派机制,java的三种类加载器存在父子关系,子 加载器保存着附加在其的引用,当一个类加载器须要加载一个目标类时,会先委托父加载器去加载,而后父加载器会在本身的加载路径中搜索目标类,父加载器在本身的加载范围中找不到时,才会交给子加载器加载目标类。ide

五、== 和 equals 的区别是什么?

  1. ==是判断两个变量或实例是否是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是否是相同
  2. ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
  3. ==指引用是否相同, equals()指的是值是否相同。

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,便是否是指相同一个对象。比较的是真正意义上的指针操做。equals用来比较的是两个对象的内容是否相等,因为全部的类都是继承自java.lang.Object类的,因此适用于全部对象,若是没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的倒是==的判断。工具

​ String s="abcd"是一种很是特殊的形式,和new 有本质的区别。它是java中惟一不须要new 就能够产生对象的途径。以String s="abcd";形式赋值在java中叫直接量,它是在常量池中而不是象new同样放在压缩堆中。 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,若是有,就会把它赋给当前引用.即原来那个引用和如今这个引用指点向了同一对象, 若是没有,则在常量池中新建立一个"abcd",下一次若是有String s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
   而String s = new String("abcd");和其它任何对象同样.每调用一次就产生一个对象,只要它们调用。
​ 也能够这么理解: String str = "hello"; 先在内存中找是否是有"hello"这个对象,若是有,就让str指向那个"hello".

若是内存里没有"hello",就建立一个新的对象保存"hello". String str=new String ("hello") 就是无论内存里是否是已经有"hello"这个对象,都新建一个对象保存"hello"。

六、两个对象的 hashCode()相同,则 equals()也必定为 true,对吗?

不必定。同时反过来equals为true,hashCode也不必定相同。

类的hashCode方法和equals方法均可以重写,返回的值彻底在于本身定义。

关于hashCode和equal是方法是有一些 常规协定 :

一、两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。

二、两个对象用equals()比较返回false,不要求hashCode()方法也必定返回不一样的值,可是最好返回不一样值,亿提搞哈希表性能。

三、重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。

七、说说&和&&的区别。

&和&&均可以用做逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,不然,只要有一方为false,则结果为false。
&&还具备短路的功能,即若是第一个表达式为false,则再也不计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,因此不会出现NullPointerException若是将&&改成&,则会抛出NullPointerException异常。If(x33 & ++y>0) y会增加,If(x33 && ++y>0)不会增加

&还能够用做位运算符,当&操做符两边的表达式不是boolean类型时,&表示按位与操做,咱们一般使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

八、在JAVA中如何跳出当前的多重嵌套循环?

在java中,要想跳出多重循环,能够在外面的循环语句前定义一个标号,而后在里层循环体的代码中使用带有标号的的break语句,便可跳出

外层循环。例如:

ok:
for(int i=0;i<10;i++) {
    for(int j=0;j<10;j++) {
    	system.out.println("i="+i+",j="+j);
    	if(j==5) break ok;
	}
}

九、float f=3.4;是否正确?short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会形成精度损失,所以须要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。

对于short s1 = 1; s1 = s1 + 1;因为1是int类型,所以s1+1运算结果也是int 型,须要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;能够正确编译,由于s1+= 1;至关于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。

十、Math.round(11.5)等於多少?Math.round(-11.5)等於多少?

round()方法能够这样理解:

将括号内的数+0.5以后,向下取值,

好比:round(3.4)就是3.4+0.5=3.9,向下取值是3,因此round(3.4)=3;

round(-10.5)就是-10.5+0.5=-10,向下取值就是-10,因此round(-10.5)=-10

十一、switch语句可否做用在byte上,可否做用在long上,可否做用在String上?

switch可做用于char byte short int

  • switch可做用于char byte short int对应的包装类

  • switch不可做用于long double float boolean,包括他们的包装类 Long/Double

  • switch中能够是字符串类型,String(jdk1.7以后才能够做用在string上)

  • switch中能够是枚举类型

String strSeason = "Summer";
		switch (strSeason.toLowerCase()) {
		case "spring":
			season = 1;
			break;
		case "summer":
			season = 2;
			break;
		case "fall":
			season = 3;
			break;
		case "winter":
			season = 4;
			break;
		default:
			season = -1;// 没找到对应的季节
			break;
		}

十二、Overload和Override的区别?Overloaded的方法是否能够改变返回值的类型?

Java中方法的 overload 发生的条件是,同一个类里,有两个或以上的方法名称彻底相同,但参数列表不一样。另外一方面,方法的 override 是指,子类重定义了父类里的同一个方法。Override 的方法必须方法名、参数列表和返回类型都彻底相同。Override 的方法不会限制原方法的访问权限。

1三、是否能够从一个static方法内部发出对非static方法的调用?

Java 中的 static 变量归相应的类全部,它的值对于类的全部实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。若是代码试图访问非静态的变量,并且不是经过类的实例去访问,编译器会报错,由于这些非静态变量尚未被建立呢,而且它们没有与实例相关联。

1四、接口类和抽象类有哪些区别?抽象类必需要有抽象方法吗?

Java同时提供和支持抽象类和接口,它们的实现有一些共同的特色,也有以下不一样:

  • 接口中全部的方法默认都是抽象的, 在Java8中容许接口中有静态默认的方法。 而抽象类能够同时包含抽象和非抽象的方法。
  • 一个类能够实现多个接口,但它只能继承一个抽象类。
  • 一个类要实现某个接口,必须实现这个接口声明的全部方法。而一个类不须要实现抽象父类中声明的全部方法,不过,这时候这个类也必须声明为抽象类。
  • 抽象类能够实现接口,并且不须要实现接口中的方法。
  • 接口中声明的变量默认是final的,而抽象类能够包含非final的变量。
  • 接口中的成员默认是public的,而抽象类的成员能够是private,protected,或public的。
  • 接口是绝对抽象的,不可实例化,抽象类也不能够实例化,但能够在main方法中触发实例化(注:经过匿名类实现)。
相关文章
相关标签/搜索