zoukankan      html  css  js  c++  java
  • Java面试题—初级(5)

    41、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

    hashCode() 方法对应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。

    42、字节流与字符流的区别

           要把一段二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一段二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流,对应的抽象类为OutputStream和InputStream,不同的实现类就代表不同的输入和输出设备,它们都是针对字节进行操作的。

           计算机中的一切最终都是二进制的字节形式存在。对于经常用到的中文字符,首先要得到其对应的字节,然后将字节写入到输出流。读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符。由于这样的需求很广泛,Java专门提供了字符流包装类。

          底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设备写入或读取字符串提供了一点点方便。

          字符向字节转换时,要注意编码的问题,因为字符串转成字节数组,其实是转成该字符的某种编码的字节形式,读取也是反之的道理。

    43、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

            我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输。

            但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现方法,implements Serializable只是为了标注该对象是可被序列化的。

            例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输,被传输的对象就必须实现Serializable接口。

    44、描述一下JVM加载class文件的原理机制?

            JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

    45、heap和stack有什么区别。

            java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

            堆是与栈作用不同的内存,一般用于存放不在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

    46、GC是什么?为什么要有GC?

            GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

    47、垃圾回收的优点和原理。并考虑2种回收机制。

            Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。

            垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

            回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

    48、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

            对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。

            程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

    49、Java 中,throw 和 throws 有什么区别

            throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个Exception,如: 
    throw new IllegalArgumentException(“XXXXXXXXX″)

            而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。

    50,java中会存在内存泄漏吗,请简单描述。

            先解释什么是内存泄漏:所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证当对象不再被引用的时候,对象将自动被垃圾回收器从内存中清除掉。

            由于Java使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达,那么GC也是可以回收它们的。

            java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。

    51、说一说Servlet的生命周期?

            Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表达。

            Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

    web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

    52、Servlet API中forward()与redirect()的区别?

        1.从地址栏显示来说
            forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
            redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。
        2.从数据共享来说
            forward:转发页面和转发到的页面可以共享request里面的数据.
            redirect:不能共享数据.
            redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.
            forward方法只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.
            redirect 是服务器通知客户端,让客户端重新发起请求.
       所以,你可以说 redirect 是一种间接的请求, 但是你不能说"一个请求是属于forward还是redirect "
        3.从运用地方来说
            forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
            redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
        4.从效率来说
            forward:高.
            redirect:低.

     

    53、request.getAttribute()和 request.getParameter()有何区别?

            1,request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据。

                request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。

            2,getAttribute是返回对象,getParameter返回字符串

            3,getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()设置之后,才能够通过getAttribute()来获得值,它们传递的是Object类型的数据。而且必须在同一个request对象中使用才有效。,而getParameter()是接收表单的get或者post提交过来的参数

    54,jsp静态包含和动态包含的区别

            1、<%@include file="xxx.jsp"%>为jsp中的编译指令,其文件的包含是发生在jsp向servlet转换的时期,而<jsp:include page="xxx.jsp">是jsp中的动作指令,其文件的包含是发生在编译时期,也就是将java文件编译为class文件的时期 

            2、使用静态包含只会产生一个class文件,而使用动态包含会产生多个class文件 

            3、使用静态包含,包含页面和被包含页面的request对象为同一对象,因为静态包含只是将被包含的页面的内容复制到包含的页面中去;而动态包含包含页面和被包含页面不是同一个页面,被包含的页面的request对象可以取到的参数范围要相对大些,不仅可以取到传递到包含页面的参数,同样也能取得在包含页面向下传递的参数 

    55,MVC的各个部分都有那些技术来实现?如何实现?

            MVC是Model-View-Controller的简写。Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

     56,jsp有哪些内置对象?作用分别是什么?

            JSP共有以下9个内置的对象:

            1,request 用户端请求,此请求会包含来自GET/POST请求的参数

            2,response 网页传回用户端的回应

            3,pageContext 网页的属性是在这里管理

            4,session 与请求有关的会话期

            5,application servlet 正在执行的内容

            6,out 用来传送回应的输出

            7,config  servlet的构架部件

            8,page JSP网页本身

            9,exception 针对错误网页,未捕捉的例外

    57,Http中,get和post方法的区别

            1,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求

            2,Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改

            3,Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。
            4,Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。

            5,GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。

    在服务器端,用Request.QueryString来获取Get方式提交来的数据
    Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post。
            6,POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取。

    (仅供参考,如果有更好的回答,欢迎探讨)

    58,什么是cookie?Session和cookie有什么区别?

        Cookie是会话技术,将用户的信息保存到浏览器的对象.

        区别:

            (1)cookie数据存放在客户的浏览器上,session数据放在服务器上
            (2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
            (3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
            (4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。

        结论:

            将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中。

    59,jsp和servlet的区别、共同点、各自应用的范围?

            JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

            Servlet和JSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

            JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

    60,tomcat容器是如何创建servlet类实例?用到了什么原理?
            当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)
            在servlet注册时加上<load-on-startup>1</load-on-startup>如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

    61,JDBC访问数据库的基本步骤是什么?
    1,加载驱动
    2,通过DriverManager对象获取连接对象Connection
    3,通过连接对象获取会话
    4,通过会话进行数据的增删改查,封装对象
    5,关闭资源

    62,说说preparedStatement和Statement的区别
    1,效率:预编译会话比普通会话对象,数据库系统不会对相同的sql语句不会再次编译
    2,安全性:可以有效的避免sql注入攻击!sql注入攻击就是从客户端输入一些非法的特殊字符,而使服务器端在构造sql语句的时候仍然能够正确构造,从而收集程序和服务器的信息和数据。
    比如:“select * from t_user where userName = ‘” + userName + “ ’ and password =’” + password + “’”
    如果用户名和密码输入的是’1’ or ‘1’=’1’ ;  则生产的sql语句是:
    “select * from t_user where userName = ‘1’ or ‘1’ =’1’  and password =’1’  or ‘1’=’1’  这个语句中的where 部分没有起到对数据筛选的作用。

    63,说说事务的概念,在JDBC编程中处理事务的步骤。
    1 事务是作为单个逻辑工作单元执行的一系列操作。
    2,一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务
    事务处理步骤:
    3,conn.setAutoComit(false);设置提交方式为手工提交
    4,conn.commit()提交事务
    5,出现异常,回滚 conn.rollback();

    64,数据库连接池的原理。为什么要使用连接池。
    1,数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。
    2,数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。
    3,使用连接池是为了提高对数据库连接资源的管理

    65,JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

      当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的。数据库的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔离级别可以防止脏读。

     

    66,什么是幻读,哪种隔离级别可以防止幻读?

      幻读是指一个事务多次执行一条查询返回的却是不同的值。假设一个事务正根据某个条件进行数据查询,然后另一个事务插入了一行满足这个查询条件的数据。之后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫做幻读。

      只有TRANSACTION_SERIALIZABLE隔离级别才能防止产生幻读。

    67,JDBC的DriverManager是用来做什么的? 
    JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面
    然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。 

    68,execute,executeQuery,executeUpdate的区别是什么? 
            1,Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录条数。 
            2,Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。 ,
            3,Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回,对于DDL语句,返回值是int类型,如果是DML语句的话,它就是更新的条数,如果是DDL的话,就返回0。 
    只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。

    69,SQL查询出来的结果分页展示一般怎么做?

    Oracle:

    select * from 
    (select *,rownum as tempid from student )  t 
    where t.tempid between ” + pageSize*(pageNumber-1) + ” and ” + pageSize*pageNumber

    MySQL:

     select * from students limit ” + pageSize*(pageNumber-1) + “,” + pageSize;
    

      

    sql server: 

    select top ” + pageSize + ” * from students where id not in + 
    (select top ” + pageSize * (pageNumber-1) +  id from students order by id) +  
    “order by id;
    

      

    70,JDBC的ResultSet是什么? 
    在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。 
    ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回false。可以在for循环中用它来遍历数据集。 
    默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也可以创建可以回滚或者可更新的ResultSet

    当生成ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。 
    可以通过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据。

     

  • 相关阅读:
    Elasticsearch 索引操作
    windows curl命令
    Elasticsearch简介
    ElasticSearch插件安装
    SignalR实时聊天功能
    原来现在很多人都用SignalR来实现Chat Room
    设计模式(六)(Command Pattern)命令模式
    FtpWebRequest FTP异步下载、异步上传文件
    FTP规范
    oracle组建:ODAC112021Xcopy_x64,在开发机上,不用安装oracle的客户端等开发
  • 原文地址:https://www.cnblogs.com/javazhiyin/p/8855843.html
Copyright © 2011-2022 走看看