JAVA 基础知识

什么是 Java 虚拟机?为什么 Java 被称作是 “ 平台无关的编程语言 ” ?

     Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。 Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。

Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。

Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。

Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

简述JAVA类加载机制?

     虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的 java 类型。

Java中常用的类,包,接口,请各举5个

常用类:java.lang.Object、java.lang.String、java.lang.StringBuffer、java.lang.Math、java.lang.System,java.util.Vector,java.util.Date,java.text.DecimalFormate

常用包:java.lang,java.io,java.util,java.util.zip,java.net (java.lang.reflect,java.awt.image,java.wat.peer ,java.aplet , java.corba,java.corba.orb,java..awt.datatransfer,java.awt,java.awt.event,java.sql)

常用接口:Comparable ,Collection,set,Map,List,Runnable

请说一下final,finally和finalize的区别?

     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等

数组有没有length()方法,String有没有length属性?

数组有length属性,String有length方法

String s = new String("xyz"),创建了几个对象。

创建了两个对象,一个是静态区的。

”static”关键字是什么意思?Java中是否可以覆盖一个private或者是static的方法?

如果一个类的变量或者方法前面有static修饰,那么表明这个方法或者变量属于这个类,也就是说可以在不创建对象的情况下直接使用
    当父类的方法被private修饰时,表明该方法为父类私有,对其他任何类都是不可见的,因此如果子类定了一个与父类一样的方法,这对于子类来说相当于是一个新的私有方法,且如果要进行向上转型,然后去调用该“覆盖方法”,会产生编译错误

class Parent { private fun() { ... } } class Child extends Parent { private fun() { ... } } class Test { public static void main(String[] args) { Parent c = new Child(); c.fun(); //编译出错 } }

static方法时编译时静态绑定的,属于类,而覆盖是运行时动态绑定的(动态绑定的多态),因此不能覆盖.

Java支持的基本数据类型有哪些?

java支持的基本数据类型有以下9种:byte,shot,int,long,float,double,char,boolean,void.

自动拆装箱是java从jdk1.5引用,目的是将原始类型自动的装换为相对应的对象,也可以逆向进行,即拆箱。这也体现java中一切皆对象的宗旨。
   所谓自动装箱就是将原始类型自动的转换为对应的对象,而拆箱就是将对象类型转换为基本类型。java中的自动拆装箱通常发生在变量赋值的过程中,如:

Integer object = 3; //自动装箱 int o = object; //拆箱

在java中,应该注意自动拆装箱,因为有时可能因为java自动装箱机制,而导致创建了许多对象,对于内存小的平台会造成压力。

Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?

Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回与参数 最接近的长整数,参数加 1/2 后求其 floor.

String, StringBuffer StringBuilder的区别。

String 的长度是不可变的;

StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要 >String,那么使用 StringBuffer 的 toString() 方法;线程安全;

StringBuilder 是从 JDK 5 开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder 类,因>为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 
使用字符串的时候要特别小心,如果对一个字符串要经常改变的话,就一定不要用String,否则会创建许多无用的对象出来. 
来看一下比较

String s = "hello"+"world"+"i love you";

StringBuffer Sb = new StringBuilder("hello").append("world").append("i love you");

这个时候s有多个字符串进行拼接,按理来说会有多个对象产生,但是jvm会对此进行一个优化,也就是说只创建了一个对象,此时它的执行速度要比StringBuffer拼接快.再看下面这个:

String s2 = "hello";

String s3 = "world";

String s4 = "i love you";

String s1 = s2 + s3 + s4

上面这种情况,就会多创建出来三个对象,造成了内存空间的浪费

equals()和hashCode()区别?

  1. equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashCode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)

  2. 反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode() 也就相等了;

 

什么时候该使用什么样的集合
       Collection
       我们需要保存若干个对象的时候使用集合。
       List
       如果我们需要保留存储顺序, 并且保留重复元素, 使用List.
       如果查询较多, 那么使用ArrayList
       如果存取较多, 那么使用LinkedList
       如果需要线程安全, 那么使用Vector
      Set
      如果我们不需要保留存储顺序, 并且需要去掉重复元素, 使用Set.
      如果我们需要将元素排序, 那么使用TreeSet
      如果我们不需要排序, 使用HashSet, HashSet比
      TreeSet效率高.
      如果我们需要保留存储顺序, 又要过滤重复元素, 那么使用LinkedHashSet

Array 和 ArrayList 有何区别?什么时候更适合用 Array ?

1.    Array 可以容纳基本类型和对象,而 ArrayList 只能容纳对象。

2.    Array 是指定大小的,而 ArrayList 大小是固定的

ArrayList 和LinkedList 的优缺点 

ArrayList是基于数组实现的,而LinkedList是基于链表实现的;如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组,也就是ArrayList;如果应用需要经常插入和删除元素你就需要用链表数据结构了,也就是LinkedList。

HashMap的工作原理

一,存储方式: Java中的HashMap是以键值对(key-value)的形式存储元素的。
二,调用原理: HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
三,其他热性: HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

HashMap和HashTable的区别

HashMap是非线程同步的,HashTable是线程同步的。

HashMap允许null作为键或者值,HashTable不允许
        HashTable中有个一个contains方法,HashMap去掉了此方法效率上来讲,HashMap因为是非线程安全的,因此效率比HashTable高

set接口特点如下:

