欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaSE面试题

程序员文章站 2022-05-02 12:53:19
...

JavaSE基础知识

1.一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有个public的类,并且public的类名必须与文件名保持一致

2.Java 有没有 goto

goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。(根据 JamesGosling(Java 之父)编写的
《TheJava ProgrammingLanguage》一书的附录中给出了一个 Java 关键字列表,其中有 goto 和 const,
但是这两个是目前无 法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,
因为熟悉 C 语言的 程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字) 

3.说说&和&&的区别?

1 &和&&都可以用作逻辑与的运算符,表示逻辑与(and)
2 &&具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式
3 &还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,0x31&0x0f 的结果为 0x01。
4 short s1=1;s1=s1+1;有什么错? short s1=1;s1+=1;有什么错?

1 对于 shorts1=1;s1=s1+1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。 
2 对于 shorts1=1;s1+=1;由于 += 是 java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以 正确编译。 

5 char 型变量中能不能存贮一个中文汉字?为什么?

char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,char 型变量中当
然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 
型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占用两个字节,所以,char 类型的变量也是占用两个字节。 

6 最有效率的方法算出 2 乘以 8 等於几?

2<<3,因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,
而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2<<3


7 floatf=3.4;是否正确?

不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型
(down-casting,也称为窄 化)会造成精度损失,因此需要强制类型转换 floatf=(float)3.4; 或者写成 floatf=3.4F;。 

8 在Java中如何跳出当前循环? 如何跳出多重循环?

break; return

9 数据类型之间的转换?

1 如何将字符串转换为基本数据类型?
    调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型
2 如何将基本数据类型转换为字符串?
    (1) 一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;
    (2) 一种方法是调用 String 类中的 valueOf()方法返回相应字符串 

10 JDK和JRE的关系区别是什么?

JDK是Java的开发工具,JDK包含JRE
JRE只是Java程序的运行环境,它最核心的内容就是JVM(Java虚拟机)及核心类库

JavaSE面向对象

1 静态变量和实例变量的区别?

1 语法定义:静态变量前要加 static 关键字,而实例变量前则不加
2 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配 空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载 了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量 必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用

2 重载和重写的区别?

重载:
1 方法名相同,参数列表不同的多个方法之间构成重载关系
2 参数列表中参数类型、个数、顺序至少有一个不同
3 重载关系存在于父类,子类和同类中
重写:
当子类从父类继承的方法不足以满足子类的需求时,需要重写该方法
重写原则:
1 方法名,返回值类型,参数列表相同
2 不能抛出更大更多的异常
3 访问权限不能变小
4 由final修饰的方法表示该不能被重写

3 final关键字的用法?

1 修饰类,表示该类不能被继承
2 修饰方法,表示该方法不能被重写
3 修饰变量,表示该变量必须被初始化,而且值不能更改

4 final,finally和finalize的区别?

final关键字:
修饰成员变量,表示必须被初始化不可修改
修饰成员方法,表示该方法不能被重写
修饰类,表示该类不能被继承
finally:配合try...catch使用
表示最终会被执行,一般用于资源的释放
finalize:Object中的方法,主要用于CG垃圾回收之前的清理工作

5 是否可以从一个 static 方法内部发出对非 static 方法的调用?

不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调 
用,而 static 方法调用时不需要创建对象,可以直接调用。也就是说,当一个 static 方法被调用时,
可能还没有 创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的调用,那个非 static 
方法是关联到哪个对象上 的呢?这个逻辑无法成立,所以,一个 static 方法内部发出对非 static 方法的调用。 

6 请说出作用域 public,private,protected,以及不写时的区别?

访问控制符 访问权限 本类 本包中的类 子类 其它包的类
public 公有的 Y Y Y Y
protected 保护的 Y Y Y N
默认的 Y Y N N
private 私有的 Y N N N

7 面向对象的特征有哪些方面?

