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过多会增加服务器的压力。

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

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