一、JAVA基础语言:
1、集合/容器部分:
1、Collection 增加、遍历、删除:
public interface Collection<E> extends Iterable<E>
2、List:
public interface List<E> extends Collection<E>
3、LinkedList——List——Collection:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
4、ArrayList——List——Collection:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
5、Set:
public interface Set<E> extends Collection<E>
6、LinkedHashSet——HashSet——Set——Collection:
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
public abstract class AbstractCollection<E> implements Collection<E> {
7、TreeSet——SortedSet——Set:
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
public interface NavigableSet<E> extends SortedSet<E> {
public interface SortedSet<E> extends Set<E> {
8、Map:
9、HashMap——Map:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
10、TreeMap——SortedMap——Map:
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
11、ArrayList和Vector的区别?
答:这两个类都实现了List接口(List接口继承了Collection接口),他们都是 有序集合,即存储
在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以 按位
置索引号取出某个元素,,并且其中的数据是 允许重复的,这是HashSet之类的集合的最大
不同处, HashSet之类的集合不可以按索引号去检索其中的元素, 也不允许有重复的元素(
本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对
比方式,更有利于说明问题)。
接着才说ArrayList与Vector的区别,这主要包括两个方面: .
(1)同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序
不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使
用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最
好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、 Hashtable&HashMap,要记住线程安全的问题,记住Vector
与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的, ArrayList与HashMap是
java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。
(2)数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了
容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加
一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程
序效率之间要取得一定的平衡。 Vector默认增长为原来两倍,而ArrayList的增长策略在文
档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。 ArrayList与Vector都可以设
置初始的空间大小, Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空
间的方法。
总结:即Vector增长原来的一倍, ArrayList增加原来的0.5倍。
12、 HashMap和Hashtable的区别?
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
一.历史原因:
Hashtable是基于陈旧的Dictionary类的, HashMap是Java1.2引进的Map接口的一个实现
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:
只有HashMap可以让你将空值作为一个表的条目的key或value
13、 List 和 Map 区别?
一个是存储单列数据的集合, 另一个是存储键和值这样的双列数据的集合, List中存储的数据是有顺序,并且允许重复; M ap中存储的数据是没有顺序的,其键是不能重复的,它
的值是可以有重复的。
14、 List、 Map、 Set三个接口,存取元素时,各有什么特点?
set:
Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象
Set集合的add方法有一个boolean的返回值,当集合含有与某个,元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。
Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
List:
add(Obj e)方法时,先来后到的顺序排序。
也可以插队,即调用add(int index,Obje)方法。
一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象。
List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
map:
put(obj key,objvalue),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等.
取则可以根据key获得相应的value,即get(Object key)返回值为key所对应的value。另外,也可以获得所有的key的结合,还可以获得所有的value的结合,还可以获得key和value组合成的Map.Entry对象的集合。
总结:List 以特定次序来持有元素,可有重复元素。 Set 无法拥有重复元素,内部排序。 Map保存key-value值, value可多值。
15、说出ArrayList,Vector, LinkedList的存储性能和特性?
说出ArrayList,Vector, LinkedList的存储性能和特性ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差。
LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
LinkedList也是线程不安全的, LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
16、String StringBuffer StringBuilder
String:线程不安全—每次新建一个对象—频繁拼接不建议用
StringBuffer:线程安全—每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象——频繁操作字符串可考虑使用
StringBuilder:线程不安全—与StringBuilder方法差不多——但是效率高
2、线程部分:
2、1程序——进程——多任务——线程——并发——并行:
2、2线程生命周期:
新建(new)—就绪(start())—运行(执行run)—阻塞(sleep()\yield()\wait()\join())—消亡(正常结束\故障\异常)
2、3调度及优先级:
调度分类:
分时模型:分一个时间片给你
抢占模型:高优先级执行(java支持的)
优先级:1——10 10级 普通优先级是5
2、4实现方式:
1、继承Thread 2、实现Runnable接口 3、线程池创建
4、如何选取:
当你继承了一个类了,那只能用实现接口或则是线程池这种了嘛。
2、4并发/同步控制:
1、synchronized(对像){临界代码块} 共享变量是私有静态变量。
2、public synchronized int fun1(){方法块}
3、一个对象的互斥锁在某一时刻只能被一个线程拥有,但一个线程同一时刻可以拥有多个对象的互斥锁,拥有一个对象的互斥锁后才可以调用互斥方法。
2、4通信:
基本方法:
1、wait()
2、notify \notifyAll()
详见:点击打开链接
3、JVM部分(GC、类加载机制、内存):
3、1GC:
3、2类加载机制:
3、3内存:点击打开链接
3、4执行:就是一个虚拟的计算机、处于JDK最底层,将.java文件执行以后的二进制文件.class文件翻译成具体平台的机器码去执行,实现了”一次编译到处运行的关键异步“。
详见:点击打开链接
4、NIO/IO模式:
5、接口抽象类:
1、构造方法:抽象可以有、接口不可以有
2、成员方法:
抽象类:可以有abstract的,也可以有一般的普通成员变量。
接口:只能是public abstract 的。
3、成员变量:
抽象类:private public protected 缺省都行 final static 任意。
接口:只能是public static final 。
4、单继承多实现:一个类已经继承了一个类,那只能拿接口来实现一下了。
6、设计模式:
二、数据库:
三、算法数据结构P272:
1、时间复杂度:
2、链表、增、删、查、改:
3、栈和队列:
5、堆:
6、串:
7、树遍历与二叉树性质、森林转化、哈夫曼树、哈夫曼编码:
8、图广度优先、深度优先、最小生成树(Kruskal、Prim):
9、查找:顺序查找、有序查找、分块查找
10、二叉排序树:插入、删除
11、B树插入、删除:
12、哈希表:哈希函数、各种方法
13、直接排序:直接插入排序、折半插入、表插入、希尔排序、
14、交换排序:冒泡排序、快速排序
15、选择排序:简单选择排序、树形选择排序、堆排
16、归并排序:
17、基数排序:多关键字排序、链式基数
四、J2EE:
1、jsp
1、1内置对象有哪些?
1、1、1 request:
request.getParameter();获取参数
requet.getMethod():客户提交方式
request.getProtocol();使用的协议
request.getRequestURL():请求字符串客户端的地址
request.getRemoteAddr():客户端IP
request.getServerName():服务器主机名
request.getServerPort();服务器端口
request.getRemotoHost();客户端主机名
request.getHeader("host");获取协议定义头信息host
request.getHeader("user-agent");获取定义头信息user-agent
1、1、2 response
<%response.setHeader("refresh","10");%>自动刷新
<%response.setHeader("refresh","10;URL=index.jsp")%>页面跳转
<%response.sendRedirect("login.jsp")%>地址会变
1、1、3 out
1、1、4 session
1、生命周期:同一个浏览器各页面的跳转,服务器为每一个session对象其实是给了一个ID,且唯一,关闭浏览器就结束。
2、方法:get/setAttribute()/removeAttribute()/getCreateTime()/setMaxInactionInterval()/invalidate()
3、应用:传数据的时候使用
4、session ID唯一的保证:客户访问服务器上的JSP页面时,JSP容器会自动创建一个session对象,并为其分配一个唯一的ID,然后JSP容器还会将此ID传到客户端中保存下来,具体保存在cookie中。
5、JSP运行原理:JSP为每个客户启动一个线程,即JSP容器为每个线程分配不同的session对象,当客户同一WEB应用的其他页面,或则是从该服务器转到其他服务器在回来的时候,不会重建Session,直到客户关闭浏览器,服务器上的session才被撤销。
1、1、5 application
1、生命周期:一个WEB应用一个application,服务器关闭,application被销毁。
2、方法:
3、应用:存一些全局信息,一个网页被访问多少次
4、servletContext对象提供的服务:
1、1、6 page
1、1、7 pageContext
1、1、8 config
1、1、9 exception
1、2JSP执行过程:
1)首先,客户端发出请求(request ),请求访问JSP网页2)接着,JSP Container将要访问的.JSP文件 转译成Servlet的源代码(.java文件)
3)然后,将产生的Servlet的源代码(.java文件)经过编译,生成.class文件,并加载到内存执行
4)最后把结果响应(response )给客户端
执行JSP网页文件时,需要经过两个时期:转译时期(TranslationTime)和请求时期(RequestTime)。
转译时期:JSP转译成Servlet类(.class文件)。
请求时期:Servlet类(.class文件)执行后,响应结果至客户端。
转译期间主要做了两件事情:
(1)将JSP网页转译为Servlet源代码(.java),此段称为转译时期(Translation time);
(2)将Servlet源代码(.java)编译成Servlet类(.class),此阶段称为编译时期(Compilation time)。
其实,JSP就是一个Servlet。
1、3JSP的运行原理
(1)WEB容器JSP页面的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
(2)每个JSP页面在第一次被访问时,JSP引擎先将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
(3)Tomcat 5把为JSP页面创建的Servlet源文件和class类文件放置在“apache-tomcat-5.5.26\work\Catalina\localhost\<应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp(即:apache-tomcat-5.5.26\work\Catalina\localhost\org\apache\jsp\文件下)
1、4JSP标签:
<jsp:include>先编译在插入
<%@ include file="url"%>先插入在编译
<jsp:forward page="url">:重定向到另一页面,地址栏是当前的,内容是另一个页面的。
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
1、5JSP乱码
访问参数乱码:
<%String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")%>
表单提交信息乱码:
<%request.setCharacterEncoding("UTF-8")%>
2、servlet
2、1、生命周期(执行过程)?
详见:点击打开链接
3、struct
五、SSM
详见:点击打开链接
六、SSH
详见:点击打开链接
MH对比
详见:点击打开链接
七、项目:
1、电子文件安全管理系统
2、基于微信小程序的教学辅助软件
3、基于j2ee的互联网金融平台开发
八、概率统计:
1、期望
2、概率
九、计算机组成原理
十、操作系统
十一、计算机网络
1、两个模型对应的协议及作用
OSI:
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
2、分层优点:
2、1将复杂的网络划分为更容易管理的层。
2、2较低层为较高层提供服务。
2、3更容易讨论学习每层具体的协议。
2、4层间有标准接口方便工程模块化。
2、5各层更好的互连。
2、6降低了复杂度,程序容易修改,开发产平更快。
3、三次握手/四次挥手:
更多详见点击打开链接
十二、个人发展潜力部分
1、阅读源码:
1、1String 的 equals:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
1、先判断是不是自己本身 2、再用instanceof判断对象是不是String类型的 3、然后比两个串的长度 4、值转成数组遍历一次判断每个字符是不是相同。
1、2 Thread/ Runnable的源码:
Runable:
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
Thread:实现了Runnalbe
2、维护博客
2、1 目前多是偏java语言基础\设计模式\框架