1 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关 注对象有哪些属性和行为,并不关注这些行为的细节是什么。 
2 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);
得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中 
可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中关于桥梁模式的部 分)。 
3 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质
就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封 装;
我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编
程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;
我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 
4 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用 
调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对 
象向外界提供的服务,那么运行时的多态性可以解释为:
当 A 系统访问 B 系统提供的服务时,B 系统有多种提供 服务的方式,但一切对 A 系统来说都是透明的(
就像电动剃须刀是 A 系统,它的供电系统是 B 系统,B 系统可以 使用电池供电或者用交流电,甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道供 电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也 称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象 最精髓的东西,要实现多态需要做两件事:
(a)方法重写(子类继承父类并重写父类中已有的或抽象的方法); (b)对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表 现出不同的行为)。

8 构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载

9 描述一下 JVM 加载 class 文件的原理机制?
JavaSE面试题

10 JVM内存结构?
JavaSE面试题

11 Java中会存在内存泄漏吗,请简单描述?

理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被广泛使用于服务器端编程的
一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被 GC 回收,因此也会导致 
内存泄露的发生。例如 Hibernate 的 Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些
对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能
导致内存泄露

12 GC 是什么?为什么要有 GC?

GC 是垃圾收集的意思Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,
从而有效的防止内存泄露。 要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntim().gc() ,但JVM 可以屏蔽掉显示的垃圾回收调用。 

13 heap 和 stack 有什么区别?

java 的内存分为两类,一类是栈内存,一类是堆内存。 
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。 
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用 new 创建的对象都 放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用 final 修饰后,放在堆中,而不是栈中

14 解释内存中的栈(stack)、堆(heap)和静态区(staticarea)的用法?

1 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的 栈空间; 2 而通过 new 关键字和构造器创建的对象放在堆空间; 
3 程序中的字面量(literal)如直接书写的 100、"hello"和常量都是放在静态区中。
4 栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用 的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。 
5 例如:Stringstr=newString("hello"); 上面的语句中变量 str 放在栈上,用 new 创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。 

JavaSE核心类库

核心类库

1 “==”和 equals 方法究竟有什么区别?

==:比较两个数据内存地址是否相同
equals:比较两个数据值是否一样 

2 abstract class和interface有什么区别?

(1)成员特点: 
构造方法:接口没有;抽象类有; 
成员变量:接口中只有常量;抽象类中常量、变量都可; 
成员方法:接口只有抽象方法;抽象类中抽象方法、非抽象方法都可; 
(2)关系特点: 
类与类:只有单继承,但可以多层继承; 
类与接口:实现关系,可以单实现,也可以多实现;
接口与接口:继承关系,可以单继承,也可以多继承; 
(3)设计理念: 
接口是简单工厂设计模式,likea 的关系 ,接口中定义的是该继承体系的扩展功能;
抽象类是模板设计模式,isa 的关系,抽象类中定义的是继承体系的共性功能; 

3 Integer 与 int 的区别 ?

1 int 是 java 提供的 8 种原始数据类型之一。Java 为每个原始类型提供了封装类,Integer 是 java 为 int 提供 的封装类。int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无 法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为 0 的区别,则只能使用 Integer。在 JSP 开 发中,Integer 的默认为 null,所以用 el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为 0, 所以用 el 表达式在文本框中显示时,结果为 0,所以,int 不适合作为 web 层的表单数据的类型。 
2 在 Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为 null 而判断一个 对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文件中设置其 unsaved-value 属性为 0。
3 另外,Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer 中还定义了 表示整数的最大值和最小值的常量。 

4 Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

round 方法,它表示“四舍五入”,算法为 Math.floor(x+0.5),
即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5)的结果为 12,Math.round(-11.5)的结果为-11。 

5 String 和 StringBuilder、StringBuffer 的区别?

1 String 和 StringBuffer、StringBuider:
(1) String:是不可变字符序列; 
(2) StringBuffer、StringBuider:是可变字符序列; 
(3) String 覆盖了 equals 方法和 hashCode 方法,而 StringBuffer 没有覆盖 equals 方法和 hashCode 方法, 所以,将 StringBuffer 对象存储进 Java 集合类中时会出现问题。 
2 StringBuffer 和 StringBuider: 
(1) StringBuffer:是 JDK1.0 版本的,线程安全,效率低; 
(2) StringBuilder:是 JDK1.5 版本的,线程不安全,效率高; 
(3) 如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了, 则用 StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最 好用 StringBuffer