  1. 不允许出现重复元素;
  2. 集合中的元素位置无顺序;
  3. 有且只有一个值为null的元素。因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为:
  4. 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
  5. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。
  6. 空集的性质:空集是一切集合的子集。

override重写,overloadding重载

重写是子类重新定义了父类的方法,重写必有相同的方法名,参数列表和返回值类型。

重载是发生在同一个类里面的两个或多个方法名相同,但参数不同的情况

Iterator,ListIterator

Iterator可以遍历set和list集合,但是ListInterator只能用来遍历List

Itertator只能向前遍历,ListIterator既可以向前也可以向后,

ListIterator实现了Iterator接口。

线程相关:

关键字synchronized 、static、abstract、final

  • synchronized:用于方法或代码块前,使此方法或者代码块编程同步的。
  • static:用于声明静态变量,static关键字可以修饰变量,方法,静态代码块。

静态变量:由static修饰的变量称为静态变量

静态变量属于类,而不属于某个对象

静态变量它的副本只有一个(静态变量在类中只加载一)

静态方法:  在静态方法中只能调用静态变量和静态方法

在非静态方法中,可以调用静态方法或者变量。

在静态方法中不能使用this和super关键字。

静态代码块

作用:用来给静态成员变量初始化

  • abstract:用于定义抽象类或者方法
  • final:用于声明常量,即只能赋一次值
  • volatile:用来确保将变量的跟新操作通知到其他线程,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 synchronized关键字更轻量级的同步机制。
  • serialize:Java 对象序列化为二进制文件

JAVA中如何实现序列化以及实现序列化的意义

实现Serializable接口

意义:可以将硫化后的对象进行读写操作,也可用于网络之间对象传输,序列化是为了解决对象流读写坐     坐时引发的问题

ArrayList 和 HashMap 的默认大小是多数?

List 元素是有序的、可重复
ArrayList、Vector默认初始容量为10
Vector:线程安全,但速度慢
    底层数据结构是数组结构
    加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
    扩容增量:原容量的 1倍
      如 Vector的容量为10,一次扩容后是容量为20
ArrayList:线程不安全,查询速度快
    底层数据结构是数组结构
    扩容增量:原容量的 0.5倍+1
      如 ArrayList的容量为10,一次扩容后是容量为16
 
Set(集) 元素无序的、不可重复。
HashSet:线程不安全,存取速度快
     底层实现是一个HashMap(保存数据),实现Set接口
     默认初始容量为16(为何是16,见下方对HashMap的描述)
     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
     扩容增量:原容量的 1 倍
      如 HashSet的容量为16,一次扩容后是容量为32
 
Map是一个双列集合
HashMap:默认初始容量为16
     (为何是16:16是2^4,可以提高查询效率,另外,32=16<<1       -->至于详细的原因可另行分析,或分析源代码)
     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
     扩容增量:原容量的 1 倍

