JAVA 入门初级参考面试题

1、java中数据类型是怎么区分的?
byte 1字节 short 2字节 int 4字节 long 8字节
float 4字节 double 8字节 char 2字节 boolean 1字节
其余的都是对象类型

2、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

3、说说&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式

4、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。JDK1.7之后,String可以放入swith的()中

5、Integer与int的区别
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况

6、heap和stack有什么区别
java的内存分为两类,一类是栈内存,一类是堆内存。栈中主要存放一些基本类型的变量和对象句柄。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。"

7、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

8、如何理解面向对象三性质
封装性:
封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。
继承性
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
多态性
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定

9、Override和Overload的区别。
覆盖(Overriding)
子类对父类的方法进行重新编写。
如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写 (Overriding)。
如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
子类函数的访问修饰权限不能低于父类的,返回值类型可以是父类方法的返回值类型的子类,
重载(Overloading) 让类以统一的方式处理不同数据类型的手段。
一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。

10、请说出作用域public,private,protected,以及不写时的区别
如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×

11、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承具体类。抽象类中可以有静态的main方法。
只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

12、abstract class和interface有什么区别?
含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
1.抽象类可以有构造方法,接口中不能有构造方法。
3.抽象类中可以包含不是抽象的普通方法,接口中的所有方法必须都是抽象的
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
7. 一个类可以实现多个接口,但只能继承一个抽象类。

13、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的

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

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

16、final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

17、Java中的异常处理机制的简单原理和应用。
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,
Throwable下面又派生了两个子类:Error和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,
其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);
普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try…catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked(检查)异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try…catch处理或用throws声明,所以系统异常也称为unchecked(未检查)异常。

18、请写出你最常见到的5个 exception
它们都是RuntimeException的子类,在jdk doc中查RuntimeException类,就可以看到其所有的子类列表,也就是看到了所有的系统异常。
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
java.sql.SQLException - SQL语句执行异常。
IndexOutOfBoundsException - 下标越界异常
java.lang.ClassNotFoundExceptio – 类找不到异常(路径不对)

19、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws是声明方法可能抛出异常,throw是抛出异常,try是将会发生异常的语句括起来,从而进行异常的处理,catch是如果有异常就会执行他里面的语句,而finally不论是否有异常都会进行执行的语句。
可以

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

21、垃圾回收的优点和原理 。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

22、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

23、java中会存在内存泄漏吗,请简单描述。
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命对象已经不再需要,但是因为长生命对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。

24、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有length()这个方法。

25、Collection框架的结构
Collection 是单列集合
List 元素是有序的、可重复
List接口中常用类 Vector:线程安全,但速度慢,已被ArrayList替代。底层数据结构是数组结构 ArrayList:线程不安全,查询速度快 底层数据结构是数组构 LinkedList:线程不安全。增删速度快 底层数据结构是列表结构 Set(集) 元素无序的、不可重复 取出元素的方法只有迭代器。不可以存放重复元素,元素存取是无序的。 Set接口中常用的类 HashSet:线程不安全,存取速度快 它是如何保证元素唯一性的呢?依赖的是元素的和euqals方法。 TreeSet:线程不安全,可以对Set集合中的元素进行排序。 Map 没有继承collection接口 它是一个双列集合 Hashtable:线程安全,速度快。底层是哈希表数据结构。是同步的。不允许null作为键,null作为值。 Properties:用于配置文件的定义和操作,使用频率非常高,同时键和值都是字符串。是集合中可以和IO技术相结合的对象 HashMap:线程不安全,速度慢。底层也是哈希表数据结构。是不同步的。允许null作为键,null作为值。替代了Hashtable. LinkedHashMap: 可以保证HashMap集合有序。存入的顺序和取出的顺序一致。 TreeMap:可以用来对Map集合中的键进行排序
26、Collection 和 Collections的区别 Collection是集合类的上级接口,子接口主要有Set 和List、Map。 Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
27、ArrayList和Vector的区别 考了线程不安全和安全
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。
(2)数据增长:
Vector可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
Vector增长原来的一倍,ArrayList增加原来的0.5倍。

28、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
29、去掉一个ArrayList集合中重复的元素
HashSet set = new HashSet(list);

30、HashMap和Hashtable的区别
一.历史原因:Hashtable是基于陈旧的Dictionary(词典)类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

31、List 和 Map 区别?
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

32、List、Map、Set三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序Map保存key-value值value可多值。
首先,List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象, List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合,还可以获得所有的value的结合,还可以获得key和value组合成的Map.Entry对象的集合。

