目录:java
1、JDK 和 JRE 的区别?git
2、final 与 static 的区别?面试
3、get和post的区别?数组
4、堆和栈的概念和区别 浏览器
5、浅谈Java反射机制缓存
1、JDK 和 JRE 的区别?安全
JDK:java development kit (java开发工具)服务器
JRE:java runtime environment (java运行时环境)框架
JVM:java virtuak machine (java虚拟机)jvm
一、jdk--开发环境(核心)
Java development kit的缩写,意思是Java开发工具,咱们写文档作PPT须要office 办公软件,开发固然须要开发工具了,说到开发工具你们确定会想到Eclipse,可是若是直接安装Eclipse你会发现它是运行不起来 是会报错的,只有安装了JDK,配置好了环境变量和path才能够运行成功。这点相信不少人都深有体会。
jdk主要包含三个部分:
第一部分是Java运行时环境,JVM
第二部分是Java的基础类库,这个类库的数量仍是至关可观的
第三部分是Java的开发工具,它们都是辅助你更好地使用Java的利器
详寻《玩好JDK,面试不用愁》
二、jre--运行环境
① jdk中的jre
以下图:jdk中包含的jre,在jre的bin目录里有个jvm.dll,既然JRE是运行时环境,那么运行在哪?确定是JVM虚拟机上了。另,jre的lib目录中放的是一些JAVA类库的class文件,已经打包成jar文件。
② 第二个JRE(独立出来的运行时环境)
以下图,不论是JDK中的JRE仍是JRE既然是运行时环境必须有JVM。因此JVM也是有两个的。
三、JVM——转换环境
java virtuak machine (java虚拟机)的缩写。
你们一提到JAVA的优势就会想到:一次编译,随处运行,说白了就是跨平台性好,这点JVM功不可没。
Java的程序也就是咱们编译的代码都会编译为class文件,class文件就是在jvm上运行的文件,只有JVM还不能彻底支持class的执行,由于在解释class的时候JVM须要调用解释所须要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操做系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就能够在多种平台上不加修改的运行。
JVM也是一门很深的学问,感兴趣的同窗能够深刻研究,只有好处,没有坏处。
其实有时候面试官问JDK和JRE的区别的目的不是想让你解释什么名词的,而是想看看你的基础和研究Java的深浅,还有另外一方面就是你是否是常常喜欢问为何。
2、final 与 static 的区别?
均可以修饰类、方法、成员变量
static能够修饰类的代码块,final不能够
static不能够修饰方法内局部变量,final能够
static修饰表示静态或全局
static修饰的代码块表示静态代码块,当JVM加载类时,只会被建立一次
static修饰的变量能够从新赋值
static方法中不能用this和super关键字
由于this表明的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后, 对象还不必定存在。 this表明对本类对象的引用,指向本类已建立的对象。 super表明对父类对象的引用,指向父类对象。 静态优先于对象存在,方法被static修饰以后,方法先存在,所需的父类引用对象晚于该方法的出 现,也就是super所指向的对象还没出现,固然就会报错。
static方法必须被实现,而不能是抽象的abstract
static方法只能被static方法覆盖
final修饰表示常量、一旦建立不可被修改
final标记的成员变量必须在声明的同时赋值,或在该类的构造方法中赋值,不可从新赋值
final方法不能被子类重写
final类不能被继承,没有子类,final类中的方法默认是final的
final不能用于修饰构造方法
private类型的方法默认是final类型的
3、get和post的区别?
get和post是表单提交的两种方式,get请求数据经过域名后缀URL传送,用户可见,不安全,post请求数据经过在请求报文正文里传输,相对比较安全。get是经过URL传递表单值,post经过URL看不到表单域的值。
get传递的数据量是有限的,若是要传递大数据量不能用get,不如type=“file”上传文章、type=“password”传递密码,get和post是表单提交数据的两种方式,get请求数据经过地域名后缀URL传送,用户可见,不安全,post请求数据经过将在请求报文正文里传输,相对比较安全。
get是经过url传递表单值,post经过url看不到表单域的值;
get传递的数据量是有限的,若是要传递大数据量不能用get,好比type=“file”上传文章、type=“password”传递密码或者< text area >发表大段文章,post则没有这个限制;
post会有浏览器提示从新提交表单的问题,get则没有(加分的回答)
对于Post的表单从新敲地址栏再刷新就不会提示从新提交了,由于从新敲地址就没有偷偷提交的数据了。Post方式的正确的地址很难直接发给别人。
get和post的区别
1.get提交的数据放在URL以后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. post方法是把提交的数据放在HTTP包的body中。
2.get提交的数据大小有限制(由于浏览器对URL的长度有限制),而post方法提交的数据没有限制。
3.get方式须要使用request.querystring来取得变量的值,而post方式经过request.form来获取变量的值。
4.get方式提交数据会带来安全问题,好比一个登录页面,经过get提交数据时,用户名和密码将出如今URL中,若是页面能够被缓存或者其余人能够访问这台机器 ,就能够从历史记录得到该用户的帐户和密码。
get是从服务器获取数据,post向服务器传送数据。
get是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段一一对应,在URL中能够看到。post是经过HTTP post机制,将表单内各个字段与其内容放置在HTML.header内一块儿传送到action属性所指的URL地址。用户看不到这个过程。
对于get方式,服务器端用request.querystring获取变量的值,对于post方式,服务器端用request.form获取提交的数据
get传送的数据量较小,不能大于2KB.POST传送的数据量较大,通常被默认为不受限制。但理论上,限制取决于服务器的处理能力。
get安全性较低。post安全性较高。
4、堆和栈的概念和区别
在说堆和栈以前,先说一下JVM(虚拟机)内存的划分:
Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在本身的内存区域中进行更细致的划分,由于虚拟机中每一片内存处理的方法都不一样,因此要单独进行管理。
JVM内存的划分有五片:
1.寄存器
2.本地方法区
3.方法区
4.栈内存
5.堆内存
咱们来重点说一下堆和栈:
栈内存:栈内存首先时一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量,for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,因此方法先进栈,而后再定义变量,变量有本身的做用于,一旦离开做用域,变量就会被释放。栈内存的更新速度很快,由于局部变量的声明周期都很短。
堆内存:存储的是数组和对象(其实数组就是对象),凡是new创建的都是在堆中,堆中存放的都是实体(对象),实体用于封存数据,并且是封存多个(实体的多个属性),若是一个数据消失,这个实体也没有消失,还能够用,因此堆是不会随时释放的,可是栈不同,栈里存放的都是单个变量,变量被释放了,也就没有了。堆里的实体虽然不会被释放,可是会被当作垃圾,Java有垃圾回收机制不定时的收取。
下面咱们经过一个图例详细讲一下堆和栈:
好比主函数里的语句
int[] arr = new int[3];
在内存中是怎么被定义的:
主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,可是右边不是一个具体值,是一个实体。实体建立在堆里,在堆里首先经过new关键字开辟一个空间,内存在存储数据的时候都是经过地址来实现的,地址是一块连续的二进制,而后给这个实体分配一个内存地址。数组都有一个索引,数组这个实体在堆内存中产生以后每个空间都会默认的初始化(这是堆内存的特色,未初始化的数据是不能用的,可是在堆里是能够用的,由于初始化过了,可是栈里没有),不一样的类型初始化的值不同,因此堆和栈里就建立了变量和实体:
那么堆和栈怎么联系起来的呢?
咱们刚刚说郭给堆分配一个地址,把堆的地址赋给arr,arr就经过地址只想了数组。因此arr想操做数组时,就经过地址,而不是直接把四蹄都赋给它。这种咱们再也不叫它基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体
若是当int[] arr = null;
arr不作任何指向,null的做用就是取消引用数据类型的指向。
当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被看成一个垃圾,在不定时的时间内自动回收,由于Java有一个自动回收机制。自动回收机制自动监测堆里是否有垃圾,若是有,就会自动的作垃圾回收的动做,可是何时回收不必定。
因此堆和栈的区别很明显:
1.栈内存存储的是局部变量而堆内存存储的是实体;
2.栈内存的更新速度要快于堆内存,由于局部变量的声明周期很短;
3.栈内存存放的变量声明周期一旦结束就会被释放,而堆内存存放的实体会被垃圾啊回收机制不定时的回收。
5、浅谈Java反射机制
一、反射的定义是什么?
Java反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法,这种动态获取、调用对象方法的功能成为Java语言的反射机制。
二、反射存在的必要性?
反射机制是不少Java框架的基石。
① 在xml文件或properties里面写好了配置,而后再Java类里面解析xml或properties里面的内容,获得一个字符串,而后用反射机制,根据这个字符串得到某个类的Class实例,这样就能够动态配置一些东西,不用每一次都要在代码里去new或者作其它事情,之后要改的话直接改配置文件,代码维护起来就很方便了。
② 有时候要适应某些需求,Java类里面不必定能直接调用另外的方法,这时候也能够经过反射机制来实现。
三、反射的缺点?
反射的代码比正常调用的代码更多,性能更慢,应避免使用反射。