JAVA 问题及解答


  1. 字符流和字节流的区别,使用场景,相关类
    java中提供了专用于输入输出功能的包Java.io,其中包括:
     InputStream,OutputStream,Reader,Writer。
     InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象。
     Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串。
    
    所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。
    所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。
    字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 , 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。 
    字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串。 
    字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
    字节流在操作的时候本身是不会用到缓冲区(内存),是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。
    字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
    在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
    如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。
    字节流与字符流的区别详解
  2. java 对象存在哪几种状态?对于需要被持久化的Java对象,在它的生命周期中,可处于以下三个状态:(1) 临时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象被称为临时对象。(2) 持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。(3) 游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。
  3. 线程安全的概念,实现线程安全的几种方法
    1. 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
    若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
    2. extends Thread 或者 implements Rannable 。 启动线程 .start() 。
  4. 抽象类和接口的区别,使用场景
    抽象类可以有构造方法,可以有非抽象的普通方法,接口不允许有构造方法,方法必须是抽象的。
    抽象类可以有普通成员变量,静态成员变量,其访问类型可以任意;接口中定义的变量实际只能是常量。
    抽象类中的抽象方法的访问类型可以是public,protected,接口中的抽象方法只能是public
    抽象类中可以有静态方法,接口中不允许。
    一个类只能继承一个抽象类,但是可以实现多个接口;
    在设计类时,如果有些方法我们能确定,而有些方法不能确定,这时候我们就可以把该类声明成抽象类。抽象类的应用场景非常多,例如模板方法模式就是抽象类的一个应用,JDK中的inputStream和outputStream也是抽象类的一个应用,这两个类定义了如何读写数据的方法,而没有定义从哪里去读,具体从哪里读由具体的实现子类确定。  
    我们在定义相互调用规则时,可以使用接口。面向接口进行编程的明显好处,就是能极大降低软件系统的相互耦合性,接口的定义者按照接口进行调用,而实现者去实现接口。  在JDK中存在许多针对于接口的编程,例如用于比较对象的Comparable接口就是一个典型案例,我们在自定义对象时,如果实现了该接口,那么我们把对象保存到treeset集合中时,treeset将针对接口调用对象的compareTo方法。
  5. hash算法的实现原理,hashcode的实现原理
    1. HASH 主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128 位的编码, 这些编码值叫做HASH 值. 也可以说,hash 就是找到一种数据内容和数据存放地址之间的映射关系。
    例如字符串 hello 的哈希算法
    char* value = "hello"; int key = (((((((27* (int)'h'+27)* (int)'e') + 27)  * (int)'l') + 27) * (int)'l' +27) * 27 ) + (int)'o' ;
    
    2. 也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
  6. hashMap 底层原理
    归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法(根据key生成 的hashcode) 来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
  7. 继承与组合的区别,使用场景
    组合案列
    继承和组合的区别
  8. 如果有10万条学生成绩信息,怎么获取成绩最高的那一条数据,怎么获取成绩第三的那一条数据,列举你认为性能最好的方式
    select * from table order by grades desc limit 1
    select * from table id in(select id from table order by grades desc limit 3) order by grades asc limit 1
  9. 序列化的作用,应用场景
    1、什么是序列化和反序列化
    Serialization 把将对象表示成一连串的字节。 deserialization 把这些字节重建成一个对象。
    
    2、什么情况下需要序列化 
    a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI传输对象的时候;
    
    3、如何实现序列化
    将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。
    JAVA 序列号Serializable 详解
  10. ajax是否能跨域请求,解决的办法
    ajax不能跨域请求,由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。解决方式有两种:1 采用JSONP,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问;2 iframe的方式,通过设置document.domain来实现。
  11. 解析xml的几种方法,他们的原理
    1.DOM(Document Object Model)它把整个XML文档当成一个对象加载到内 存,不管文档有多大。它一般处理小文件
    2.SAX(Simple API for XML)它的处理过程像流媒体。它不会把整个文档加载到内存,它是读一点处理一点。一般用它处理比较大的文件
    3.JDOM包含了前两种方式
    4.DOM4J也包含了前两种方式
    其中DOM和SAX都是java的标准,也就是java本身就提供标准的API,不需要下载其他包,但是它的API都是一些底层的实现,不是很好用。所以有人在它们的基础上封装了一下,就有了DOM4j和JDOM。DOM4J性能最好,连SUN的JAXM也在用DOM4J.Hibernate也用DOM4J,DOM4J对Xpath也有很好的支持。
  12. 怎么样实现高性能的代码
  13. 防止重复提交有哪几种方式 
    1.禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。
    2.在提交后执行页面重定向3. 添加加载遮罩层
  14. 数据库连接池的实现原理,请求怎么样去获取连接,,关闭连接时,连接池是销毁连接还是回收连接
    连接池在初始化的时候,生成多个可用的Connection存放在List中,当DAO获取连接时,关闭连接时,连接被回收
    连接池原理
  15. http和https的区别
    http是超文本传输协议,明文传输信息,https 则是具有安全性的SSL加密传输协议,要比http协议安全
    http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  16. 除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 
    JAVA生成对象 一共4种方法
    克隆反射 new 还有就是反序列化
     
  17. 编写代码实现一个线程池 
    线程池原理及实现
  18. 描述一下JVM加载class文件的原理机制? 
    在Java中,类装载器(class load)把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析
        装载:查找和导入类或接口的二进制数据; 
        链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 
        校验:检查导入类或接口的二进制数据的正确性; 
             准备:给类的静态变量分配并初始化存储空间; 
             解析:将符号引用转成直接引用;
    初始化:激活类的静态变量,初始化Java代码和静态Java代码块
  19. 请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 
  20. 访问修饰符“public/private/protected/缺省的修饰符”的使用 
  21. 用关键字final修饰一个类或者方法时,有何意义? 
    意义: 最终的,不可改变的.
      1, 修饰变量,为常量,值不可变;
      2, 修饰对象,值可变,引用不变;
      3, 修饰方法,方法不可重写.
      4, 修饰类,无子类,不可以被继承,更不可能被重写.
  22. 一个“.java”原文件中是否可以包括多个类(不是内部类)? 
    一个“.java”文件中 可以包括多个类,
    但是只能有一个public类,且该public类的类名必须与文件名相同
  23. 使用StringBuffer类与String类进行字符串连接时有何区别? 
    * String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append()方法来修改值.
    * StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
    * StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
    * 简单来说 StringBufer 是一个变量,String 是一个长量。StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,插入、删除等操作,使用StringBuffer要更加适合一些。
    * 因为 String 是有 .equals方法,而 StringBuffer 则没有,所以在使用集合的时候(如set 集合需要重写 equals)只能使用 String。而StringBuffer 就会出现异常。
  24. 什么是sychronized?什么事 ReentrantLock ? Lock与synchronized 的区别?
    
    一.
     sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类.
    在修饰代码块的时候需要一个reference对象作为锁的对象.
    在修饰方法的时候默认是当前对象作为锁的对象.
    在修饰类时候默认是当前类的Class对象作为锁的对象.
    二.
    以对象的方式来操作对象锁.相对于sychronized需要在finally中去释放锁 
    三.
    除了synchronized的功能,多了三个高级功能.
    等待可中断,公平锁,绑定多个Condition.
    1.等待可中断
    在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待.   tryLock(long timeout, TimeUnit unit)
    2.公平锁
    按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁.    new RenentrantLock(boolean fair)
    3.绑定多个Condition
    通过多次newCondition可以获得多个Condition对象,可以简单的实现比较复杂的线程同步的功能.通过await(),signal();
    4.在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
  25. SQL注入的原理
    SQL 注入
  26. java 分布式集群
  27. 介绍你做过的项目,用到的技术,涉及到的模块,然后从项目中问各种技术实现的细节(为了确保你是真的懂了)。
  28. Hibernate工作原理及为什么要用?
    工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory
    为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
  29. spring是什么?
    spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程) 
    1、Spring的核心是一个轻量级(Lightweight)的容器(Container)。
    2、Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。
    3、Spring提供AOP(Aspect-oriented programming)概念的实现方式。
    4、Spring提供对持久层(Persistence)、事物(Transcation)的支持。
    5、Spring供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。
    6、Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。
    总之,Spring是一个全方位的应用程序框架。
  30. hibernate是什么?
    hibernate是基于ORM对象关系映射(完成对象数据到关系数据映射的机制)实现的,做数据持久化的工具 
  31. 数据库里面的索引和约束是什么?
    索引是为了提高数据的检索速度。根据一个或多个字段建立的约束是为了保持数据的完整性,约束有非空约束,主键约束,外键约束等等。
  32. MVC 的概念
    M -- 模型。负责处理具体的业务逻辑
    V -- 视图。负责将处理后的数据呈现出来
    C -- 控制器。也就是视图层和模型层桥梁,控制数据的流向,接受视图层发出的事件,并重绘视图
  33. JAVA 程序什么情况下回出现内存溢出?
    流操作未关闭、数据库连接未关闭、代码的死循环、递归层数太多,创建线程太多等等。
    Java常见的几种内存溢出及解决方法
  34. 常用设计模式的 应用场景
    常用设计模式的 应用场景
  35. Linux中常用操作命令
    Linux中常用操作命令
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值