6 Collection 和 Collections的区别?

答:Collection 是一个接口,它是 Set、List 等容器的父接口;Collections 是个一个工具类,提供了一系列的静态方法来辅助容器
操作,这些方法包括对容器的搜索、排序、线程安全化等等。 

7 什么是java序列化,如何实现java序列化?

1 序列化是一种处理对象流的机制,所谓对象流也就是将对象的内容进行流化(将对象转换成二进制)
2 实现序列化接口Serializable
3 反序列化是将字节序列恢复成Java对象的过程

8 HashTable和HashMap有什么区别?

1.HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口
2.主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高Hashtable
3.HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
4.最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是

9 List和Map有什么区别?

list:
- 链表
- 有序
- 继承Collection(set也是)
- 可以有重复的对象值,但是对象下标不能重复
Map:
- key-value
- 无序
- 键不能有重复的 值可以用

10 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?

接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继 承抽象类。 

11 Error和Exception 有什么区别?
1 Error表示系统级的错误和程序不必处理的异常,
2 Exception表示需要捕捉或者需要进行异常处理,是一种设计或实现问题:它表示如果程序运行异常,从不会发生的情况
12 字符流和字节流的区别

字节流:按照字节进行读写,可以读取任意数据
字符流:按照字符进行读写
字节流操作时不会被放到缓存区,而字符流在操作时使用了缓存区

线程&网络编程&and so on

1 创建多线程的方式?

1 继承Thread类,重写run方法
2 实现Runnable接口
3 使用匿名内部类的方式

2 请说出你所知道的线程同步的方法?

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

3 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

1 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 

2 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

4 简述synchronized和java.util.concurrent.locks.Lock的异同 ?

1 Lock能够完成synchronized所包含的所有功能
2 Lock 有比 synchronized 更精确的线程语义和更好的性能,synchronized会自动释放锁,而Lock一定要程序员手工释放,并且必须在finally从句中释放.

5 什么是线程池(thread pool)?

1 池化思想:
    提高服务程序 效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁
2 线程池:
    事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程的开销.

6 run()和start()区别?

启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行,这并不意味着线程就会立即运行。
run()方法是线程启动后要进行回调(callback)的方法

7 同步代码块与同步函数的区别?

(1)同步代码块:位置比较灵活,锁对象可以任意对象,但必须是同一对象。格式:synchronized(对象){// 任意对象都可以。这个对象就是锁。需要被同步的代码;} 
(2)同步函数:声明方法时加 synchronized 关键字,同步函数使用的锁是 this,静态同步函数的锁是该类的 字节码文件对象。 
(3)在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块,来确定不同的锁。 所以同步代码块相对灵活一些。    

8 获得一个类的类对象有哪些方式?

1 Class.forName(classname);用作类加载
2 对象.getClass();用于获取对象的类型
3 类名.class; 用于获取指定的类型,传参

9 如何通过反射创建对象?

1 调用无参的构造函数:使用Class类中的newInstance()方法

2 调用有参的构造函数:先获取指定的参数列表构造器,然后通过该构造函数的对象的 newInstance(实 际参数) 进行对象的初始化。

10 简述一下面向对象设计的”六原则”?

1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。

11 简述一下你了解的设计模式?

设计模式: 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式本质上就是一种固定的套路,使用在固定的场合中。
分类:
创建型模式 - 工厂方法模式、抽象工厂模式、单例设计模式。
结构型模式 - 装饰器模式、代理模式。
行为型模式 - 模板设计模式、观察者模式。

12 Java写一个单例类?

public class Singleton{
    private Singleton(){}
    private static Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
}

13 单例设计模式的应用场景?

    单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。
单例模式只允许创建一个对象,因此节省内存,加快对象访问速度
单例模式要素: 
    a.私有构造方法 
    b.私有静态引用指向自己实例 
    c.以自己实例为返回值的公有静态方法 
饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法) 
    优点 
        1.线程安全 
        2.在类加载的同时已经创建好一个静态对象,调用时反应速度快 
    缺点 
         资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 
