面试题


                                                                         java常用的面试题
    1.String StringBuffer  StringBuilder的区别是什么? String为什么是不可变得
        1.    String是字符串常量,StringBuffer和StringBuilder都是字符串变量,后者字符串内容可变,前者不可变
        2.    String 不可变是因为jdk中String类声明为一个final类
        3.    StringBuffer线程安全  StringBuilder线程不安全
    2. Vector ArrayList LinkedList区别是什么?
        1. Vector ArrayList都是类似数组形式存储在内存中,LinkedList链表形式进行存储
        2. List的元素有序,允许重复的元素,Set的元素无序,不允许重复元素
        3  Vector 线程安全 ArrayList和LinkedList线程不安全
        4. LinkedList增删改快 ArrayList和Vector查询快
        5. ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
    3.  HashTable HashMap TreeMap区别?
        1. HashTable 线程安全 HashMap 线程不安全
        2. HashTable 不允许有空值   HashMap允许key value有空值
        3. TreeMap能够把它保存的记录根据键排序,默认是按升序排序。
    4.  Tomcat,Apache区别
        1. Tomcat web服务器   Apache http服务器
    5.  GET  POST区别?
        1. GET从服务器获取数据,POST向服务器发送数据
        2. get 通过url提交数据,URL地址栏可以看到请求消息,post 数据则放到html header提交
        3. GET提交有数据最多1024字节 POST没有限制
        4. get提交的参数级参数值在地址栏显示,不安全, POST比较安全
    
    6. Statement与PrepareStatement区别,什么是Sql注入,如何防止Sql注入
        1. PrepareStatement支持动态设置参数 展位符(?) Statement不可以
        2. PrepareStatement支持预编译,Statement不支持
        3. PrepareStatement出错不易查询,Statement易查询
        4. PrepareStatement防止sql注入,Statement不行
        5. PrepareStatement实现Statement
    7.  Spring的理解,项目都用什么?怎么用?对IOC和AOP理解及原理

            spring是一个开源框架,轻量级
            IOC控制反转 DI依赖注入 系统用用到的对象不在系统加载时全部实例化,而是在调用这个类实例该类的对象,提高系统的性能
            DI依赖注入 set注入  构造注入 自动注入
            AOP面向切面编程

            实现了软件各层间解耦合
            可以使用容易提供的众多服务,如事务管理,消息服务,日志记录等
            器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。一般使用动态代理
    
    8.  sql优化相关问题
                良好索引设计 主键设计
                数据库逻辑设计规范化
                不要写select * from 表名 写具体的字段
                读写分离 
                
    9.  抽象类和接口区别
         抽象类                                                   接口
         有默认的方法实现,有抽象方法                                    接口完全是抽象,公开的
         extends                                                   implements
         有构造器                                                   没有构造器
         类  不能new (它不是一个具体的类)                          接口是完全不同的类型
         抽象方法  public protected default修饰符                    public
         单继承                                                     多实现
    10. hashmap的实现原理
        HashMap是又数组和链表组成,数组是HashMap的主体,链表主要解决哈希冲突存在的
    11. ConcurrentHashMap内部原理?它是如何实现多线程的
        ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段段的存储,然后给每一段枷锁,当一个线程占用锁访问其一段数据,其他段数据也能被其他线程访问,有按照顺序释放使用段的锁,ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定的。
    12. Jvm调优
        Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。
             CPU热点:检查系统哪些方法占用的大量CPU时间
               内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)
                这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行所有代码的优化。
            内存泄漏检查   
               内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(
            ,从而导致新的资源分配请求无法完成,引起系统错误。
                这种方式解决起来也比较容易,一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。
             持久代被占满   
                 1. -XX:MaxPermSize=16m
                    2. 换用JDK。比如JRocket。
             堆栈溢出
                    异常:java.lang.StackOverflowError
                    说明:这个就不多说了,一般就是递归没返回,或者循环调用造成
            线程堆栈满
                    增加线程栈大小
            系统内存被占满
                1. 重新设计系统减少线程数量。
                    2. 线程数量不能减少的情况下,通过-Xss减小单个线程大小。以便能生产更多的线程。

           13.gc
               GC的工作目的很明确:在堆中,找到已经无用的对象,并把这些对象占用的空间收回使其可以重新利用.
           14. 异常的分类?怎样解决异常?
                1.Throwable异常超类 java.lang包下
                子类 Error Exception
                Error 是Throwable的子类,是程序出现严重问题,这中问题程序解决不了
                Exception 编译异常 和 运行时异常(RuntimeException)
                RuntimeException 类型装换异常  数字格式异常 空指针异常 类找不到  下标越界异常
                 - ArithmeticException(算术异常)
                - ClassCastException (类转换异常)
                - IllegalArgumentException (非法参数异常)
                - IndexOutOfBoundsException (下标越界异常)
                - NullPointerException (空指针异常)
                - SecurityException (安全异常)
             2. 解决方案
               throws抛出异常
                  try-catch-finally
        15.    熟悉的设计模式?创建单例模式集中方式和区别?
        工厂设计模式  创建对象 java反射
        单例设计模式
        适配器设计模式
        代理设计模式
        迭代器设计模式
        单例模式实现1:
            public class Singleton {
                // 类共享实例对象
                private static Singleton singleton = null;
                // 私有构造方法
                private Singleton() {
                System.out.println("-- this is Singleton!!!");
                }
                // 获得单例方法
                public synchronized static Singleton getInstance() {
                // 判断 共享对象是否为null ,如何为null则new一个新对象
                if (singleton == null) {
                singleton = new Singleton();
                }
                return singleton;
                }
                }
                单例模式实现2:
                public class Singleton {
                // 类共享实例对象 实例化
                private static Singleton singleton = new Singleton();
                // 私有构造方法
                private Singleton() {
                System.out.println("-- this is Singleton!!!");
                }
                // 获得单例方法
                public static Singleton getInstance() {
                // 直接返回共享对象
                return singleton;
                }
}
        
        16. springaop原理?springioc原理?
            1.(1)IOC 从传统对象从new 到交给spring工厂,也就是说所有的类的创建.销毁都是由spring来控制,
                控制对象生存周期不在是它的引用,而是spring 这就叫控制反转
               (2)在系统运行中,动态的向某个对象提供它所需要的其他对象
               (3)依赖注入 set注入 构造注入 自动注入
            2.(1)aop面向切面编程 主要处理 事务 日志 减少系统重复代码
              (2)主要有2大分类 静态代理和动态代理        
        17. 分布式事务?分布式缓存?
           目前关于事务的几大理论包括:ACID事务特性,CAP分布式理论,以及BASE等。ACID在数据库事务中体现,CAP和BASE则是分布式事务的理论,结合业务系统,例如订单管理,例如仓储管理等,可以借鉴这些           理论,从而解决问题。
           cap 
           c 一致性  a 可用性 p分区容忍性
           2) 分布式缓存系统:数据在固定数目的集群节点间分布存储.优点是缓存容量可扩展(静态扩展);缺点是扩展过程中需要大量配置,无容错机制.典型的,如 Memcached;.分布式缓存作为NoSQL 的一种重要实现            形式,可为云平台提供高可用的状态存储与可伸缩的应用加速服务,与其他NoSQL 系统间并无清晰的界限.平台中应用访问与系统故障均具有不可预知性,为了更好地应对这些挑战,应用软件在架构时通常采用无            状态设计,大量状态信息不再由组件、容器或平台来管理,而是直接交 付给后端的分布式缓存服务或NoSQL 系统.
        
        18. mybatis中$和#区别?一对多和多对一
            #{} 以展位符
            ${} 字符串 存在sql注入的风险
            主要就是resultMap中 
            association – 一个复杂的类型关联;许多结果将包成这种类型(一对多) 
            collection – 复杂类型的集合(多对一) 
            这2个属性的使用,而一对多和多对一都是相互的,只是站的角度不同。
        19. springmvc执行流程?spring常用注解?bean注解原理
             执行流程 发送请求>>>前端控制器>>页面处理器--c-前端--视图--前端
             常用注解
             @Controller
             @RequestMapping()
             @Service
             @Auowired
             @ResponseBody
             @Repository 注解dao
             、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化)
             :凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解
             bean 实际确实通过java反射 获得的
        
        20. java代码锁以及数据库悲观锁和乐观锁
        21. 如何解决高并发问题
            一种是使用缓存、另一种是使用生成静态页面;还有就是从最基础的地方优化我们写代码减少不必要的资源浪费
                 根据不同的情况,解决思路也不同。
                    像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器。
                    负载均衡,前置代理服务器nginx、apache等等
                    数据库查询优化,读写分离,分表等等
                    尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
                    用jprofiler等工具找出性能瓶颈,减少额外的开销。
                    优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
                    优化数据库结构,多做索引,提高查询效率。
                    统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
                    能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
                    解决以上问题后,使用服务器集群来解决单台的瓶颈问题。、负载均衡
        23. 线程池创建几种方式?线程各个状态?怎样种植线程
            3中 extends Thread  implements Runnable
            线程池
            每当一个请求到达就创建一个新线程,为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。
        25. 事务的隔离级别?事务的特性?事务的问题?
            4个 读提交  读不提交 可重复读
        26. springboot中区分生产环境和开发环境
        27. java三大特性?具体讲讲?
            封装 继承 多态 (抽象)
        29. final finally finalize区别
            1.final 修饰类,方法 属性 类  不能被继承 方法不能重写  属性常量
            2. finall 是和try -catch -finally连用
            3. finalize 当堆的对象没有任何引用时,这个方法会被调用,来做垃圾回收
        30、访问修饰符public,private,protected,以及不写(默认)时的区别
        31.String 是最基本的数据类型吗?
        不是 8个基本类型 byte、short、int、long、float、double、char、boolean
        32.float f=3.4;是否正确?
        不正确 3.4是双精度 双精度duble
        33.short s1 = 1 ; s1 += 1;
        因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换
        34、Java有没有goto?
        goto 是Java中的保留字,在目前版本的Java中没有使用
        35.int和Integer有什么区别?
         原始类型: boolean,char,byte,short,int,long,float,double
