1. 八种基本数据类型
基本类型 | 类型 | 大小 | 默认值 | 取值范围 | 包装类 |
---|---|---|---|---|---|
byte | 整数型 | 8bit = 1字节 | 0 | ( − 2 7 -2^7 −27)~ ( 2 7 2^7 27 -1)/-128 ~ 127 | Byte |
short | 整数型 | 16bit = 2字节 | 0 | ( − 2 1 5 -2^15 −215)~( 2 1 5 2^15 215 -1) | Short |
int | 整数型 | 32bit = 4字节 | 0 | ( − 2 3 1 -2^31 −231)~ ( 2 3 1 2^31 231 - 1) | Integer |
long | 整数型 | 64bit = 8字节 | 0 | ( − 2 6 3 -2^63 −263)~ ( 2 6 3 2^63 263 -1) | Long |
char | 字符型 | 16bit = 2字节 | (\u0000)空 | 0 ~( 2 1 6 2^16 216 -1) | Character |
float | 浮点型 | 32bit = 4字节 | 0.0 | ( − 2 3 1 -2^31 −231)~ ( 2 3 1 2^31 231 - 1) | Float |
double | 浮点型 | 64bit = 8字节 | 0.0 | ( − 2 6 3 -2^63 −263)~ ( 2 6 3 2^63 263 -1) | Double |
boolean | 布尔型 | 1字节/4字节 | false | true/false | Boolean |
布尔类型:布尔数据类型只有两个可能的值:真和假。使用此数据类型为跟踪真/假条件的简单标记。这种数据类型就表示这一点信息,但是它的“大小”并不是精确定义的。
可以看出,boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。
1.1 基本数据的包装类很多都实现了享元模式。享元模式就是运⽤共享技术有效地⽀持⼤量细粒度对象的复⽤。
IntegerCache是Ingeter的静态内部类,默认创建了[-128,127]的对象,并放到IntegerCache内部的⼀个cache数组中,在[-128,127]这个范围内的整数对象,不⽤创建。直接从IntegerCache中的cache数组中根据下标拿就可以,超出这个范围的每次去创建新的对象。其他⼏种包装类型的常量池和Integer思路都差不多,源码都很相似。
包装类缓存的范围如下:
包装类 | 缓存范围 |
---|---|
Byte | -128~127 |
Short | -128~127 |
Integer | -128~127 |
Long | -128~127 |
Character | 0~127 |
1.2 Java⼀个char类型可以存储中⽂吗?
可以,Java中使⽤了Unicode字符,固定占⽤2个字节
1.3 使用基本数据类型及其包装类的意义
(1)基本数据类型基于数值,对象类型基于引⽤。基本数据类型存储在栈的局部变量表中。⽽对象类型的变量则存储堆中引⽤,实例放在堆中,因此对象类型的变量需要占⽤更多的内存空间。显然,相对于基本类型的变量来说,对象类型的变量需要占⽤更多的内存空间。
(2)Java是⾯向对象的语⾔,很多地⽅需要使⽤的是对象⽽不是基本数据类型。例如,List,Map等容
器类中基本 数据类型是放不进去的。
(3)包装类在原先的基本数据类型上,新增加了很多⽅法,如Integer.valueOf(String s)等
1.4 ⾃动装箱与自动拆箱
(1)⾃动装箱就是Java⾃动将原始类型值转换成对应的对象,⽐如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这⾥的装箱和拆箱是⾃动进⾏的⾮⼈为转换,所以就称作为⾃动装箱和拆箱。
(2)⾃动装箱时编译器调⽤valueOf将原始类型值转换成对象,同时⾃动拆箱时,编译器通过调⽤类似intValue(),doubleValue()这类的⽅法将对象转换成原始类型值。
Integer a = 10;
Integer b = 5;
Integer c = 5;
System.out.println(a == b + c);
result:true
+操作会导致左右2边都转成基本数据类型,因为+这个操作符不适⽤于Integer对象,⾸先b和c进⾏⾃动拆箱操作,进⾏数值相加。然后Integer对象⽆法与数值进⾏直接⽐较,所以a⾃动拆箱转为int值10,最终这条语句转为数值进⾏⽐较。
2. 访问修饰符
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
一个".java"源文件中可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
3. String,StringBuffer,StringBuilder的区别
String底层为final修饰的char数组,长度不可变
StringBuffer底层char数组,但不被final修饰,所以长度可变,他的方法使用了synchronize修饰,是线程安全的。
String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals和hashCode方法,所以StringBuffer对象存储进java集合类中时会出现问题。
4. String s = new String(“xyz”);创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
5. == 和 equals()区别
比较基本数据类型,比较的是值是否相等,若值一样则返回TRUE,否则返回FALSE;
比较引用数据类型,比较的是地址是否相等,若引用的同一个对象返回TRUE,否则返回FALSE.
equals()
Object类中的equals()比较的也是地址是否相等,其他类中根据算法判定,String类中的equals()比较的是内容是否一致,内容如果一致则返回TRUE,否则返回FALSE.
6. 构造器重写和重载问题
构造器不能被重写,但可以被重载,子类可以用super()或者super(参数)来调用父类的构造方法。
7. 匿名内部类是否能被继承
能被继承
8. List,Map和Set区别
Set,List继承自Collection接口,所以他们都是单列元素集合,都可以用迭代器迭代。
Set里面不允许有重复元素,不可以使用下标,无序;
List正好与Set相反;
Collection和Map分别为两个不同的接口。
Map以键值对形式存储,为双列集合,其中用put方法添加,其中key值不可以重复,value可以重复。
9. finally里return值和catch里return值,会返回哪个?
finally里的代码是一定会被执行的,如果finally里面没有return,则返回catch里的return值,如果有则返回finally里的。
10. 重写和重载的区别
相同点:
①都要求方法名相同
②都可以操作抽象方法和非抽象方法
不同点:
①方法的重写要求参数签名必须一致,而方法的重载要求参数签名必须不一致
②方法的重写要求返回值类型必须一致,而方法的重载对此不做限制
③方法的重写对方法的访问权限和抛出的异常有特殊要求,方法的重载对此没有限制
④方法的重写只能在子类中重写一次,而方法的重载可以重载多次
11. 继承的定义
是一种连接类的层次模型,并且允许和鼓励代码的重用,他提供了一种明确的共同特征的描述方法。
关键字:extends
12. String类是否可以被继承
不可以,String是被final修饰,被final修饰的类不能被继承
13. char型变量中能否存储一个中文汉字, 为什么
能,char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字。
**14.servlet生命周期 **
Initialization 初始化
Service 服务
Distory 销毁
15. Collection 和Collections 的区别
Collection 是List和Set的顶层接口
Collections是针对集合类的一个帮助类,它提供了一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作、
16. 启动一个线程使用run() 还是用start()
start()
17. final,finally,finalize的区别
final用于声明属性,方法和类分别表示属性不可变,方法不可覆盖,类不可继承
finally是异常处理语句结构的一部分,表示总是执行
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法
18. 面向对象的特征有哪些方面
封装,继承,多态
19. HashMap,HashTable,ConcurrentHashMap的区别
对象 | key和value是否允许为空 | 是否线程安全 |
---|---|---|
HashMap | key和value都允许为null | 否 |
HashTable | key和value都不允许为null | 是 |
ConcurrentHashMap | key和value都不允许为null | 是 |
20. 5个常用的包
java.io
java.lang
java.sql
java.util
javax.net
21. sleep() 和 wait() 区别
sleep()是线程类(Thread)的方法,导致此线程暂停执行指定时间,执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep()不会释放对象锁。
wait() 是Object类的方法,对此对象调用wait()方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
22. Jsp内置对象
application:ServletContext
session:HttpSession
request:HttpServletRequest
response:HttpServletResponse
pageContext:PageContext
out:JspWriter
config:ServletConfig
page:this
Exception:Throwable
22. Error 和Exception 区别
Error:JVM系统内部错误,资源耗尽等严重情况,这些问题程序员无法处理
Exception:其他因编程错误或偶然的外在因素导致的问题,程序员主要处理这些异常(例如:类型转换问题,空指针问题,数组下标越界问题等)
23. Jsp组成
静态内容,指令,表达式,小脚本,声明,标准动作,注解
24. ArrayList和Vector区别
数据增长:Vector增长原来的一倍,ArrayList增加原来的0.5倍
同步性:Vector是线程安全的,ArrayList是线程不安全的
25. doGet 和doPost 区别
get方式将参数放在url后面,在请求行,post方式将参数放在请求的正文部分
get方式参数显示在地址栏,不安全;post方式参数地址栏不可见,相对安全
get方式地址栏参数有长度限制,post无限制
什么情况下用doGet,doPost
表单提交且method还是post时,servlet类里的方法用doPost()方法,其他的都可以用doGet()
26. Set 比较值用== 还是equals()
equals(),重写equals()方法
27. Switch可以放什么类型
在JDK1.7之前只可以放int,short,byte,long和枚举类型
在JDK1.7之后可以放String字符串类型
28. && 和& 区别
|,& 表示位运算符,针对数值进行的运算,例如3|2,78&99,其结果仍然应为数值
||,&&表示逻辑运算符,||表示或者的意思,&&表示并且的意思,其结果是逻辑值TRUE或FALSE
29. JDK 和 JRE 的区别
JDK,开发java程序用的开发包,JDK里面有java的运行环境(JRE),包括client和server端,需要配置环境变量
JRE,运行java程序的环境,JVM,JRE里面只有client运行环境,安装过程中,会自动添加PATH
30. break 和 continue 的区别
continue 结束本次循环,执行下一次循环
return结束该方法,返回值给调用者
break 结束内层循环,到外场循环去
31. Java类能不能多继承
Java类不能多继承,接口可以多继承
32. 什么是关键字,有什么特点
Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名,方法名,类名,包名和参数。
关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字
Java语言规定关键字不能作为标识符,目前共有50个Java关键字
33. 说出Object中的方法
getClass(),hashCode(),equals(),toString(),clone()
34. 抽象类和接口的区别
抽象类中除了能够些抽象方法还能写非抽象方法;而接口在JDK1.7之前只能写抽象方法
抽象类中的属性可以是常量也可以是变量;而接口中的属性都是静态的常量
抽象类中可以编写构造方法,该构造方法是给子类调用的,而接口中不能编写构造方法
抽象类中可以编写代码块,接口中不可以
抽象类只能实现单继承,没有多继承;而接口既可以单继承,也可以多继承,这样弥补了Class类的单继承的不足
35. 多线程的几种实现方式
①继承Thread类,重写run()方法
②实现Runnable接口,重写run()方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
③通过Callable和FutrueTask创建线程
36. 转发和重定向的区别
转发只有一个request,重定向有两个request
转发的地址不变,重定向的地址改变
转发仅限于项目内部,重定向可以转向任意地址
37. 序列化实现哪个接口
实现Serializable接口或Externalizable接口
38. 集合中比较要实现哪些接口
Comparator,Comparable 接口
39. throw 和 throws 关键字的区别
throw抛出的是异常对象,而throws抛出的是异常类
throw只能抛出一个异常对象,而throws可以抛出多个异常类
一般情况下throw和try{}catch(){}或throws一起使用,如果抛出的是运行时异常对象,也可以单独使用
40. Servlet的四个作用域及其作用域大小排序
Application>session>request>page
41. 包的作用
能够区分相同名字的类
有助于实施访问权限的控制
有助于划分项目模块
42. 抽象类和普通类的区别
抽象类可以写抽象方法,也可以写非抽象方法
抽象类的构造方法不是用来实例化的,而是给子类调用的
抽象类中abstract不能和static,final,private使用
43. 封装的作用
隐藏属性,提供公共的方法给调用者,并进行有效验证
提高代码的安全性,提到代码的复用性
高内聚:封装细节,便于修改内部代码,提高可维护性
低耦合:简化外部调用,便于调用者使用,便于扩展
44. Java线程具有五种基本状态
新建状态(New)
就绪状态(Runnable)
运行状态(Running)
阻塞状态(Blocked)
死亡状态(Dead)
45. 数组是不是一个对象,其大小可不可以任意改变
是个对象,不可以改变
46. ArrayList的默认大小
10
47. 怎么判断一个对象属于某个类
Instanceof
48. 作用域中设置和获取属性的方法
setAttribute()和getAttribute()
49. 多线程里什么是并行,并发
并发性:又称共行性,是指处理多个同时性活动的能力
并行:指同时发生两个并发事件,具有并发的含义,并发不一定并行,也可以说并发事件之间不一定要同一时刻发生
50. request.getAttribute()和request.getParameter()区别
request.getAttribute()是获取属性值
request.getParameter()是获得请求中值
51. GC
当对象被创建时,就会在JVM的堆区拥有一块内存空间,在JVM的声明周期中,Java程序会陆续的创建无数个对象,假如所有的对象都永久占用内存,那么内存空间有可能很快被消耗光,最后引发内存空间不足的错误,因此必须采用一种措施及时回收这些无用的对象内存,以保证内存的可重复使用,这种技术就是GC
52. JVM加载class文件的原理机制
Java语言是一种具有动态性的解释型语言,类(class)只有被加载到JVM中后才能运行,当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程是由类加载器来完成的,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中
53. 过滤器的生命周期
实例 初始 过滤 销毁
54. String里的方法
length(),item(),concat(),getBytes(),toLowerCase()
55. 页面传递对象的方法
page,application,request,session
56. 抽象方法可不可以被继承
可以
57. abstract的method是否可同时是static
不可以,静态方法不可以重写
58. 原生JDBC的连接有哪几个步骤
①class.forName()加载数据驱动
②DriverManager.getConnection()获取数据库连接对象
③根据SQL或sql会话对象,有两种方式Statement、PreparedStatement
④执行SQL处理结果集,如果有参数就设置参数
⑤关闭结果集,关闭会话,关闭资源
59. 进程和线程的区别
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位
资源分配给线程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有的局部变量和临时变量。
处理机分给线程,即真正在处理机上运行的是线程。
线程在执行过程中,需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。
60. Super用法
super:表示父类实例对象的引用
使用super.父类实例方法名();调用父类被屏蔽的方法
使用super.父类实例变量名;调用父类被屏蔽的实例变量
使用super();调用父类构造方法,默认调用父类无参数的构造方法,super()必须在构造方法体除注释以外的第一行
61. JAVA中实现多态的机制是什么
靠的是父类或借口的引用指向子类或实现类的对象
调用的方法是内存中正在运行的那个对象的方法
62. 怎么在真机和虚拟机之间切换
Ctrl+alt 和 Ctrl+G
63. 为什么Java中在重写equals()方法后必须对hashCode()方法进行重写
为了维护hashCode()方法的equals协定,该协定指出:如果根据equals()方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode方法都必须生成相同得整数结果;而两个hashCode()返回的结果相等,两个对象的equals()方法不一定相等。
HashMap对象是根据其Key的hashCode来获取对应的Value
在重写父类的equals()方法时,也重写HashCode()方法,使相等的两个对象获取的HashCode值也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。
64. 两个不等的对象有没有可能有相同得hashCode
如果两个对象的equals,Java运行时环境会认为他们的hashCode一定相等.
如果两个对象不equals,他们的hashCode有可能相等
如果两个对象hashCode相等,他们不一定equals
如果两个对象hashCode不相等,他们一定不equals
65. Java中的几种类型的流
根据流的方向分为输入流和输出流:
输入流:从指定数据源中读取数据就是输入流,输入流只能读取数据,不能写数据
输出流:从*.java程序写数据到指定数据汇中就是输出流,输出流只能写数据,不饿能读取数据
根据处理数据的不同分为字节流和字符流:
字节流:在进行读写时处理的是以字节为单位的数据就是字节流
字符流:在进行读写时处理的是以字符为单位的数据就是字符流
备注:JDK1.6字节流能够转换成字符流,但字符流不可以转换成字节流
根据处理角色不同分为节点流和处理流(包装流/过滤流)
节点流:直接和一个IO的物理节点(文件/网络资源)关联的流就是节点流
处理流:如果一个流构造方法中不是一个直接的物理节点(文件/网络资源)就是处理流
66. 同步和异步有何异同
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程
异步交互:指发送一个请求,不需要等待返回,随时可以发送下一个请求,即不需要等待。
区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。
编译时异常和运行时异常的区别
Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
2<<3
2<<3的意思是2左移3位 16
如何单例类
使用private static [final]修饰属性,用于缓存当前类的实例对象
使用private修饰所有构造方法
使用公共静态工厂方法获取当前类的实例
HTTP协议下请求和响应的格式
请求格式:
请求行
请求头
请求正文部分
响应格式:
响应状态行
响应头
响应内容
将GBK转成UTF-8
New String(string.getBytes(“UTF-8”),“GBK”)
请简述一下 Ajax 的原理及实现步骤
HTTP协议的异步通信
get 请求
创建一个XMLHttpRequest对象
调用该对象的open方法
如果是get请求,设置回调函数onreadystatechange = callback
Send
post 请求
创建一个XMLHttpRequest对象
调用该对象的open方法
调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencod
ed”);
设置回调函数onreadystatechange = callback
Send
Java中++操作线程安全吗
在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。
Java中用到线程的调度算法是什么
抢占式算法。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。
迭代器和列表迭代器的区别
在List集合有一个独特的迭代器ListIterator,它有自己的对集合操作修改的方法,可以在集合进行迭代过程中允许操作修改
同步的几种方式
同步方法,同步代码块,使用对象锁
我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。