请问一下,在实际工作中,哪些java知识点是经常用到的,我在培训班里学java4个月.感觉时间有点紧,要全部记下来不大可能了
入门的话,推荐熟悉以下这些基础
Java总结
1. Finally,final,finalize
Finally:
释放资源(内存之外的,打开的文件、连接、屏幕上的图形,,)
1).总会执行
2).非后台线程结束,后台线程被强关,不会执行finally
3).当try和catch中有return时,finally在return之后执行,但是返回值不会改变(finally中不会改变已保存的返回结果)
4).finally中最好不要包含return,否则程序会从finally中退出,返回值不是try或catch中保存的返回值。
final:
基本数据类型:不可更改
类:不可继承
对象:引用不可变,对象内容可变
finalze:
回收前调用,不适合用来清理或释放资源。对象免死最后机会!保证会被调用,但不保证会执行完(在低优先级线程中执行)
2. 数据在各个网络层之间是怎么传输的?
数据在各层之间的单位都是不一样的,
在物理层数据的单位称为比特(bit);在数据链路层,数据的单位称为帧(frame);
在网络层,数据的单位称为数据包(packet);传输层,数据的单位称为数据段(segment)。
3. Hashtable、HashMap
Hashtable 与 HashMap类似,但是主要有7点不同。
HashTable的方法是同步的,HashMap未经同步,如Vector和ArrayList一样。
HashTable不允许null,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许 key值只能由一个null
HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
遍历的时候,HashTable使用Enumeration,HashMap使用Iterator。
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
哈希值的使用不同,HashTable直接使用对象的hashCode。
Hashtable继承自Dictionary类,实现了Map接口。而HashMap是继承自AbstractMap,实现了Map接口。
HashMap:
一个数组,hash(h)决定位置,
冲突使用链表法:单向–Entry对象(保存final key,value,next指针,hash值),遍历比较hash值
Collections.synchronizedMap(hashmap)来构造一个线程安全的map,与Hashtable几乎一样
扩容:先插入再判断是否扩容
Hashtable: 直接使用对象hash值,对跟线程安全相关的方法和步骤加Syncrolized
LinkedHashMap:
继承HashMap, 重写Entry类,before,after两个指针,保存插入顺序或者访问顺序(可指定)
HashSet:
持有一个HashMap
ConcurrentHashMap:
两个数组Segment[] 和HashEntry[]
Segment: extends ReentrantLock, 一种可重入锁,持有一个数组HashEntry[],可以通过concurrencylevel指定Segment数组长度
HashEntry: hash,key,value,next
读不需要锁,读到空时加锁重读
扩容:支队某个Segment的HashEntry[]扩容,先判断是否扩容再插入
size():先尝试两次锁,判断modCount是否变化再决定是否加锁。
CopyOnWriteArrayList: 适合多读少写,只保证最终一致性,不保证实时一致性
加锁–>拷贝数据–>改、写–>赋值回去–>解锁
用的ReentrantLock,读无需锁,可能读到旧数据。
TreeMap:红黑树,可自定义顺序
TessSet:TreeMap
4. GET,POST区别?
基础知识: Http的请求格式如下。
主要包含三个信息:
1、请求的类型(GET或POST),2、要访问的资源(如res\img\a.jif),3、Http版本(http/1.1)
用来说明服务器要使用的附加信息
这是Http的规定,必须空一行
[] 请求的内容数据
区别:
1、Get是从服务器端获取数据,Post则是向服务器端发送数据。
2、在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。
3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。
4、Get方式提交的数据最多1024字节,而Post则没有限制。
5、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。
5. 网游服务器用TCP还是UDP
UDP:多用,一个socket,加自己的可靠协议,延迟要求高
TCP:承载链接数多,500以上有压力,魔兽世界用TCP,1000延迟照样玩
HTTP/HTTPS:由客户端间歇性的发起无状态的查询,并且偶尔发生延迟是可以容忍
6. 关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,现在内存中的存储状态,几个对象,几个属性,几个方法。
由于JAVA中new出来的对象都是放在堆中,所以如果要实例化100次,将在堆中产生100个对象,
一般对象与其中的属性、方法都属于一个整体,但如果 属性和方法是静态的,就是用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。
7. 红黑树的好处、AVL 树
红黑树性质:
根节点是黑色的;
非黑即红;
叶节点(空节点)是黑色的;
父节点是红色的,则其孩子节点必须是黑色的;
从某一个节点到叶节点的所有路径,其黑色节点数目相同。
红黑树好处:
红黑树是许多“平衡的”查找树中的一种,它能保证在最坏情况 下,基本的动态集合操作时间为 O(lgn)。
红黑树并不追求完全平衡,它只要求部分的达到平衡要求,降低 了对旋转的要求,从而提高了性能。由于它的设计,任何不平衡都会在三次旋转之内解决。
红黑树的算法时间复杂度和 AVL相同, 但统计性能比 AVL 树更高。
AVL 树明显比红黑树逻辑简单的多,但应用得少,应该是增删性能 差一点,增删时需要旋转的次数可能比较多。
8. 数组和链表,遍历效率哪个高,为什么(cpu缓存与内存)
数组的效率高,因为数组是连续存储的,即内存地址是连续的,所以在读取数组时,会将连续的内存地址的数据放入缓存中,所以读取数组时相当于是从缓存读取。而链表遍历都是从内存读取,缓存的读取速度要比内存块 100 倍左右。
9. 进程间通信, 怎么共享内存
匿名管道:单向,只能用于具有亲缘关系的进程间通信,如父 子进程、兄弟进程等,缓冲区大小有限制。
命名管道:单向,可以用在任意的两个不同的进程间通信。
信号量:主要用于同步。
共享内存:最快的 IPC 机制,一般和信号量一起使用。一个进程创建,其他进程通过映射的形式,将共享内存加入到自己的内存空间中。数据结构:shmid_ds,函数 shmget:可以创建或 打开一块共享内存。
消息队列:是消息的链接表,有足够权限的进程可以向队列中 添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了管道只能承载无格式字节流以及缓冲区大小受 限等缺点。
Socket:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
10. Fork 进程时,继承那些:
继承:进程的资格、堆栈、环境、内存、打开文件的描述符、执行时关闭标志、信号控制设定、nice 值、进程调度类别、进程 组号、当前工作目录、根目录、资源限制、控制终端。
独有:进程号、不同的父进程号、自己的文件描述符和目 录流的拷贝、子进程不继承父进程的进程,正文,数据和其他锁定内存、在 tms 结构中的系统时间、资源使用设定为 0、阻塞信号集初始化为空集、不继承由 timer_create 函数创建的计时器、不继承异步输入和输出。
11. 1000 个超大的文件,可能每一个都超过内存,怎么对他们进 行排序和消除冲项,1 个超大怎么排序和消除重项。
读文件,计算hash(%10000),分成更小的文件,重复项肯定在一个文件里,归并的时候去重
12. 2 个数组,一个超大数组(10w 记录),一个小一点,几千条, 问怎么找交集。两个数组元素无重复
bitmap:bit数组,已bit代表一个数,1表示有,遍历大数组构造bit数组;遍历小数组,看对应位置是否为1
13. StackOverFlow和OutOfMemory分别在什么情况下出现
StackOverFlow:一般情况下stack的默认值为128k~256k, -Xss1024m
请求栈深度大于允许最大深度,如:深度循环递归
OutOfMemory:
多线程环境下,能够创建的线程最大内存=物理内存-最大堆内存-最大方法区内存,java虚拟机栈就会因为内存太小无法创建线程而产生OutOfMemoryError
大的对象或数组,堆地方不够用
运行时常量池(方法区)因无法再添加常量而产生OutOfMemoryError
直接内存用光,堆与直接内存>物理内存
虚拟机栈动态扩展时无法获得足够内存
14. java虚拟机模型
虚拟机栈: 方法内存模型,一个方法一个栈帧,包括:局部变量表,操作数栈,动态链接,方法出口,请求栈深度大于允许报StackOverFlow,动态扩展无法申请足够内存,包OOM。-xss设栈容量默认256k?
局部变量表: 所属对象引用,方法参数,局部变量(基本类型,引用)
本地方法栈:与虚拟机栈相识,面向本地native方法,hotspot中与虚拟机栈合二为一
堆: 对象实例,数组,类加载完成便可确定对象大小,OOM
方法区: 也有人叫永久代(Permanent Generation)类信息,常量,静态变量等在加载完成后放入方法区,即时编译器编译后的代码。
运行常量池:class文件中的常量池,编译生成的字面量,符号引用(new对象时:先检查此类的符号引用是否加载、解析、初始化过,若否,先加载);动态性:String.intern
15. 虚拟机垃圾回收
可达性分析: 从GCroots向下搜索,判断是否有引用可达。
GCroots:
虚拟机栈(本地变量表)中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象
强引用:永远不会回收被引用的对象。
软引用SoftRef:有用但非必需的对象,发生内存溢出异常前将对象列进回收范围中进行第二次回收,如果此次回收还没有足够内存才会抛异常
弱引用WeakRef:非必需对象,只能生存到下一次垃圾回收之前,无论内存是否够,都会回收
虚引用PhantomRef:完全不对生存时间构成影响,也无法通过虚引用来取得一个对象实例
标记整理算法: 所有存活的对象都向一端移动,然后清理边界以外的内存
分代收集:当前多采用,
复制算法:老年代做担保,新生代分三块一个Eden80% 两个survivor都是10%
java堆分成:新生代Eden,老年代(Survivor,两个 from to)
新生代:复制算法,
老年代:存活率高,适合标记清理或整理。
Serial: 复制算法 单线程 client模式默认新生代收集器,stop the world,简单高效
ParNew: Serial的多线程版本,其他都 server模式首选,只有它能跟CMS搭配
Parallel Scavenge: 关注吞吐量(cpu执行用户)
并行: 多个收集线程同时收集
并发:收集线程和用户线程同时,不一定并行可能交替
方法区(hotspot的永久代) 也可以回收
废弃常量的回收
类的回收: 无对象,classloader已回收,该类对应的class文件没有被引用,且不可通过反射获取该方法
16. TTL:
Time To Live,指定IP包被路由器丢弃之前允许通过的最大网段数量。《TCP/IP详解卷I》路由器会丢弃ttl为0或1的数据包
17. string类 能否继承?如果写一个类 不能被继承 final外 还有什么方法
不能,因为是final的。
还可以把构造函数私有化,单例模式
18. 链表的倒转,不倒转可以递归
19. session和cookie的区别:
session放在服务器,cookie放在客户端
session不区分路径,在同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。也就是说,同一个用户的cookie,他换了浏览器,就访问不到之前的那个不同牌子的浏览器的cookie了。
session中保存的是对象,cookie中保存的是字符串。
由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择【经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段】。
20. 单例模式线程安全
静态变量new 对象,类加载时即生成,
加锁:双重检测加锁 不能达到真正的线程安全,1.5之前主要是JIT编译器执行顺序问题.1.6之后可能是指令重排(volatile可解决?)
使用私有的静态类来实现:
public class Singleton{
private static class SingletonHolder { //私有静态类
public final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
枚举单例
21. 序列化接口
对象持久化,transient:修饰变量,不序列化
22. 删除无头链表的某节点(编程之美3.4)
将下一节点数据复制到该节点,删除下一节点而非该节点
23. JAVA多态
动态绑定(后期绑定,运行时绑定,前期是编译时绑定)
指向之类对象的指针,调用子类对象的方法(如果已重写父类方法,否则默认调父类方法)
进阶的话,可以参考下下面这些,希望能有所帮助
一、基础篇
1.1 JVM
1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收
http://www.jcp.org/en/jsr/detail?id=133
http://ifeve.com/jmm-faq/
1.1.2. 了解JVM各种参数及调优
1.1.3. 学习使用Java工具
jps, jstack, jmap, jconsole, jinfo, jhat, javap, …
http://kenai.com/projects/btrace
http://www.crashub.org/
https://github.com/taobao/TProfiler
https://github.com/CSUG/HouseMD
http://wiki.cyclopsgroup.org/jmxterm
https://github.com/jlusdy/TBJMap
1.1.4. 学习Java诊断工具
http://www.eclipse.org/mat/
http://visualvm.java.net/oqlhelp.html
1.1.5. 自己编写各种outofmemory,stackoverflow程序
HeapOutOfMemory
Young OutOfMemory
MethodArea OutOfMemory
ConstantPool OutOfMemory
DirectMemory OutOfMemory
Stack OutOfMemory
Stack OverFlow
1.1.6. 使用工具尝试解决以下问题,并写下总结
当一个Java程序响应很慢时如何查找问题
当一个Java程序频繁FullGC时如何解决问题,如何查看垃圾回收日志
当一个Java应用发生OutOfMemory时该如何解决,年轻代、年老代、永久代解决办法不同,导致原因也不同
1.1.7. 参考资料
http://docs.oracle.com/javase/specs/jvms/se7/html/
http://www.cs.umd.edu/~pugh/java/memoryModel/
http://gee.cs.oswego.edu/dl/jmm/cookbook.html
1.2. Java基础知识
1.2.1. 阅读源代码
java.lang.String
java.lang.Integer
java.lang.Long
java.lang.Enum
java.math.BigDecimal
java.lang.ThreadLocal
java.lang.ClassLoader & java.net.URLClassLoader
java.util.ArrayList & java.util.LinkedList
java.util.HashMap & java.util.LinkedHashMap & java.util.TreeMap
java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet
1.2.2. 熟悉Java中各种变量类型
1.2.3. 熟悉Java String的使用,熟悉String的各种函数
1.2.4. 熟悉Java中各种关键字
1.2.5. 学会使用List,Map,Stack,Queue,Set
上述数据结构的遍历
上述数据结构的使用场景
Java实现对Array/List排序
java.uti.Arrays.sort()
java.util.Collections.sort()
Java实现对List去重
Java实现对List去重,并且需要保留数据原始的出现顺序
Java实现最近最少使用cache,用LinkedHashMap
1.2.6. Java IO&Java NIO,并学会使用
java.io.
java.nio.
nio和reactor设计模式
文件编码,字符集
1.2.7. Java反射与javassist
反射与工厂模式
java.lang.reflect.
1.2.8. Java序列化
java.io. Serializable
什么是序列化,为什么序列化
序列化与单例模式
google序列化protobuf
1.2.9. 虚引用,弱引用,软引用
java.lang.ref.
实验这些引用的回收
1.2.10. 熟悉Java系统属性
java.util.Properties
1.2.11. 熟悉Annotation用法
java.lang.annotation.
1.2.12. JMS
javax.jms.
1.2.13. JMX
java.lang.management.
javax.management.
1.2.14. 泛型和继承,泛型和擦除
1.2.15. 自动拆箱装箱与字节码
1.2.16. 实现Callback
1.2.17. java.lang.Void类使用
1.2.18. Java Agent,premain函数
java.lang.instrument
1.2.19. 单元测试
Junit,http://junit.org/
Jmockit,https://code.google.com/p/jmockit/
djUnit,http://works.dgic.co.jp/djunit/
1.2.20. Java实现通过正则表达式提取一段文本中的电子邮件,并将@替换为#输出
java.lang.util.regex.
1.2.21. 学习使用常用的Java工具库
commons.lang, commons.…
guava-libraries
netty
1.2.22. 什么是API&SPI
http://en.wikipedia.org/wiki/Application_programming_interface
http://en.wikipedia.org/wiki/Service_provider_interface
1.2.23. 参考资料
JDK src.zip 源代码
http://openjdk.java.net/
http://commons.apache.org/
https://code.google.com/p/guava-libraries/
http://netty.io/
http://stackoverflow.com/questions/2954372/difference-between-spi-and-api
http://stackoverflow.com/questions/11404230/how-to-implement-the-api-spi-pattern-in-java
1.3. Java并发编程
1.3.1. 阅读源代码,并学会使用
java.lang.Thread
java.lang.Runnable
java.util.concurrent.Callable
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.concurrent.atomic.Atomic*
java.util.concurrent.Semaphore
java.util.concurrent.CountDownLatch
java.util.concurrent.CyclicBarrier
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.Executors
1.3.2. 学习使用线程池,自己设计线程池需要注意什么
1.3.3. 锁
什么是锁,锁的种类有哪些,每种锁有什么特点,适用场景是什么
在并发编程中锁的意义是什么
1.3.4. synchronized的作用是什么,synchronized和lock
1.3.5. sleep和wait
1.3.6. wait和notify
1.3.7. 写一个死锁的程序
1.3.8. 什么是守护线程,守护线程和非守护线程的区别以及用法
1.3.9. volatile关键字的理解
C++ volatile关键字和Java volatile关键字
happens-before语义
编译器指令重排和CPU指令重排
http://en.wikipedia.org/wiki/Memory_ordering
http://en.wikipedia.org/wiki/Volatile_variable
http://preshing.com/20130702/the-happens-before-relation/
1.3.10. 以下代码是不是线程安全?为什么?如果为count加上volatile修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?
public class Sample {
private static int count = 0;
public static void increment() {
count++;
}
}
1.3.11. 解释一下下面两段代码的差别
// 代码1
public class Sample {
private static int count = 0;
synchronized public static void increment() {
count++;
}
}
// 代码2
public class Sample {
private static AtomicInteger count = new AtomicInteger(0);
public static void increment() {
count.getAndIncrement();
}
}
1.3.12. 参考资料
http://book.douban.com/subject/10484692/
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
二、 进阶篇
2.1. Java底层知识
2.1.1. 学习了解字节码、class文件格式
http://en.wikipedia.org/wiki/Java_class_file
http://en.wikipedia.org/wiki/Java_bytecode
http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/
http://asm.ow2.org/
2.1.2. 写一个程序要求实现javap的功能(手工完成,不借助ASM等工具)
如Java源代码:
public static void main(String[] args) {
int i = 0;
i += 1;
i *= 1;
System.out.println(i);
}
编译后读取class文件输出以下代码:
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: iload_1
6: iconst_1
7: imul
8: istore_1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 5
line 7: 9
line 8: 16
2.1.3. CPU缓存,L1,L2,L3和伪共享
http://duartes.org/gustavo/blog/post/intel-cpu-caches/
http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html
2.1.4. 什么是尾递归
2.1.5. 熟悉位运算
用位运算实现加、减、乘、除、取余
2.1.6. 参考资料
http://book.douban.com/subject/1138768/
http://book.douban.com/subject/6522893/
http://en.wikipedia.org/wiki/Java_class_file
http://en.wikipedia.org/wiki/Java_bytecode
http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
2.2. 设计模式
2.2.1. 实现AOP
CGLIB和InvocationHandler的区别
http://cglib.sourceforge.net/
动态代理模式
Javassist实现AOP
http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/
ASM实现AOP
http://asm.ow2.org/
2.2.2. 使用模板方法设计模式和策略设计模式实现IOC
2.2.3. 不用synchronized和lock,实现线程安全的单例模式
2.2.4. nio和reactor设计模式
2.2.5. 参考资料
http://asm.ow2.org/
http://cglib.sourceforge.net/
http://www.javassist.org/
2.3. 网络编程知识
2.3.1. Java RMI,Socket,HttpClient
2.3.2. 用Java写一个简单的静态文件的HTTP服务器
实现客户端缓存功能,支持返回304
实现可并发下载一个文件
使用线程池处理客户端请求
使用nio处理客户端请求
支持简单的rewrite规则
上述功能在实现的时候需要满足“开闭原则”
2.3.3. 了解nginx和apache服务器的特性并搭建一个对应的服务器
http://nginx.org/
http://httpd.apache.org/
2.3.4. 用Java实现FTP、SMTP协议
2.3.5. 什么是CDN?如果实现?DNS起到什么作用?
搭建一个DNS服务器
搭建一个 Squid 或 Apache Traffic Server 服务器
http://www.squid-cache.org/
http://trafficserver.apache.org/
http://en.wikipedia.org/wiki/Domain_Name_System
2.3.6. 参考资料
http://www.ietf.org/rfc/rfc2616.txt
http://tools.ietf.org/rfc/rfc5321.txt
http://en.wikipedia.org/wiki/Open/closed_principle
2.4. 框架知识
spring,spring mvc,阅读主要源码
ibatis,阅读主要源码
用spring和ibatis搭建java server
2.5. 应用服务器知识
熟悉使用jboss,https://www.jboss.org/overview/
熟悉使用tomcat,http://tomcat.apache.org/
熟悉使用jetty,http://www.eclipse.org/jetty/
三、 高级篇
3.1. 编译原理知识
3.1.1. 用Java实现以下表达式解析并返回结果(语法和Oracle中的select sysdate-1 from dual类似)
sysdate
sysdate - 1
sysdate - 1/24
sysdate - 1/(12*2)
3.1.2. 实现对一个List通过DSL筛选
QList> mapList = new QList>;
mapList.add({“name”: “hatter test”});
mapList.add({“id”: -1,”name”: “hatter test”});
mapList.add({“id”: 0, “name”: “hatter test”});
mapList.add({“id”: 1, “name”: “test test”});
mapList.add({“id”: 2, “name”: “hatter test”});
mapList.add({“id”: 3, “name”: “test hatter”});
mapList.query(“id is not null and id > 0 and name like ‘%hatter%’”);
要求返回列表中匹配的对象,即最后两个对象;
3.1.3. 用Java实现以下程序(语法和变量作用域处理都和JavaScript类似):
代码:
var a = 1;
var b = 2;
var c = function() {
var a = 3;
println(a);
println(b);
};
c();
println(a);
println(b);
输出:
3
2
1
2
3.1.4. 参考资料
http://en.wikipedia.org/wiki/Abstract_syntax_tree
https://javacc.java.net/
http://www.antlr.org/
3.2. 操作系统知识
Ubuntu
Centos
使用linux,熟悉shell脚本
3.3. 数据存储知识
3.3.1. 关系型数据库
MySQL
如何看执行计划
如何搭建MySQL主备
binlog是什么
Derby,H2,PostgreSQL
SQLite
3.3.2. NoSQL
Cache
Redis
Memcached
Leveldb
Bigtable
HBase
Cassandra
Mongodb
图数据库
neo4j
3.3.3. 参考资料
http://db-engines.com/en/ranking
http://redis.io/
https://code.google.com/p/leveldb/
http://hbase.apache.org/
http://cassandra.apache.org/
http://www.mongodb.org/
http://www.neo4j.org/
3.4. 大数据知识
3.4.1. Zookeeper,在linux上部署zk
3.4.2. Solr,Lucene,ElasticSearch
在linux上部署solr,solrcloud,,新增、删除、查询索引
3.4.3. Storm,流式计算,了解Spark,S4
在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。
3.4.4. Hadoop,离线计算
Hdfs:部署NameNode,SecondaryNameNode,DataNode,上传文件、打开文件、更改文件、删除文件
MapReduce:部署JobTracker,TaskTracker,编写mr job
Hive:部署hive,书写hive sql,得到结果
Presto:类hive,不过比hive快,非常值得学习
3.4.5. 分布式日志收集flume,kafka,logstash
3.4.6. 数据挖掘,mahout
3.4.7. 参考资料
http://zookeeper.apache.org/
https://lucene.apache.org/solr/
https://github.com/nathanmarz/storm/wiki
http://hadoop.apache.org/
http://prestodb.io/
http://flume.apache.org/,http://logstash.net/,http://kafka.apache.org/
http://mahout.apache.org/
3.5. 网络安全知识
3.5.1. 什么是DES、AES
3.5.2. 什么是RSA、DSA
3.5.3. 什么是MD5,SHA1
3.5.4. 什么是SSL、TLS,为什么HTTPS相对比较安全
3.5.5. 什么是中间人攻击、如果避免中间人攻击
3.5.6. 什么是DOS、DDOS、CC攻击
3.5.7. 什么是CSRF攻击
3.5.8. 什么是CSS攻击
3.5.9. 什么是SQL注入攻击
3.5.10. 什么是Hash碰撞拒绝服务攻击
3.5.11. 了解并学习下面几种增强安全的技术
http://www.openauthentication.org/
HOTP http://www.ietf.org/rfc/rfc4226.txt
TOTP http://tools.ietf.org/rfc/rfc6238.txt
OCRA http://tools.ietf.org/rfc/rfc6287.txt
http://en.wikipedia.org/wiki/Salt_(cryptography)
3.5.12. 用openssl签一个证书部署到apache或nginx
3.5.13. 参考资料
http://en.wikipedia.org/wiki/Cryptographic_hash_function
http://en.wikipedia.org/wiki/Block_cipher
http://en.wikipedia.org/wiki/Public-key_cryptography
http://en.wikipedia.org/wiki/Transport_Layer_Security
http://www.openssl.org/
https://code.google.com/p/google-authenticator/
四、 扩展篇
4.1. 相关知识
4.1.1. 云计算,分布式,高可用,可扩展
4.1.2. 虚拟化
https://linuxcontainers.org/
http://www.linux-kvm.org/page/Main_Page
http://www.xenproject.org/
https://www.docker.io/
4.1.3. 监控
http://www.nagios.org/
http://ganglia.info/
4.1.4. 负载均衡
http://www.linuxvirtualserver.org/
4.1.5. 学习使用git
https://github.com/
https://git.oschina.net/
4.1.6. 学习使用maven
http://maven.apache.org/
4.1.7. 学习使用gradle
http://www.gradle.org/
4.1.8. 学习一个小语种语言
Groovy
Scala
LISP, Common LISP, Schema, Clojure
R
Julia
Lua
Ruby
4.1.9. 尝试了解编码的本质
了解以下概念
ASCII, ISO-8859-1
GB2312, GBK, GB18030
Unicode, UTF-8
不使用 String.getBytes() 等其他工具类/函数完成下面功能
public static void main(String[] args) throws IOException {
String str = “Hello, 我们是中国人。”;
byte[] utf8Bytes = toUTF8Bytes(str);
FileOutputStream fos = new FileOutputStream(“f.txt”);
fos.write(utf8Bytes);
fos.close();
}
public static byte[] toUTF8Bytes(String str) {
return null; // TODO
}
想一下上面的程序能不能写一个转GBK的?
写个程序自动判断一个文件是哪种编码
4.1.10. 尝试了解时间的本质
时区 & 冬令时、夏令时
http://en.wikipedia.org/wiki/Time_zone
ftp://ftp.iana.org/tz/data/asia
http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80
闰年
http://en.wikipedia.org/wiki/Leap_year
闰秒
ftp://ftp.iana.org/tz/data/leapseconds
System.currentTimeMillis() 返回的时间是什么
4.1.11. 参考资料
http://git-scm.com/
http://en.wikipedia.org/wiki/UTF-8
http://www.iana.org/time-zones
4.2. 扩展学习
4.2.1. JavaScript知识
4.2.1.1. 什么是prototype
修改代码,使程序输出“1 3 5”:
http://jsfiddle.net/Ts7Fk/
4.2.1.2. 什么是闭包
看一下这段代码,并解释一下为什么按Button1时没有alert出“This is button: 1”,如何修改:
http://jsfiddle.net/FDPj3/1/
4.2.1.3. 了解并学习一个JS框架
jQuery
ExtJS
ArgularJS
4.2.1.4. 写一个Greasemonkey插件
http://en.wikipedia.org/wiki/Greasemonkey
4.2.1.5. 学习node.js
http://nodejs.org/
4.2.2. 学习html5
ArgularJS,https://docs.angularjs.org/api
4.2.3. 参考资料
http://www.ecmascript.org/
http://jsfiddle.net/
http://jsbin.com/
http://runjs.cn/
http://userscripts.org/
五、 推荐书籍
《深入Java虚拟机》
《深入理解Java虚拟机》
《Effective Java》
《七周七语言》
《七周七数据》
《Hadoop技术内幕》
《Hbase In Action》
《Mahout In Action》
《这就是搜索引擎》
《Solr In Action》
《深入分析Java Web技术内幕》
《大型网站技术架构》
《高性能MySQL》
《算法导论》
《计算机程序设计艺术》
《代码大全》
《JavaScript权威指南》
其实不用记太多,比较精力有限,把精力多花在总结和活学活用上效果会更佳。
在实际工作中,更多的是良好的自学能力,培训中学习的永远只是表层的,多思考你需要进步的地方,比如代码的优化、结构、设计模式等。然后再进阶学习架构或者数据存储等多个方面,比如一些高性能中间件、数据库中间件等,或者大数据的学习。
总之,保持自己的良好竞争力,多总结,多实践。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
看你什么方向,培训班估计就是javaWeb的
1.ssm或ssh框架你得会,人家就指着这个出成果(看着迷糊,工作的时候很简单,看看面试题)
2.mysql或oracel 各种查询你得会
3.java中String类的方法
4.线程,虽然我也不会,但有些就会考啊
5.js,jsp,servlet,问的很基础,但你要能答得上来,初学者就靠这个赚分呢
下面是不一定会问的
jquery
css
其实,你在培训班学的真的是最基础的东西,那个东西没多少,当你拼命敲两个月代码,你就感觉培训班的东西真的没什么,感觉很多,但实际长了,一直在重复这些东西,你也就会了
再加点:
List SET MAP看看这两个集合接口及他们的实现类,开始学的时候很迷糊,面试也不一定考,但工作中,他们就是你最爱