33、你所知道的集合类都有哪些主要方法?
set,大概的方法是add,remove, contains;对于map,大概的方法就是put,remove,contains等, List类会有get(int index)这样的方法,因为它可以按顺序取元素,而set类中没有get(int index)这样的方法。List和set都可以迭代出所有元素,迭代时先要得到一个iterator对象,所以,set和list类都有一个iterator方法,用于返回那个iterator对象。map可以返回三个集合,一个是返回所有的key的集合,另外一个返回的是所有value的集合,再一个返回的key和value组合成的EntrySet对象的集合,map也有get方法,参数是key,返回值是key对应的value。

34、"= =“和equals方法究竟有什么区别
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)
= =操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用”= =“操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用”= ="操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String(“foo”); String b=new String(“foo”);
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

35、String s = “Hello”;s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
没有。因为String被设计成不可变类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 “Hello”,然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer 它是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
注意:不能通过付值符号对他进行付值.
sb = “welcome to here!”;//错误
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中付值的时候可以通过它的append方法. sb.append(“hello”);
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += “here”;
以上处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

36、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。
StringBuffer sbf = new StringBuffer();
for(int i=0;i<100;i++)
{
sbf.append(i);
}
上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。
String str = new String();
for(int i=0;i<100;i++)
{
str = str + i;
String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

37、StringBuffer与StringBuilder的区别
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

38、如何把一段逗号分割的字符串转换成一个数组?
String str=”abc,def,zxc”; String[] ss=str.split(“,”);

39、反射机制的作用
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

40、能不能自己写个类,也叫java.lang.String?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。

41、JDBC中的PreparedStatement相比Statement的好处
java.sql包中的PreparedStatement 接口继承了Statement,
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理
4.传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。可以防止sql注入漏洞

42、Class.forName的作用?为什么要用?
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创建该类的实例对象了。
new 和Class.forName()有什么区别?首先,newInstance( )是一个方法,而new是一个关键字; 其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制。 简言之:newInstance(): 弱类型,低效率,只能调用无参构造。new: 强类型,相对高效,能调用任何public构造。Class.forName(“”)返回的是类。Class.forName(“”).newInstance()返回的是object

43、什么是spring
Spring是一个轻量级的容器 是实现IoC(控制反转)和非侵入式(不需要强制实现)的框架。
提供AOP(面向切面变成)概念的实现方式 提供对持久层事务的支持。
Spring提供MVC Web框架的实现,并对一些常用的企业服务API提供一致的模型封装。
Spring提供了对现存的各种框架(Struts、JSF、Hibernate、Ibatis、Webwork,Mybatis等)相整合的方案。
Spring是一个全方位的应用程序框架
Spring的作用:降低组件之间的耦合度,实现软件各层之间的解耦.
Spring的核心: IOC : 控制反转 AOP:面向切面的编程

44、什么是IOC
控制反转(Inversion of control)应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。
这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
IOC也是一种编程思想,用于实现模块之间的解耦,在Spring中它的作用是对对象的创建,维护和销毁等生命周期的控制。IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转 spring中避免了关键字new造成的耦合问题 spring是一个大的工厂类,spring的特点就是基于配置,在其配置文件中通过元素来创建实例对象。

45、什么是DI
Dependency Injection (DI) 依赖注入 在运行期,由外部容器动态的将依赖对象注入到组件内部中。.
根据业务逻辑来看,对象经常不是独立的,一个对象的创建往往涉及另一个对象的创建,当然这个对象也要由IOC容器负责,负责的方式就是依赖注入DI,通过反射机制实现。有三种注入方式:(1)接口注入(2)构造器注入(3)Setter方法注入。

46、DI有几种方式

47、Spring的作用域有哪些
spring管理的bean默认是单例模式
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例(controller也是单例
prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理

=下面是在web项目下才用到的=
request:每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听
session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使Spring时,该作用域才有效
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

48、Bean是啥
1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;
3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;
4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean
二、注解分为两类:
1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;
2、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

49、常用的spring注解
声明bean的注解(前四)
@Service 在业务逻辑层使用(service层)
@Autowired:装配依赖对象
@Value 为属性注入值(属性上)
@Aspect 声明一个切面(类上)
@ResponseBody:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用
@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Controller在展现层使用 控制器的声明(C)@Controller只是定义了一个控制器类而使用@RequestMapping注解的方法才是真正处理请求的处理器

50、例模式与原型模式的区别
单例模式:
1 从spring的开始的时候创建对象,到spring结束的时候对象消失
2 从spring的开始到结束只创建一个对象,无论调用多少次都是这一个,不会再增加,只要一次更改,哪怕之后再调用对象,得到的也是更改之后的
3 系统默认的是单例模式,不用单独说明
原型模式:
1 只要getbean的时候,就会创建一个对象,在spring开始的时候不会创建对象
2 只要创建对象,所得到的属性就会是最初始的状态,其他的不会发生改变
3 如果想转变为原型模式,必须填写@Scope value="prototype"这样的方式产生
51、常用的预编译类型及与Java类型的对应
Java Mysql
java.sql.Date-------Date
Double-----------Number
String------------VARCHAR (CHAR)
byte -------------TINYINT
short ------------SMALLINT
int ---------------INTEGER
long--------------BIGINT
double -----------FLOAT(DOUBLE)

52、SQL关键字执行顺序
(8)SELECT (9)DISTINCT < select distinct a from b>
(1)FROM
(3)JOIN
(2)ON
(4)WHERE
(5)GROUP BY
(6)AVG,SUM…
(7)HAVING
(10)ORDER BY
(11)LIMIT
每步关键字执行的结果都会形成一个虚表,编号大的关键字执行的动作都是在编号小的关键字执行结果所得的虚表上进行以此类推

53、说明SQL中的where子语句有哪些用法
= 等于
<> 不等于 还有 !=
*> 大于
< 小于
*>= 大于等于
<= 小于等于
like搜索like(%参数%)
范围判定 in not in between 1 and 3 (在多少于多少之间)
多个条件 and or

54、什么是JDBC?JDBC的执行步骤是什么?
java官方提供连接数据库持久化操作的API是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问方式,它由一组用Java语言编写的类和接口组成。
1.加载驱动 2.获得连接 3.创建声明 (statement)4.执行操作 5.遍历结果集 6.关闭结果集 7.关闭声明 8.关闭连接

56、JDBC中怎么获取结果集元数据?
//处理结果集
ResultSet rs = pstate.executeQuery();
//获取元数据
ResultSetMetaData mdata = rs.getMetaData();

57、JDBC中怎么关闭事务自动提交?
conn.setAutoCommit(false);

58、JDBC 主要的作用有哪些
连接数据库 持久化操作 结果集封装

59、什么是Mybatis
对JDBC进行了封装,对数据库进行持久化操作的一个半ORM(对象关系映射)持久层框架.

60、Mybatis与jdbc有哪些区别
都是做持久化操作的,Mybatis是jdbc的封装
1、Mybatis使用连接池的技术连接数据库,更好的优化了资源
2、Mybatis在持久化操作的时候,sql是独立成一个配置文件,解耦便于维护
3、Mybatis引用了动态sql技术使对数据库的操作更加灵活
4、Mybatis内部封装好结果集处理,可以按照需求找到想要的结果
总结:在开发的时候Mybatis比jdbc效率更高

61、映射文件中resultMap节点是做什么用的,有哪些属性?
resultMap为结果集的映射
作用:将查询的结果集与实体类做对应
属性有2个:type指明了对应的实体类,id是当前作用域内唯一标识

62、resultMap与resultType的区别
ResultMap: 结果集映射,将结果集绑定在实体类上,通过resultMap节点来实现
ResultType:结果集类型,设置结果集的类型,将结果集绑定在指定的类型上 :语句返回值类型或别名。注意,如果是集合,那么这里填写的是集合的泛型,而不是集合本身
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性

63、mybaits的sql映射文件中,#{}和${}的区别
#{} 是预编译的写法可防止sql注入问题
${} 是字符串拼接,相当于字符常量而没有预编译能力,不防sql注入

64、Mybatis中 ResultMap的子节点有哪些?子节点有哪些属性?
Id :唯一标识,此 id 值用于 select 元素 resultMap 属性的引用
Result(结果) : 标识简单的属性也可以是非唯一主键的id
property(属性) : 表示查询出来的字段对应的值赋给实体对象的哪个属性。
Column(列) :指向数据库的表字段
type 属性: 表示该 resultMap 的映射结果类型()

65、 Mybatis配置文件中的映射声明是做什么用的?
将映射文件导入到配置文件中,加载的时候只需要加载配置文件,相当于把 映射文件也加载进去 把每一个持久化节点,封装到一个MappedStatement对象中

66、 MappedStatement对象里包含哪些信息
包含持久化节点上的所有属性和sql语句 配置文件和映射文件的全部信息

67、 Mybatis的工作流程是什么
先读取核心配置文件,里面有mybatis的运行环境,然后再根据核心配置文件中配置的映射文件路径去加载映射文件,映射文件中写了写相关的SQL语句,再创建sqlsessionfactory工厂,再从工厂中拿到sqlsession,sqlsession中有所有的SQL方法,所以用sqlsession对SQL方法进行调用去执行相应的SQL语句,在我们的实际应用过程中是通过Mapper接口的代理对象去调用mapper接口中的方法,每个方法名与相应的映射文件中的id相同 得到结果后,将结果传递到resultMap中,转为Type类型后,传递到测试的属性名位置.

68、说说Mybatis中常用的动态SQL语句?
(1): 用于条件查询的where (标签返回的内容是以 AND 或 OR 开头的,则它会剔除掉)
(2): 用于判断的if (通过判断参数值来决定是否使用某个条件)
(3): 用于修改的set (没有使用 if 标签时,如果有一个参数为 null,都会导致错误。当在 update 语句中使用 if 标签时,如果最后的 if 没有执行,则或导致逗号多余错误。使用 set 标签可以将动态的配置 set关键字,和剔除追加到条件末尾的任何不相关的逗号)
(4) : <trim prefix="(" suffix=")" prefixOverrides=“AND | OR” suffixOverrides=",">
prefix 添加前缀 suffix 添加后缀 prefixOverrides 去掉前缀(忽略前缀) suffixOverrides 去掉后缀
(5)< foreach >: foreach 标签主要用于构建 in 条件,可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中

<select id="selectIn" resultMap="BaseResultMap">
    select name,hobby from student where id in
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

collection:collection 属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。
item :表示在迭代过程中每一个元素的别名
index :表示在迭代过程中每次迭代到的位置(下标or索引)
open :添加前缀
close :添加后缀
separator :分隔符,表示迭代时每个元素之间以什么分隔
(6): 有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis 提供了 choose(选择) 元素,按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when
的条件都不满则时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise(否则) 则为 default(默认)。 if 是与(and)的关系,而 choose 是或(or)的关系。

<choose>
    <when test="Name!=null and student!='' ">
        AND name LIKE CONCAT(CONCAT('%', #{student}),'%')
    </when>
    <when test="hobby!= null and hobby!= '' ">
        AND hobby = #{hobby}
    </when>
    <otherwise>
        AND AGE = 15
    </otherwise>
</choose>

※在Mybatis中如果SQL中有特殊符号,比如 < > 等,则需要用一个特殊标签来把SQL包起来<![CDATA[ SQL语句 ]]>

69、Mybatis中,如果要让一个mapper接口和一个映射文件绑定,需要如何配置?
把mapper接口的全路径,写到SQL映射文件中的namespace中.

70、Mybatis中,使用mapper接口实现持久化有几种方式?
有两种方式,一种是声明式 , 一种是注解式
声明式, 就是把SQL语句写到SQL映射文件中
注解式, 就是把SQL语句写到接口中方法上的注解里

71、 mapper接口中的方法入参如果有两个以上的参数,如何接值?
a) 用索引的方式来接值, #{0}表示参数中的第1个参数,#{1}表示参数中的第2个参数,依次类推 ( 常用 )
b) 用参数序号的方式接值,#{param1}表示入参的第1个参数, #{param2}表示入参的第2个参数, 依次类推
c) 给入参的参数用注解设置一个名字,@Param(“名字”)String title.

72、input的type类型都有哪些选择
button按钮 radio单选框 checkbox复选框 file文件上传 text文本
hidden隐藏字段 password密码 reset重置 submit提交 <标签Img>

73、HTML标题标签有几个 怎么用
标签 描述

-

定义 HTML 标题 h1是定义最大的标签元素,h6定义最小的标签元素

74、显示图片用哪个标签,用什么属性引入图片路径?

<img>  src属性	<img src="../img/logo.png"/>

75、怎么给标签添加样式,有几种方法
1)style属性 2)样式绑定方式 3)外部css文件
2,用style定界符在外部绑定
3,引入外部的css文件进行绑定(标签名为link)

