Ⅰ.Java基础
面向对象
面向对象的四大特性:封装、继承、多态、抽象。Object类是任何类的默认父类,其包含的常用方法有getClass()、toString()、Object()、clone()、finalize()、hashCode()、equal()、wait()、notify()。
封装是决定类中信息是否公开以及公开等级,即以什么方式暴露哪些信息,从而实现对属性、数据、部分敏感内容的隐藏。故推荐在不知道给什么权限时,优先给private,对属性值的修改也是通过getter/setter方法,而非直接对public的属性进行修改和读取。接口实现体现can-do关系,interface定义接口,implements实现接口。
PS:不要在getter/setter方法里面写业务逻辑代码,会很难发现错误。
继承即某些基础模块可以直接复用、间接复用或增强复用,父类通过这种方法把能力赋予子类,即is—a关系,需要复合里氏代换原则(LSP)。由于继承的成本很低,故使用时应注意方法污染和方法爆炸。故提倡组合优先原则来拓展类的能力我,即优先采用组合或聚合类关系来复用其他类的能力。extends继承父类。
问题1:override与overload?
override即覆写,用于子类继承父类或者子类实现接口时,保持方法签名相同,但使用不同的实现方法。即垂直方向上行为的不同实现。属于多态的结果,编译期间由JVM调用合适的方法执行。
overload即重载,所实现的方法名称相同,但是参数类型和参数个数不同,即水平方向上行为的不同实现。属于确定方法调用的静态绑定。
Java中类的继承采用单继承模式。当纠结定义为接口还是抽象类时,推荐定为接口,遵循接口隔离原则,按某个维度分为多个接口,再用抽象类去实现接口。
问题2:Comparable与Comparator?
问题3:hashCode与equals?
问题4:TreeMap、HashMap与ConcurrHashMap?
类
类的访问级别由public和无访问控制符,类型分为class、interface、enum。
Java类主要由成员和方法两部分组成。
内部类
访问权限控制
this和super
类关系:
继承、实现、组合、聚合、依赖
序列化:
内存中把对象转换为二进制数据流的过程称为对象的序列化,反之为反序列化。常用的由Java原生序列化、Hessian序列化、Json序列化。
方法
方法签名:
方法签名包括方法名称和参数列表,时JVM标识方法的唯一索引,不包括返回值。即
double f(){···}和 long f(){···}方法签名一致,故不能同时存在,即不能有两个方法名称相同、参数类型、个数相同,仅返回值不同。
构造方法:
构造方法即方法名与类名一致的特殊方法,在新建对象时调用,可overload多种构造方法实现不同方式的对象初始化。构造方法特点有:
1、名字必须与类名相同。
2、无返回值,即使是void也不能有,因为返回的是对象的地址,并赋给引用变量。
3.构造方法不能被继承、不能被override、不能直接调用。调用方法有三种:直接new、子类中super父类构造方法、通过反射获得并使用。
4、没写构造方法时会默认设置无参的构造方法,一旦有了就不会帮你默认设置。
5、构造方法可以私有。
除了构造方法,类中还可以有三种方法:实例方法、静态方法、静态代码块。
重载
overload,在编译器里,把方法名称、参数类型、参数个数组成一个唯一健,即方法签名,用来找对应方法。需要注意的是在多个方法满足的情况下,有以下规则:
1.精确匹配 2.基本数据类型会自动转换成表示更大范围的基本类型int->long 3.通过自动拆箱和装箱 4.通过子类向上转型自动继承路线一次匹配 5.通过可变参数匹配。
泛型
泛型可以定义在类、接口、方法中,编译器通过识别尖括号和尖括号内的字母来解析泛型
字符串相关数据类型:String、StringBuilder、StringBuffer。
String 只读字符串、对其任何改动,都是创建一个新对象,再把引用指向该对象。赋值后会缓存,下次在赋值先在缓存池里找。
StringBuilder 非线程安全,操作效率较高
StringBuffer 线程安全。
虽然String支持直接用+拼接两对象,但在循环中,应使用StringBuilder的append,因为每一次循环String都会再创建一个StringBuilder而append则不会。
JVM
Java源代码再Java虚拟机上执行,不同公司会研发自己的定制版本,普通人用的就是JDK里面的JVM。
字节码
字节码即中间码,顾名思义,即Java和机器的中间层。Java代码经过词法、语法、语义解析后生成字节码。字节码通过类加载过程加载到JVM环境,进行执行。执行有三种模式:解释、JIT编译、JIT编译和解释混合执行,一般用第三种。
任何程序都必须加载到内存中才能与CPU交流,同样字节码.class也必须加载到内存中,才能实例化类。
ClassLoader完成这一任务,通过加载、链接、初始化三个过程。
内存布局
JVM内存布局大致分五部分;
Heap 堆区
Metaspace 元数据区
JVM Stacks 虚拟机栈
Native Method Stacks 本地方法栈
Program Counter Register 程序计数器
保证时间片轮转时的各个线程的互不影响。
垃圾回收
首先要判断是不是垃圾,于是引入GC Roots,如果一个对象和GC Roots没有直接或间接的引用关系,那么就可以回收。
垃圾回收算法:
“标记-清除算法”、“标记-整理算法”、“mark-copy算法”(“mark-copy”算法为现在主流YGC算法)
垃圾回收器:
当前实现的垃圾回收器有十几种,这里只介绍三种:Serial、CMS、GI
数据结构与集合
数据结构
各种集合
根据集合框架图可以看出集合分为两类:一类是俺单个元素存储的Collection,如List、Queue、Set;一类是按照键对值存储的Map,如Hashtable、ConcurrentHashMap、HashMap、TreeMap。
数组是一种顺序表,Java中数组用于存储同一类型的对象,且一旦分配内存后无法扩容。提倡用类型和中括号紧挨来定义数组,如:
String[] args = {"a","b"};
数组的变量优先推荐JDK5引入的foreach。
数组和集合都是用来存储对象的容器,数组方便易用,性质单元;集合 类型安全、功能强大。
集合与泛型
泛型······
extend与super
红黑树
树、二叉平衡树、二叉查找树、AVL树、红黑树.
并发与多线程
线程生命周期:新建、就绪、运行、阻塞、终止状态。
锁
计算机中锁的分类很多,这里只介绍两种Java中常用的:用并发包中的锁类、利用同步代码块。
PS:解决死锁,找到进程号,kill进程。
线程同步
ThreadLocal
Ⅱ.其他知识
Linux
Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的 Unix兼容产品。
Linux常用命令(这里太基础的就不放在表中,如ls、cd、mv、cp、rm、mkdir、wget、chmod、shutdown、vi、tar、touch,这些玩过Linux的都会)
命令 | 含义 | 命令 | 含义 |
---|---|---|---|
find | 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。 | grep | 全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 |
awk | 统计日志信息 | sed | 按行编辑文件,常用来处理配置信息 |
netstat | 控制台命令,是一个监控TCP/IP网络非常有用的工具,可以显示路由表,实际的网络连接,以及每一个网络接口设备的状态信息 | ps | 查看进程状态 |
计算机网络
1.TCP/IP
TCP/IP是一个网络传输框架,是一套协议族,其中最为核心的为TCP、IP协议。它将网络从低到高分为物理层、链路层、网络层、传输层、应用层(ISO/OSI把应用层分为了会话层、表示层、应用层,下面四层不变)。
程序发送信息时,在应用层按规定的协议(如HTTP、FTP、STMP)打包数据,随后在传输层上加上双方的端口号,在网络层加上双方的IP地址,在链路层上加上双方的MAC地址,并将数据拆分成数据帧,经过多个路由器和网管后,到达目标机器,反向操作,得到信息。以上每一层都有不同的物理装置按不同协议进行转发,拆分、组装,链路层有IEEE、PPP协议,网络层有IP、ARP协议,传输层有TCP、UDP协议。
2.IP协议
IP是面向无连接、无状态、不保证发送包到达的协议。IP规定了IP地址,用于逻辑意义上的网段划分,并确定了每一台计算机的唯一地址。虽然链路层的MAC地址已经确定了唯一计算机,但可能发个消息就往全球所有计算机广播。于是IP地址可以通过选择最佳路由,把消息送到相应子网的目标PC。
IP协议相应的知识还有TTL——生存周期,最高16,否则意味丢包、MTU——最大传输单元,因为有最大单个传输的限制,所有有相应的分片操作、ICMP——ICMP协议并不传输数据,而是用来评估网络健康状态,常用的ping、tracer都是基于ICMP的。
IP是TCP/IP的基石,几乎所有的其他协议都是建立于IP所提供的服务基础上进行传输,其中就包括了用于传输稳定有序数据的TCP。
3.TCP4次握手、3次挥手
数据库
数据库是
数据库三范式:1NF 属性不可分 ;2NF 非主键属性,完全依赖于主键属性 ;3NF 非主键属性无传递依赖。
数据库名词解释:
事务:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
视图:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。这里我们就为目录id创建了一个索引。
CREATE INDEX mytable_categoryid ON mytable (category_id);
优缺点:
建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录 。
创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度。第三,可以加速表和表之间的连接。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
因为,增加索引也有许多不利的方面。第一,创建索引和维护索引要耗费时间。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
所以我们应当在一些需要搜索的列上(如作为主键的列、经常用在连接上的列、经常需要排序上的列)创建索引;而对于查询很少或者数值很少的列则不需要加索引。需要注意的是建立太多索引会影响更新和插入的速度,因为他需要更新所有索引文件,故一般在需要时才加入索引,之前可以先用一些mysql优化方法。
索引有B+索引和hash索引,各自的区别:hash索引,等值查询效率高,不能排序,不能进行范围查询;B+索引,数据有序,范围查询。
索引底层实现用B+树而不用红黑树和B树,因为增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间 。B树,查询性能不稳定,查询结果高度不致。
索引分类:
普通索引:最基本的索引,没有任何限制
唯一索引:与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它是一种特殊的唯一索引,不允许有空值。
全文索引:针对较大的数据,生成全文索引很耗时好空间。
数据库优化方法
1.关于select * from t ,用具体的字段代替*;
2.建表时,首先考虑在where和order by 涉及的列上建立索引,尽量用varchar代替char,只包含数值的字段用数字型字段,避免使用字符型
连接池
对于高并发的后台服务器来说,频繁的创建和断开连接会降低处理问题的效率。于是我们在客户端和服务器之间事先创建若干连接,并提前放置在连接池中,需要时先从连接池直接获取,数据传输完成后,把连接归还至连接池中(类似与Cache高速缓存,都是以内存换时间的策略),从而提高速度。
连接资源在数据库端是一种非常关键且有限的资源。资源分配过多会影响数据库性能,分配过少无法完全发挥连接池优势。于是合理的创建、管理、断开连接就十分重要。然后就是阿里开源的Druid能帮你解决这方面问题,详情请见Druid
一些题目
1.关系数据库管理系统能实现的专门运算包括选择、连接和投影。
2.数据库有层次,网状,关系三种数据库模型,关系最流行。
3.在数据库系统中,通常用三级模式来描述数据库,即外模式、模式、内模式。外模式是模式的子集,是用户看到的数据视图,模式也称逻辑模式,是全体数据逻辑结构的表示,内模式是全体数据物理结构和存储数据的表示。外模式保证数据的逻辑独立性、模式保证数据的物理独立性。
Git
git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史。Git无论在本地还是远端都可以不用自己搭建服务器;每次commit之后会产生一个号,由此可以利用快照签名回溯历史版本;由于Git是分布式管理的版本控制,故我们在git上,可以很多个用户维护一个repository。
常用的Git操作有
操作 | 含义 | 操作 | 含义 |
---|---|---|---|
add | 将当前工作目录中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步。 | push | 将本地commit的代码更新到远程版本库中,例如 “git push origin”就会将本地的代码更新到名为orgin的远程版本库中 |
fetch | 从服务器的仓库中下载代码。(与服务器交互,从服务器上下载最新代码) | mv | 重命名一个文件、目录或者链接。 |
merge | 把服务器上下载下来的代码和本地代码合并。或者进行分支合并。 | tag | 创建、列出、删除或者验证一个标签对象(使用GPG签名的)。 |
chekout | git checkout feature 从当前分支hotfix 切换到分支 feature | rebase | git rebase master 将feature 分支衍合(变基)到 master 分支(不考虑文件冲突) |
Ⅲ.框架
AOP、IOC、DI、Bean的实例化、动态代理
Spring
SpringBoot
Ⅳ.完整的项目
Ⅴ.参考书目
《码出高效 Java开发手册》
Comments | NOTHING