-       包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
        36.&和&&的区别?
        &运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,
        37.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
        Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
        38.用最有效率的方法计算2乘以8?
        : 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
        39.数组有没有length()方法?String有没有length()方法?
        数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
        40.构造器(constructor)是否可被重写(override)?
        答:构造器不能被继承,因此不能被重写,但可以被重载。
        41.是否可以继承String类
        String 类是final类,不可以被继承。
        42.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
        是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用
        43.String和StringBuilder、StringBuffer的区别?
        Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而                   StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的
        所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高
        44.重载(Overload)和重写(Override)的区别。
        同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载,
        重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)
        45.描述一下JVM加载class文件的原理机制?
        JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件
        46.char 型变量中能不能存贮一个中文汉字,为什么
        char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
        47.Java 中会存在内存泄漏吗,请简单描述。
        :理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。
        48.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
        答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
        49.阐述静态变量和实例变量的区别
        静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存
        50.是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用
        不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化
        51.如何实现对象克隆?
        ?1). 实现Cloneable接口并重写Object类中的clone()方法;
??2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
        52.GC是什么?为什么要有GC
        C是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃
        Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。
        垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存
        53.String s = new String("xyz");创建了几个字符串对象?
        两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。
        54.Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
        可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。
        55.一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
        可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致
        56.接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)
        接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类
        57.数据类型之间的转换
        - 调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;