76、给网页设置一个标题,在哪个标签里填写内容
head 中的 title ,超链接用哪个属性设置请求路径.给标签设置背景色用哪个样式background-color

77、servlet的生命周期是什么?
Tomcat --> .java --> .class --> java虚拟机 --> init --> service --> destroy
jsp就是一个servlet
转换 Jsp源文件转换成servlet源文件
编译 Java文件编译成类(class)文件
装载 将类文件加载到内存中
创建 创建一个servlet类的实例对象
初始化 调用servlet的init()方法进行初始
服务 调用servlet的service()方法来处理客户端的请求。
销毁 调用servlet的destroy()方法终止(结束)。(dei si chuai)
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的

在服务器刚启动的时候,servlet实例化对象立刻执行Init方法初始化,在请求的时候调用service方法,服务器关闭的时候调用destroy方法销毁

78、servlet运行中doGet方法和doPost区别
get方式传递的数据量小,安全性不高,执行效率高,适合用于搜索等机密性不高的数据,post方式传递的数据量大,安全性高,执行效率低,适合用于账号密码,修改删除添加信息的传递。
get方式:表单数据存放在URL地址后面,所有get方式提交时HTTP中没有消息体 
post方式:表单数据存放在HTTP协议的消息体中以实体的方式传送到服务器。
编码转换在request请求里面,get方法得到的内容每一个都要进行编码转换,需要配置tomcat编码设置,而post方法则只要设置request.setCharacterEncoding(“UTF-8”)就可以。