懒汉式:单例实例在第一次被使用时构建,延迟初始化。 
应用场景:
    - 需要频繁实例化然后销毁的对象
    - 创建对象时耗时过多或者耗资源过多,但又经常用到的对象
    - 有状态的工具类对象
    - 频繁访问数据库或文件的对象
    - 网站计数器,一般是采用单例模式实现
    - 由于配置文件一般都是共享资源,即web应用的配置对象的读取,一般采用单例模式来实现。如:spring的配置文件的读取等
    - 多线程的线程池的设计一般也是采用单例模式
    - 数据库连接池的设计

14 什么是SOA,谈谈你的SOA的理解?

(1)SOA 的概念 SOA(Service-oriented archITecture,面向服务架构),而 
WebService 是实现 SOA 的其中一种方式,所以 两者并不是一个概念。 WebService 
基于 SOAP 协议的,本质就是基于 XML 的,正是因为基于 XML,所以 SOA 才能整合不
同的平台,不同的应用。 
(2)SOA 的作用: 
1 整合异构系统。准确点说,整合企业的遗留系统、正在开发的系统
和即将开发的新系统。 不同的系统可 能采用不同的平台,如操作系统的选择;不同的开
发语言;不同的系统架构。
2 及时的响应用户的业务变化。大量的 SOA 组件,通过整合
和拆散,然后打包成一个个的粒度合适的 SOA 组件,再经过流程管理工具的处理,实现
业务的不断变化。

15 TCP和UDP的区别?哪个是三次握手协议?

TCP:
全程保持连接
是一种全双工的字节流传输格式
安全性高

16 简述线程的五种状态?

1 新建
2 就绪
3  运行
4  阻塞
5  消亡

17 写出五种常见的异常

ArithmeticException 算术异常
NullPointException 空指针异常
ClassCastException  类型转换异常
NumberFormatException 数字格式异常
ArrayIndexOutOfBoundsException 数组下标越界异常

18 throw和throws的区别,处理方式?

(1)throw用于抛出异常对象,后面跟的是异常对象  ;throw用在方法体内
(2)throws用于抛出异常类,后面跟的是异常类名,可以跟多个,用逗号隔开,throws用在方法上
(3)异常处理方式:异常的捕获-try{}catch{}finally{},异常的抛出throws,自定义异常类,继承Exception
(4)什么时候定义 try,什么时候定义 throws? ①功能内部如果出现异常,如果可以处理,就用 try; ②如果内部处理不了,就必须声明出来,让调用者处理。 

数据库相关

1 Statement 和 PreparedStatement 有什么区别?哪个性能更好?

(1) PrepareStatement代表预编译语句,主要优势在于减少SQL编译错误并增加SQL语句的安全性
(2) PreparedStatement 中的SQL语句可以带参数
(3) 当批量处理SQL或频繁执行相同的代码查询时,PreparedStatement有着明显的优势,因为数据库可以将编译优化后的SQL语句缓存起来.

2 JDBC连接数据库的步骤?

1 加载驱动
Class.forName("数据库驱动"); 
2 创建连接
DriverManager.getConnection("","","");
3 创建语句
conn.Preparestament(sql);
4 执行语句
ps.executeQuery();
5 处理结果
while(rs.next){}
6 释放资源
finally{
    conn.close();
    rs.close();
}

3 数据库性能优化?

1 数据库设计
    数据库表:字段命名、字段长度、类型、注释规范
    数据库索引:外键、关联字段、查询比较高的字段
    数据库视图:相当于临时表,尽量少用
    数据库引擎:根据业务选择相应的引擎
    数据库字符:和页面字符保持一致
    数据库存储过程:尽量少用
    数据库监听器/触发器:一般用于调度任务和备份还原
2 SQL语句优化
    使用xml配置sql语句
    尽量少关联表,效率最高关联四张表
    不建议使用*号
    查询语句where后,最好使用索引字段关联
3 数据库服务器搭建(集群)
    主从配置
    读写分离
    自动化(容器)
相关标签: SE面试