1.Java有哪些基本数据类型,String是不是基本数据类型,他们有什么区别?
整数类型(byte1,short2,int4,long8)
数值型 浮点类型(float4,double8)
基本数据类型 字符型 (char2)
布尔型 (boolean)1 字节 储存true/false
数据类型
类
引用数据类型 接口
数组
自动转换类型
char
|
byte---short---int----long
|强制转换|
float---double
注意:强制转换会损失精度
*****两个数值进行比较:
如果两个数其中一个为double类型,另一个自动转化为double
否则,两个数其中一个为float类型,另一个自动转化为float
否则,如果一个是long类型,另一个自动转化为long
否则都转化为int比较
string是一个类,不是基本数据类型。
装箱--->基本数据类型转为对应包装数据类型的过程
拆箱--->包装数据类型转为对应基本数据类型的过程
list里面的是对象 eg: list.add(123);
2.如何获得年月日,小时分秒?
Date date=new Date();
date.getYear();
date.getDay();
date.getMonth();
date.getHours();
date.getMinutes();
date.getSeconds();
如何获取从1970年到现在的毫秒数?
long now=date.getTime();
如何获取某个日期是当月的最后一天?如何格式化日期?
DateFormate df=DateFormate.getInstance();
df.Format(date);
3.数组和集合的区别?
1、数组声明了它容纳的元素的类型,而集合不声明。因为集合是以Object形式来存储元素
2、数组具有固定的大小,不能伸缩,集合则需要动态的改变大小。
3、数组是一个可读可写的数据结构,而集合可以是readonly
4.xml文件的操作?
SAX:基于事件流的解析
当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。
优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。
缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;
无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
DOM:基于XML文档树结构的解析
解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。
优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
5.Java的特性?
1、继承--允许和鼓励方法的重用
a:子类只能继承父类所有非私有的成员(继承后直接调用)
b:子类不能继承父类的构造方法,但是通过super(马上讲)关键字去访问父类构造方法。自己是自己的构造方法,给自己初始化值的.
c:不要为了部分功能而去继承
如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
2、封装---隐藏对象的属性和实现细节,仅对外提供公共访问方式。
1、好处:提高代码的复用性和安全性
2、原则:隐藏属性,提供公共方法进行访问
3、常用private修饰成员变量和方法,提供get和set方法访问
3、多态--允许不同类的对象对同一消息做出响应
4、抽象--只关注与当前目标有关的部分,过程抽象和数据抽象
6.StringBuffer和String的区别?
String和StringBuffer都是用来存储和操作字符串,String是存储不可改变的字符串,而字符串可以改变
7.谈谈final,finally,finalize的区别?
final是用于声明属性,方法和类,分别表示属性不可更改,方法不能重写,类不可继承。
finally是异常处理中的方法,总是执行
finalize是垃圾收集器中的方法
8.Overload和 Override的区别。
override(重写)
1)方法名、参数、返回值相同。
2)子类方法不能缩小父类方法的访问权限。
3)子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4)存在于父类和子类之间。
5)方法被定义为final不能被重写。
overload(重载)
1)参数类型、个数、顺序至少有一个不相同。
2)不能重载只有返回值不同的方法名。
3)存在于父类和子类、同类中。
9.是否可以继承 String类?
String类是final类故不可以继承
10.ArrayList和 Vector的区别,HashMap和 Hashtable的区别。
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以 便增加和插入元素,
它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动 等内存操作,所以索引数据快而插入数据慢,
Vector由于使用了synchronized方法(线程 安全),通常性能上较ArrayList差。
HashMap 是Hashtable的轻量级实现(非线程安全的实现),他们都完成了 Map 接 口,
主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高 于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
因为 contains 方法容易让人引起误解。
Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,
在多个线程 访问Hashtable时,不需要自己为它的方法实现同步,
而 HashMap 就必须为之提供外同步
11、statement 和 preparestatement区别
1)创建时的区别:
Statement stm=con.createStatement();
PreparedStatement pstm=con.prepareStatement(sql);
执行的时候:
stm.execute(sql);
pstm.execute();
2)pstm一旦绑定了SQL,此pstm就不能执行其他的Sql,即只能执行一条SQL命令。
stm可以执行多条SQL命令。
3)对于执行同构的sql(只有值不同,其他结构都相同),用pstm的执行效率比较的 高,
对于异构的SQL语句,Statement的执行效率要高。
4)当需要外部变量的时候,pstm的执行效率更高.
12、Java有没有 goto?
java中的保留字,现在没有在java中使用
13.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
round表示四舍五入,算法是将原来的数加上0.5向下取整
所以前者为12,后者为-11.
14.是否可以从一个静态方法内部发出对非静态方法的调用?
不可以,调用非静态方法时,必须创建一个对象才可以,当静态方法调用非静态方法,而它的对象实例是谁呢,说不通。
所以静态方法无法从内部对非静态方法调用
15.什么是AOP?
所谓AOP,即面向切面编程
什么是切面?贯穿到系统的各个模块的一个功能就是一个切面。比如:日志,事务等
什么是面向切面编程?把功能模块当做一个对象作为切面嵌入到原来的系统模块中。
16.构造器能否被重写?
构造器不能被继承,所以不能被重写,但可以被重载
17.什么是GC?为什么要有GC?
GC:垃圾收集器,Java程序员再也不用担心内存的问题了。
18.error和exception有什么区别?
error和exception都是throwable的子类
error:恢复不是不可能,但很困难的一种情况,如内存溢出
exception:只要程序运行正常,就不会出现这种情况。
19.equals与==的区别?
1、基本数据类型的比较
== 比值 equals 不存在
2.包装数据类型
包装类跟基本数据类型相比较 自动拆箱integer会转化成int进行比较 equals 拆箱比值
两个包装类 == 比较的是对象的引用 equals 比较的是对象的内容
3.string
== 常量池中比较 比值
常量池跟堆中 比引用
堆中比较 比引用
equals 比值
4.自定义对象
== 比较引用
equals 不重写equals 跟==一样
重写 比内容
20.静态成员和实例成员的实例化过程?
静态成员:默认初始化、声明初始化,静态块
实例成员:默认初始化、声明初始化,构造器,初始化块
21.访问修饰符
private 自己包中
public 任何
protected 子类可以
默认
22.Java方法传参?
如果分不清,请画图理解,从堆栈常量池中进行判断
23.抽象类和接口的区别?
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实 现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个 实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
22.集合相关?
Arraylist//数组形式存储,无序,默认长度为10,增长长度为0.5倍,读取效率高,增删效率低
Linkedlist//双向链表形式,读取效率低,增删效率高
List Vector//数组形式 线程安全 读取,增改效率都低,增长长度为1倍
collection
Set HashSet//不能重复,数组形式
Map HashMap//允许null值键(null键只允许一个) 键值对方式
HashTable//不允许null值键,线程安全
23.异常处理?
一般异常 :Java编译时会提示你抛出异常处理。
运行时异常:是程序员的程序问题,可以修改的
24.线程模式?
懒汉模式
单例(私有化构造器) 饿汉模式
优化懒汉模式
实现多线程的方法有哪些?
继承thread类
实现Runable接口
25.排序算法
冒泡排序:两两比较,选择最小的放在前面,依次排序
for(int i=0;i<a.length-1;i++){//外层循环控制趟数
for(int j=0;j<a.length-1-i;j++){//内层循环控制每趟比较次数
if(a[j]>a[j+1]){//满足条件交换
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
选择排序:选择最小的跟第一个比较,然后交换
for(int i=0;i<a.length-1;i++){//外层循环控制趟数
int minIndex=i;//假设最小值为i
for(int j=i+1;j<a.length;j++){//找出最小的数
if(a[j]<a[minIndex]){
minIndex=j;
}
}
//交换
int temp=a[i];
a[i]=a[minIndex];
a[minIndex]=temp;
}
插入排序:先判断要不要插入,然后设置插入位置,然后比较,交换
for(int i=1;i<a.length;i++){
if(a[i]<a[i-1]){
int pos=i;
for(int j=0;j<a.length;j++){
if(a[j]>a[i]){
pos=j;
break;
}
}
}
int temp=a[i];
for(int k=i-1;k>=pos;k--){
a[k+1]=a[k];
}
a[pos]=temp;
}
26.web服务器跟应用服务器的区别?
Web服务器只负责处理HTTP协议,只能发送静态页面的内容。
而JSP,ASP,PHP等动态内容需要通过CGI、FastCGI、ISAPI等接口交给其他程序去处理。这个其他程序就是应用服务器。
web服务器
Apache--apache软件基金会,
IIs(Internet Information Services)--微软,
Nginx--Igor Sysoev(俄)
应用服务器
Tomcat--apache软件基金会,
WebLogic--ORACLE(BEA),
Websphare--IBM,
Jboss--开源社区,
GlassFish--ORACLE(SUN)
27.servlet的生命周期?
web容器实例化servlet,生命周期开始
调用init()方法,初始化
调用service()方法,根据不同的请求,调用不同的doxxx方法
调用destroy()方法销毁
28.转发(forword)和重定向(redirect)的区别?
转发是服务器请求URL,把请求URL的响应发送给浏览器显示,浏览器根本不知道URL是什么,地址栏地址不会改变。
重定向是浏览器请求URL,服务器发送给浏览器一个状态码,浏览器去请求URL,所以地址栏会发生改变。
29.post和get的区别?
1.get是从服务器上获取数据,post是向服务器传送数据。
2.get请求的数据会暴露在地址栏中,post不会。
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。
3.get请求传输参数长度受到url长度的限制(特定的浏览器和服务器会限制整个url长度,不仅仅是参数数据长度),post不受限。
get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
4.post安全性高于get。get执行效率却比post方法好
5.处理乱码
post:在请求对象中加入:request.setCharacterEncoding("UTF-8")
get:
第一步:String s=java.net.URLEncoder.encode("传递的中文","UTF-8")定义一个String类型s来存放对中文编码的结果;
第二步:<a href="url?name=<%java.net.URLEncoder.encode(s,"UTF-8")%>"></a>传递时二次编码;
第三步:String name=java.net.URLDecoder.decode(request.getparameter("s"),"UTF-8") 对接收数据进行解码。
30.Cookie和Session的区别?工作原理?
相同点:cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
不同点:
cookie数据保存在客户端,session数据保存在服务器端。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
单个cookie在客户端的限制是3K。
工作原理:
session:当有session启动时,服务器生成一个唯一值,称为sessionID,然后服务器开辟一块内存,对应于sessionID
然后服务器把sessionID写入浏览器的cookice,服务器内有一进程,监视所有session的活动状况,如果有session超时或者是主动关闭,服务器就释放该内存块。当浏览器连入服务器时并请求用到session时,服务器就读浏览器cookie中的sessionID,然后检查是否有效,如果有效,则读出内存中的值,如果无效,就建立新的session
cookie:当服务器端需要保持会话数据的时候,服务器利用响应头,向客户端浏览器发送addCookie,客户端浏览器就会在 其内存创建cookie对象保存数据,在当前会话中,所有的请求,都会携带其内存中的cookie一并请求服务器,服务器可 以解析请求获取cookie得到数据。从而完成整个会话过程中数据保持。
31.servlet是线程安全的吗?如何开发一个线程安全的servlet?
不安全
尽可能使用局部变量
对于共享的资源使用同步块
不要在servlet中添加自己的线程完成某个功能
使用同步的集合类
对外部对象进行修改时一定要加锁
32.jsp的执行过程?
1、客户端发送请求
2、web容器将jsp转化成servlet代码
3、然后将servlet进行编译,然后执行
4、最后响应至客户端浏览器
33.jsp的内置对象的功能?
1、page
2、pagecontext
3、config
4、out
5、request
6、response
7、session
8、application
9、exception
34.jsp的动作有哪些?
1、jsp:include
2、jsp:useBean
3、jsp:setproperty
4、jsp:getproperty
5、jsp:forword
6、jsp:plugin
35.int i=4;
int j=(i++)+(i++)+(++i)=4++ + 5++ +7++ =16
所以i=7;
36.thread类的方法为run(),start(),getPriority()
注意exit()是系统类方法system.exit();
37.exception类继承自throwable
38.关系型数据库:oracle,MySQL,access,db2
非关系型数据库:redis
39.jsp中的隐式注解<%-- 注解 --%>
40. 数据库三范式?
1、字段具有原子性,不可再分
2、非主属性完全依赖主属性
3、属性不依赖于其他非主属性
41.oracle安装后默认的三种用户?
sys:超级管理员,权限最高,它的角色是DBA。可以进行任何操作,创建表,视图等基本操作以及数据库的备份和恢复。
system:系统管理员,权限很高,不能进行备份和恢复及数据库的升级。
scott:普通用户。
42.登录系统用户跟切换账户?
系统用户:sqlplus /as sysdba
切换普通用户:conn user/password
43.throw和throws的区别?
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
44.怎么获取servletContext设置的参数值?
context.getInitParameter();
45.JVM内存的分布情况?
程序计数器(Program Counter Register):
字节码解释器就是通过改变计数器的值来选取下一条执行的字节码指令,分支、循环、跳转、异常处理、线程恢复都需要这玩意来实现的,
因为处理器在一个确定是时刻只会执行一个线程中的指令,线程切换后,是通过计数器来记录执行痕迹的,因而可以看出,程序计数器是每个线程私有的。
如果执行的是java方法,那么记录的是正在执行的虚拟机字节码指令的地址的地址,如果是native方法,计数器的值为空(undefined)。
程序计数器是不会发生内存溢出现象(OutOfMemory)的
Java栈(VM Stack)
本地方法栈(Native Method Stack)
方法区(Method Area):被线程共享的区域,在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。常量池,用来存储编译期间生成的字面量和符号引用。
堆(Heap):Java中的堆是用来存储对象本身的以及数组,被线程共享的区域