- 一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串
        58.什么时候用断言(assert)
        断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError。断言的使用如下面的代码所示:
        59.List、Set、Map是否继承自Collection接口
        
        List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形
        60.阐述ArrayList、Vector、LinkedList的存储性能和特性
        ArrayList 和Vector都是使用数组方式存储数据
        LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,
        61.Collection和Collections的区别
            Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
        62.List、Map、Set三个接口存取元素时,各有什么特点
            List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为
        63.TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何
        TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。
        64.Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别
            sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
        65.当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B
        不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
        66.请说出与线程同步以及线程调度相关的方法
         wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
- sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
- notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
- notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
        67.举例说明同步和异步。
        所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作
        68.启动一个线程是调用run()还是start()方法
        启动一个线程是调用start()方法
        69.什么是线程池(thread pool)
        在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁
        70.简述synchronized 和java.util.concurrent.locks.Lock的异同
        Lock是Java 5以后引入的新的API,和关键字synchronized相比主要相同点:Lock 能完成synchronized所实现的所有功能;主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally 块中释放
        71.、Java中如何实现序列化
        序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化
        72.XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
        XML文档定义分为DTD和Schema两种形式,二者都是对XML语法的约束,其本质区别在于Schema本身也是一个XML文件,可以被XML解析器解析,而且可以为XML承载的数据定义类型,约束能力较之DTD更强大。对XML的解析主要有DOM(文档对象模型,DocumentObjectModel)
        73.、阐述JDBC操作数据库的步骤。
          加载驱动。

 Class.forName("oracle.jdbc.driver.OracleDriver");

    创建连接。

    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");

    创建语句。

 PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
    ps.setInt(1, 1000);
    ps.setInt(2, 3000);

    执行语句。

    ResultSet rs = ps.executeQuery();

    处理结果。

 while(rs.next()) {
        System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
    }

    关闭资源。

  finally {
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    73.Statement和PreparedStatement有什么区别?哪个性能更好?
    与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快
    74在进行数据库编程时,连接池有什么作用?
    由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的),为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此相同。基于Java的开源数据库连接池主要有:C3P0、Proxool、DBCP、BoneCP、Druid等。
    75.什么是DAO模式
    DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作
    76.事务的ACID是指什么
     原子性(Atomic)
     一致性(Consistent)
      隔离性(Isolated)
      持久性(Durable)
     77.JDBC中如何进行事务处理
     Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚
     78.如何通过反射创建对象
     方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");
    79.JSP有哪些内置对象?作用分别是什么?
    - request:封装客户端的请求,其中包含来自GET或POST请求的参数;
    - response:封装服务器对客户端的响应;
    - pageContext:通过该对象可以获取其他对象;
    - session:封装用户会话的对象;
    - application:封装服务器运行环境的对象;
    - out:输出服务器响应的输出流对象;
    - config:Web应用的配置对象;
    - page:JSP页面本身(相当于Java程序中的this);
    - exception:封装页面抛出异常的对象。
    JSP解决了Servlet的这些问题,它是Servlet很好的补充,可以专门用作为用户呈现视图(View),而Servlet作为控制器(Controller)专门负责处理用户请求并转发或重定向到某个页面。基于Java的Web开发很多都同时使用了Servlet和JSP。JSP页面其实是一个Servlet,
    80.讲解JSP中的四种作用域
    JSP中的四种作用域包括page、request、session和application,具体来说:
    - page代表与一个页面相关的对象和属性。
    - request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
    - session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
    - application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
    81.什么是ORM
    ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。

82首先介绍一些乐观锁与悲观锁:

  悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。

  乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值