先来讲说什么是JDK,JRE。java
JDK:Java Development Kit Java开发工具包【开发Java程序用】linux
JRE:Java Runtiome Environment Java运行环境【运行Java程序用】数组
【注:下载的JDK包是包含了JDK和JRE的,JDK和JRE是逻辑上的区分,二者在JDK下载的包中都有】安全
JDK与JRE的关系:以Java代码运行为例,编写好Java代码以后,经过javac将java源文件编译成class字节码文件,而后经过java命令,运行字节码文件。那么运行字节码的环境就是JRE。(JRE的核心就是JVM)服务器
了解完JDK和JRE是什么以后,再聊聊为何开发者当时要把一个安装包分红两部分呢?多线程
日常使用的软件都是一键安装的,但JDK须要安装两次。JDK的发明者不会这么无聊,故意给开发者增长麻烦。jvm
【我想】:这应该跟生产环境的部署问题有关,关于生产环境部署JDK仍是JRE一直饱受争议,具体状况根据项目而定。工具
出于对性能的考虑,尽量的使服务器轻,能少装一个软件就少装一个,这样生产环境部署JRE就OK了。【又省了资源】性能
除了这个方面以外,还有一种可能。JDK的开发也有多是分团队的,JDK和JRE多是交由不一样团队开发,JDK和JRE的耦合也可能所以而减少,从而加快JDK的迭代版本。(毕竟如今JDK一年更新两次)开发工具
跨平台和Java 虚拟机有关。
JVM有两个主要的功能:
(Oracle官网上下载JDK,不一样操做系统的JDK是不同的,对应不一样的虚拟机)
这个就跟JVM有关了,先来了解一下什么是JVM:
JVM:Java Virtual Machine Java虚拟机
JVM的主要做用就是将class字节码文件翻译成机器码(01)供给计算机执行。
跨平台——Java程序能够在多种平台上运行。
平台指的是操做系统,目前主流的操做系统:Windows,Mac,Linux。
以平常软件为例,同一个软件的win版和mac版是分开的。可是功能倒是基本相同的。
JVM一样如此,也有win版,mac版以及linux版。安装在不一样的平台上的JVM虽然有所差别,但都能完成一样一件使命——将class文件翻译成机器码。
归纳来讲,JVM有两个功能:其一是,其二是翻译class字节码文件。
在解决这个问题以前,先解决环境变量是干吗的:
运行一个程序(命令),系统从当前目录寻找,或者从环境变量中寻找。
换句话说,若是在java,javac的目录下执行这个两个命令,是没有问题的。可是若是更换了目录,系统在当前目录找不到,就会去环境变量中寻找。因此设置环境变量的根本目的是在电脑的任何一个文件夹下均可以编译运行Java程序。
Integer 是引用类型,默认值是null。而int是是值类型默认值是0
可变性
String是不可变的,StringBuffer和StringBuilder是可变的
安全性
StringBuffer和String是线程安全的,,StringBuilder是线程不安全的
【解释】
聚焦:可变性,安全性
String 底层使用final修饰的数组实现
线程安全问题
String 中的对象是不可变的,也就能够理解为常量,线程安全。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,因此是线程安全的。
StringBuilder 并无对方法进行加同步锁,因此是非线程安全的。
对于三者使用的总结:
没有。
由于String被设计成不可变(immutable)类(final修饰),因此它的全部对象都是不可变对象。
在这段代码中,s原先指向一个String对象,内容是 "Hello",而后对s进行了+操做
这时,s不指向原来那个对象了,而指向了另外一个 String对象,内容为"Hello world!"
原来那个对象还存在于内存之中,只是s这个引用变量再也不指向它了。
前者会被JVM分配到常量池中,常量池中没有重复的元素。
String str1 =“i”; String str2 =“i”;
str2不会从新建立一个常量,而是指向str1。
String str1 = new String("i"); String str2 = new String("i");
str1会在堆内存中建立对象
str2仍是会再次建立一个新的对象
使用StringBuilder或者StringBuffer的reverse()方法。
StringBuffer str1 = new StringBuffer("12345"); StringBuffer str2 = str1.reverse(); System.out.println(str2);
==:
equals:
一般会被重写,比较引用类型的内容是否相同
int x = 7; int y = 7; //比较基本数据类型的值 System.out.println(x==y); String str1 = new String("123"); String str2 = new String("123"); //比较引用类型的内存地址 System.out.println(str1==str2); //比较引用类型的内容是否相同 System.out.println(str1.equals(str2));
&和&&表示逻辑与,两边同时为true时才为true。
&&具备短路功能,&&左边为false时,右边表达式不会执行。
Math类中提供了三个与取整有关的方法:
ceil(向上取整)、floor(向下取整)、round(+0.5后四舍五入)
Math.ceil(11.3)的结果为12
Math.ceil(-11.3)的结果是-11
Math.floor(11.6)的结果为11
Math.ceil(-11.6)的结果是-12
Math.round(11.5)的结果为12
Math.round(-11.5)的结果为-11。