79、什么是jsp?
Java语言在服务器端动态生成页面的技术为jsp
JSP就是简化servlet(jsp转换成servlet才能起作用)
Jsp页面要先转化成servlet类,再编译执行
servlet一般作为控制层出现,主要工作为接调存转,jsp一般作为视图层出现,主要解决了信息的展示和信息的收集

80、jsp的9个内置对象分别是什么?分别有什么用?
page 指向页面自身的方式
request jsp的作用域,代表一次请求
response 与request相对应,代表请求的响应
session jsp的作用域,代表一次会话
out 喷页面(输出流的对象)
application jsp的作用域,代表上下文
config 设置,提供一些配置文件(ken fei ge)
pageContext 可以得到其他8个对象,页面的上下文(等同于Objest一样的地位,其他8个的始祖

81、jsp的三个指令分别是什么?分别有什么用?
伪指令用来传送JSP容器中的一种信息,通常写在<%@…%>之间
page指令:定义当前页面的属性(定义网页依赖属性,比如脚本语言、error页面、缓存需求等等)
如:<%@page language=“java” import=“java.util.*” pageEncoding=“utf-8”%>
include指令:向当前文件插入一个静态文件的内容
如:<%@include file="…/…/…/common/include.jsp"%> 这里的 …/ 使用的是相对路径
taglib指令:引入定制的标签库
如:<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>码的转换

82、tomcat里哪个目录用来部署项目?
Webapps | work用来装jsp编译后的java文件和class文件
bin\startup.bat 是windows下启动tomcat的文件
在conf文件夹下的server.xml中修改端口号port=“8080”

83、session的默认过期时间是多少?怎么修改?
30分钟 会话的超时间隔可以在web.xml文件中设置

30以分钟为单位

84、servlet中的作用域的区别
request 一次请求,当一次请求遇到response的时候就结束了
session 一次会话,客户端与服务器建立连接的时候session就开始,当客户端结束服务器的连接或是过长时间没有会话的时候结束。一般应用在存储登录人信息
servletContext 上下文,从服务器启动的时候开启,到服务器关闭的时候结束,一般应用在记录在线人数

85、springMVC如何实现接传值?
1 调用ModelMap的put方法,把数据传给页面
2 调用ModelAndView的addObject方法,把数据传给页面
3 调用传统的request.setAttribute()方法, 把数据传给页面

86、springMVC如何实现转页?
内部转: return一个字符串 加上 视图解析的前缀和后缀 组成完成的页面路径
重定向: return 一个字符串 先写”redirect:” 加上 请求路径.(rui 的 te)

87、@RequestMapping注解的作用?
给控制层设置一个请求名 放在类上是做类的请求,放在方法是做方法的请求
@Controller 把下面的类交给spring管理,并且把这个类注册为控制层
@Scope 设置作用域
@Service 注册一个模型层
@Autowired 依赖注入

88、springMVC与spring的区别?
springMVC是基于spring来实现的一种MVC框架,spring主要负责解耦,
springMVC主要负责web环境下的传接值、转向,是两类不同的框架。

89、Query怎么获取input标签的value属性?
$().val()

90、jquery ajax的预期返回类型有哪些
text 字符串
json json格式
xml 可拓展标记语言
html 超文本标记语言

91、 SpringMVC中怎么把AJAX需要的值返回给页面?
在方法上加入注解@ResponseBody,用return把需要的值传给页面

猜你喜欢

转载自blog.csdn.net/weixin_44905070/article/details/104745235
今日推荐