     如 HashSet的容量为16,一次扩容后是容量为32

SpringMVC的生命周期  (执行流程)

第一步:用户发起请求到前端控制器(DispatcherServlet)
       第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
       第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
       第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
       第五步:处理器适配器去执行Handler
       第六步:Handler执行完给处理器适配器返回ModelAndView
       第七步:处理器适配器向前端控制器返回ModelAndView(ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
       第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析根据逻辑视图名解析成真正的视图(jsp)
       第九步:视图解析器像前端控制器返回View
       第十步:前端控制器对视图进行渲染视图渲染将模型数据(在ModelAndView对象中)填充到request域

第十一步:前端控制器向用户响应结果

Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预;二级缓存是SessionFactory级别的缓存,该级缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate还为查询结果提供了一个查询缓存,它依赖于二级缓存;

Struts2是单列还是多列?

struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。

Struts2框架执行流程步骤如下:

1、 客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3、 接着FilterDispatcher(现已过时)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4、 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5、 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6、 ActionProxy创建一个ActionInvocation的实例。

7、 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

说说Cookie和Session的区别?
   
   1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
 
   2、session中保存的是对象,cookie中保存的是字符串。

3、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。

4、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。

5、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

友友们如果那里写的不对请留言交流,希望能帮到友友们!

2018年面试题大全相关推荐

  1. 2018 iOS 面试题大全(补充完整版)

    原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 整理的一些iOS面试相关问题,持续更新,敬请关注 2018 iOS面试题大全---全方面剖析面试 1.2018 ...

  2. 2018经典PHP面试题大全

    2018PHP经典面试题大全汇总 2018/2/28 13:49:56 点击次数:4913 1.PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为Apache+MySQL+PHP ...

  3. Java面试题大全(总结)

    Java常见面试题大全 **Java面向对象有哪些特征,如何应用** HashMap原理是什么,在jdk1.7和1.8中有什么区别 ArrayList和LinkedList有什么区别 高并发中的集合有 ...

  4. Java面试题大全带答案 110道(持续更新)

    本人发现网上虽然有不少Java面试题大全带答案,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案 如果不背 ...

  5. python面试题_Python面试题大全

    [导读]推荐一个Python面试题大全,从Python基础到Python高级等非常全的面试题讲解. GitHub地址: https://github.com/kenwoodjw/python_inte ...

  6. 2018年计算机学校迎新标语,2018学校迎新标语大全.doc

    2018学校迎新标语大全 ♪(・ω・)ノ南岭无妹纸,搅基请谨慎. ♪(・ω・)ノ商学院:有人说商院的学弟帅学妹美,我想了一晚上--究竟是谁走漏了风声? ♪(・ω・)ノ起点更新,校园更新,生活更新,开启 ...

  7. c语言试卷大全,C语言试题大全

    C语言试题大全 引导语:c语言相关的试题都会考察什么内容呢?以下是小编整理的C语言试题大全,欢迎参考阅读! 一.填空题(10分,第1小题4分,其余每空1分) 1.设有下列登记表,请采用最佳方式定义一种 ...

  8. java面试题大全答案版文库_java高级面试题带答案

    java高级面试题,java面试题大全带答案,线程面试题,java面试宝典2019 1.[请对以下在J2EE中常用的名词进行解释(或简单描述)](http://www.wityx.com/post/1 ...

  9. 2020最新Java面试题大全,赶紧收藏吧!

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一.Java 基础 1. JDK 和 J ...

  10. [转载] JAVA面试题大全(part_1)

    参考链接: 对Java中派生类方法更严格的访问 JAVA面试题大全(part_1) 1.面向对象的特征有哪些方面 (1)抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目 ...

最新文章

  1. LAMP 架构深度优化记录
  2. 算法--- 二叉树的层序遍历 II
  3. 辨析Java与Javascript
  4. NAACL 2019 | 一种考虑缓和KL消失的简单VAE训练方法
  5. Spring 的优点
  6. Android简单实现BroadCastReceiver广播机制
  7. maven 包的导入
  8. 今日头条PC端的状态管理,使用的实现库是Redux
  9. 超低内阻mos管_FHU100N03低压MOS管保障榨汁机电路正常运行!
  10. 与微软.NET创始人Scott Guthrie面对面,“红衣教主”亲身传授推动成功转型的洪荒之力
  11. sql server 自定义函数的使用
  12. 山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...
  13. MATLAB获取系统时间
  14. 从零开始搭建我的网上商城 - Pika商城
  15. ISSN码和ISBN码的区别
  16. 《Machine Learning in Action》—— Taoye给你讲讲Logistic回归是咋回事
  17. jQuery实现简单实用的H5(手机端)下拉分页加载(所谓的懒加载!!!)
  18. Linux中vmstat命令详解
  19. Android开发人口流动管理,Android轻松搞定流动布局
  20. 【幻灯片制作软件】Focusky教程 | 帧的播放时间太长,该如何调整?

热门文章

  1. SuperMap iClient3D for WebGL实现三维管线分析
  2. EndNoteX9插入参考文献
  3. GB-T2260-2020 <中华人民共和国县以上行政区划代码>
  4. 软件测试常见的用例设计方法
  5. android6.0 Activity(四) Surface创建
  6. 最新版 银图/网银/MOMO模拟按键/Photoshop图像处理
  7. SQL——连接字符串常用函数
  8. aiml java_AIML实现智能聊天机器人
  9. 网络编程资源大集合(包含前端、java、linux、安卓、github开源项目、开发工具等)
  10. 华为云服务查找手机_华为云服务里面的手机找回需要什么条件