Java运行环境(Java Runtime Enviroment) 是运行Java程序的基本的Java虚拟机,包括执行applet的浏览器插件。JDK (Java Development Kit) 是为了开发,编译和执行Java应用程序,针对Java的全功能的软件开发包,包含了JRE,编译器和工具(好比说 JavaDoc 和Java Debugger)。html
由类加载器、内存空间、执行引擎,垃圾收集、本地方法接口组成。java
类加载器找到类文件,并验证解析类文件,最后加载到内存空间各个区域中spring
内存空间包括堆、栈、方法区等,用来存储对象引用、对象数据,类方法等。windows
垃圾收集回收内存中的过时数据,释放内存空间。浏览器
本地方法接口提供了jvm调用本地其余非java类库的功能。oracle
类的生命周期包括加载、验证、准备、解析、初始化、使用、清理七个阶段。app
类加载器分为启动类加载器,扩展类加载器、应用程序类加载器、线程上下文类加载器。jvm
双亲委派机制,java的三种类加载器存在父子关系,子 加载器保存着附加在其的引用,当一个类加载器须要加载一个目标类时,会先委托父加载器去加载,而后父加载器会在本身的加载路径中搜索目标类,父加载器在本身的加载范围中找不到时,才会交给子加载器加载目标类。ide
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,便是否是指相同一个对象。比较的是真正意义上的指针操做。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"。
不必定。同时反过来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中,要想跳出多重循环,能够在外面的循环语句前定义一个标号,而后在里层循环体的代码中使用带有标号的的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; } }
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);其中有隐含的强制类型转换。
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可做用于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; }
Java中方法的 overload 发生的条件是,同一个类里,有两个或以上的方法名称彻底相同,但参数列表不一样。另外一方面,方法的 override 是指,子类重定义了父类里的同一个方法。Override 的方法必须方法名、参数列表和返回类型都彻底相同。Override 的方法不会限制原方法的访问权限。
Java 中的 static 变量归相应的类全部,它的值对于类的全部实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。若是代码试图访问非静态的变量,并且不是经过类的实例去访问,编译器会报错,由于这些非静态变量尚未被建立呢,而且它们没有与实例相关联。
Java同时提供和支持抽象类和接口,它们的实现有一些共同的特色,也有以下不一样: