JAVA
一、java基础
1.JDK 和 JRE 有什么区别?
JDK:JAVA开发工具包,提供了java的开发环境和运行环境。
JRE:java运行环境,为java运行提供了所需环境。
JDK包括JRE.
2.== 和 equals 的区别是什么?
- ==:基本数据类型比较的是值;引用数据类型比较的是引用是否相同。
- equals:实际上就是==,但是String和Integer重写了其方法,把引用比较变成了值比较。
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,但是并不能确定键值对是否相等。
4.final 在 java 中有什么作用?
- 修饰变量叫常量,该常量必须初始化,初始化后值不能修改。
- 修饰的类,不能继承
- 修饰的方法,不能重写
5.java 中的 Math.round(-1.5) 等于多少?
round:四舍五入,负数的.5要舍去,正数的.5要加上。
6. String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
7. java 中操作字符串都有哪些类?它们之间有什么区别?
- String:字符串常量,不可变对象
- StringBuffer:字符串变量,在原有对象基础进行操作,线程安全,适用于多线程,效率较低。
- StringBuilder:字符串变量,在原有对象的基础进行操作,线程不安全,适用于单线程,效率较高。
8. String str="i"与 String str=new String("i")一样吗?
不一样,第一个是将其放入常量池中,第二个会将其放入堆内存中,相当于新建了一个对象。
9. 如何将字符串反转?
使用StringBuffer和StringBuilder的reverse()方法。
例如:
|
StringBuffer strbuffer = new StringBuffer(); strbuffer.append(“abbbb”); strbuffer.reverse(); StringBuilder用法相同 |
10. String 类的常用方法都有那些?
(1)indexOf():返回指定字符的索引。
-
- int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。
- int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
- int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引。
- int lastIndexOf(String str, int startIndex) :从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字符串的索引。
(2)charAt(int index):返回指定索引处的字符。0~length-1
(3)replace(目标字符串, 替换后的字符串):字符串替换。
(4)trim():去除字符串两端空白。
(5)split():分割字符串,返回一个分割后的字符串数组。
- 要是符号作为分隔条件,必须进行转义加上\\。
- 如果有多个分隔符,则可以用|作为连字符。
(6)getBytes():返回字符串的 byte 类型数组。
- str.getBytes(),获取当前文件的编码格式
- new String(str.getBytes(“uft-8”),”gbk”),转换字符串编码格式。
- str.getBytes(“charset”)将底层的Unicode转换为charset编码格式的字符串数组。
(7)length():返回字符串长度。
(8)toLowerCase(String str):将字符串转成小写字母。
(9)toUpperCase(String str):将字符串转成大写字符。
(10)substring():截取字符串。
substring(str,start,length)
substring(str,length)
(11)equals():字符串比较。
11.抽象类必须要有抽象方法吗?
不需要
12.普通类和抽象类有哪些区别?
- 抽象类可包含抽象方法,普通类不能包含抽象方法;
- 抽象类不能直接实例化,普通类可以直接实例化;
13.抽象类能使用 final 修饰吗?
不能,因为定义抽象类就是为了让类继承的,所以不能用final修饰。
14.接口和抽象类有什么区别?
- 实现:抽象类由子类使用extends继承,接口必须使用implements实现。
- main:抽象类可以有main函数,可以运行,但是接口不能有。
- 构造函数:抽象类有构造函数,接口没有。
- 实现数量:可以实现多个接口,但是只能继承一个抽象类。
- 访问修饰符:接口只能使用public,抽象类可以使用任意修饰符。
15.java 中 IO 流分为几种?
功能:输入流、输出流
类型:字节流、字符流
InputStream/OutStream:字节输入/输出流
InputReader/OutWriter:字符输入/输出流
区别:字节流按8位传输以字节为单位输出数据,字符流按16位传输以字符为单位输出数据。
16. Files的常用方法都有哪些?
-
- Files.exists():检测文件路径是否存在。
- Files.createFile():创建文件。
- Files.createDirectory():创建文件夹。
- Files.delete():删除一个文件或目录。
- Files.copy():复制文件。
- Files.move():移动文件。
- Files.size():查看文件个数。
- Files.read():读取文件。
- Files.write():写入文件。
二、容器
1.Collection 和 Collections 有什么区别?
Collection :java.lang.Collection :是个集合接口,提供了对集合对象进行基本操作的通用接口方法。
Collections:集合类的一个工具类/帮助类,其中的一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
2.List、Set、Map 之间的区别是什么?
|
比较 |
List |
Set |
Map |
|
继承接口 |
Collection |
Collection |
|
|
常见实现类 |
AbstractList(常见子类ArrayList/LinkedList/Vector) |
AbstracSet(常见子类HashSet/LinkedHashSet/TreeSet) |
HashMap/HashTable |
|
常见方法 |
add(),remove(),clear(),get(),contains(),size() |
add(),remove(),clear(),contains(),size() |
put(),get(),remove(),clear(),containsKey(),containsValue(),keySet(),values(),size() |
|
元素 |
可重复 |
不可重复 |
键不可重复,值可以重复 |
|
顺序 |
有序 |
无序 |
|
|
线程安全 |
vector线程安全 |
|
HashTable线程安全 |
3.ArrayList 和 LinkedList 的区别是什么?
ArrayList :底层的数据结构为数组,支持随机访问
LinkedList:底层数据结构为双向循环链表,不支持随机访问
4.如何实现数组和 List 之间的转换?
- 数组转list:arr.asList();[ArrayList中]
- list转数组:list.toArray();[Arrays]
5.Array 和 ArrayList 有何区别?
- Array可以容纳基本数据类型和对象,ArrayList只能存储对象。
- Array是指定大小的,而ArrayList的大小是固定的。
- Array没有那么多功能,比如addAll/removeAll/iterator.
6.poll()和 remove()有什么区别?
poll和remove都是从队列中取出一个元素,但是poll获取失败的时候会返回null,remove则会抛出异常。
7.迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
8.Iterator 怎么使用?有什么特点?
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
9. Iterator 和 ListIterator 有什么区别?
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
三、多线程
1.线程和进程的区别?
进程:程序运行和资源分配的基本单位;
线程:CPU调度和分派的基本单位;
进程包括多个线程。
2.守护线程是什么?
即服务其它线程。
3.创建线程的几种方式
- 继承Thread类
- 实现Runnable接口
- 通过callable和future创建
四、其他
1.session和cookie的区别?
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,session相对较安全。
- session会占用你服务器的性能,cookie能减轻服务器性能方面。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
- session当刷新浏览器的时候就会消失,而cookie不会。
2.后端流程
前端发出请求-->controller接收请求-->service实现业务逻辑-->dao层实现对数据库的操作-->返回到前台
解释:
请求发过来会被前端控制器获取,前端控制器然后将url发给处理器映射器,处理器映射器解析url,将controller名字放进集合中返回给前端控制器,前端控制器在将这个装有controller名字的集合给处理器适配器,处理器适配器再去匹配controller层中的@RequeatMapper(value=“这个名字”)中的名字,找到对应方法,然后controller层中的方法执行了,去调用service层,service层调用dao层,dao层将结果给service层,service层将结果给controller层,controller层将结果给处理器适配器,处理器适配最后将结果给前端控制器,前端控制器将结果给试图解析器进行解析,解析完将结果返回给前端控制器,前端控制器再讲结果给试图渲染,变成一个完整页面后,将结果返回给前端控制器,前端控制器将页面返回给前端呈现。
[email protected]和@RequestMapping
@ResponseBody注解(应用于controller)。
将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端。假如是字符串则直接将字符串写到客户端,假如是一个对象,此时会将对象转化为json串然后写到客户端。这里需要注意的是,如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页面可能出现乱码。
@RequestMapping
作用:处理请求映射,用于类或方法上, 用于类时,表示类中的所有响应请求的方法都是以该地址作为父路径。
4.HTML布局方式
- 浮动布局:兼容性比较好,但是页面宽度不够会影响布局。
- 绝对定位布局:快捷,有效性比较差
- flex布局:自适应好,高度能够自动撑开
- table-cell表格布局:兼容性好,但是不能固定高度,会被内容撑高
- 网格布局:兼容性不太好
4.ajax的同步和异步
同步是在一条直线上的队列,异步不在一个队列上 各走各的。
async:false,这个属性 ,默认是true:异步,false:同步。
1.同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
另一种解释:
当执行当前AJAX的时候会停止执行后面的JS代码,直到AJAX执行完毕后时,才能继续执行后面的JS代码。
2.异步:请求通过事件触发->服务器处理(这时浏览器仍然可以作其他事情)->处理完毕同步需要等待返回结果才能继续,异步不必等待,一般需要监听异步的结果。
另一种解释:
当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行success,也就是说这时候执行的是两个线程,ajax块发出请求后一个线程 和ajax块后面的脚本(另一个线程)。
- java的引用类型
Byte、Short、Integer、Long、Float、Double、Character、Boolean
- 时间复杂度
时间复杂度是指执行算法所需要的计算工作量。
- Integer和int的转换
- int到Integer:
int a=3;
Integer A=new Integer(a);
或:
Integer A=Integer.valueOf(a);
- Integer到int:
Integer A=new Integer(5);
int a=A.intValue();
- 数组和链表的优缺点?
数组:
|
优点 |
缺点 |
|
随机访问性强 |
插入和删除效率低 |
|
查找速度快 |
浪费内存 |
|
内存空间要求高,必须有足够的连续内存空间。 |
|
|
大小固定,不能动态拓展 |
链表:
|
优点 |
缺点 |
|
插入删除速度快 |
不能随机查找,必须从第一个开始遍历,查找效率低 |
|
内存利用率高,不会浪费内存 |
|
|
大小没有固定,拓展很灵活 |
- static的作用
- 被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来。
- 被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来。
- 静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次,只在初始化类的时候执行。静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问。
- 什么是注解?注解的作用?
它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少xml配置。
- jsp和servlet的区别
- jsp编译过后成为servlet
- jsp用于页面显示,servlet用于逻辑控制
- servlet没有内置对象,jsp中的内置对象通过HttpServletRequest和HttpServletResponse获取。
- 设计模式
工厂模式、单例模式、代理模式、外观模式。组合模式。
- SSM的流程
- 加载配置文件applicationContext.xml。
- 调用getBean方法,获取配置文件中的bean
- 调用service层的方法
- mybatis的应用
与数据库进行交互,将数据持久化到关系型数据库中。封装了jdbc简化了数据库的连接。
- java如何实现序列化?作用?
实现serializable接口。
作用:实现对象的持久化。
- HashMap和HashTable的区别?
|
|
HashMap |
HashTable |
|
继承父类不同 |
AbstractMap<k,v> |
Dictionary<k,v> |
|
安全性不同 |
线程不安全 |
线程安全 |
|
初始容量和扩容量不同 |
初始:16,扩容为原来2倍 |
初始:11,扩容为原来的2n+1 |
堆和栈的区别?
(1)栈内存存储的是局部变量,而堆内存存储的是实体(new出的对象和数组)。
(2)栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短。
(3)栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。