同步、异步:
1、同步--线性安全
2、异步--非线性安全
普通类和抽象类的区别:
1、普通类不可以有抽象方法,抽象类可以包含抽象(不一定都是抽象方法)方法
2、抽象类不能直接实例化,普通类可以直接实例化
接口和抽象类的区别:
1、接口用implements实现,抽象类用extends实现
2、接口不可以有构造函数,抽象类可以有构造函数
3、接口不能有main方法,抽象类可以有可运行的main方法
4、类的接口可以有多个,只能继承一个抽象类
5、接口中的方法默认是public,抽象类中的方法可以为任意修饰符
BIO\NIO\AIO详解:
1、BIO(同步、阻塞)
2、NIO(同步、非阻塞)
三个主要组成部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)
Channel主要有:
1、FileChannel(从文件读取数据)
2、DatagramChannel(读写UDP网络协议数据)
3、SocketChannel(读写TCP网络协议数据)
4、ServerSocketChannel(监听TCP连接 )
Buffer主要有:
1、ByteBuffer
2、CharBuffer
3、DoubleBuffer
4、FloatBuffer
5、IntBuffer
6、LongBuffer
7、ShortBuffer
Buffer读写数据遵循四个步骤:
1、写入数据到Buffer
2、调用flip()方法
3、从Buffer中读取数据
4、调用clear()方法或者compact()方法 :清空缓冲区
3、AIO(异步、非阻塞)
跨域的几种方式:
1、JSONP
2、CORS (Cross-Origin Resource Sharing)
3、降域(前提主域名要一致)
4、postMessage
依赖注入的方式:
@Autowired: 默认是根据参数类型自动装配
@Resource : 默认是根据参数名称自动装配
1、构造器注入
2、接口注入
3、setter方法注入
SQL事务的隔离级别:
四种情况:
A)修改时允许修改(丢失更新)
B)修改时允许读取(脏读)
C)读取时允许更新(不可重复读)
D)读取时允许插入(幻读)
脏读、不可重复读、幻读
级别:
1、读未提交()
2、读已提交
3、可重复读
4、串行化
数据库范式:
1、第一范式(确保每列保持原子性):数据库表所有字段值都是不可分解的原子值
2、第二范式(确保每列都和主键相关):一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
3、第三范式(确保每列都和主键直接相关,而不是间接相关):
JVM主要组成部分:
1、类加载器
2、运行时数据区
3、执行引擎
4、本地库接口
jvm运行时数据区有哪些:
1、程序计数器
2、虚拟机栈
3、本地方法栈
4、堆
5、方法区
jvm垃圾回收方法:
1、标记-清除算法
2、标记-整理算法
3、复制算法
4、分代算法
新生代回收:复制算法;老年代回收:标记-整理算法、标记-清除算法
新生代垃圾回收器和老年代垃圾回收器有:
1、新生代垃圾回收器:Serial、ParNew、Parallel Scavenge
2、老年代垃圾回收器:Serial Old、 Parallel Old、CMS
3、整堆回收器:G1(Garbage-First)
jvm常用调优工具:
1、jconsole:用于对Jvm中内存、线程和类等进行监控
2、jvisualvm:JDK自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存变化、GC变化等
jvm常用调优参数:
java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
1、-Xmx3550m :设置JVM最大可用内存为3550M
2、-Xms3550m :设置JVM初始化内存为3550M
3、-Xmn2g :设置年轻代大小2G
4、-Xss128k :设置每个线程的堆栈大小128K
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
1、-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
2、-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
3、-XX:MaxPermSize=16m:设置持久代大小为16m。
4、-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew 垃圾回收器组Old合;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 GC 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。
transient修饰符是什么含义?
当我们序列化对象时,如果对象中某个属性不进行序列化操作,那么在该属性前添加transient修饰符即可实现;
List详解:
1、ArrayList
实现了长度可变的数组,遍历元素和随机访问的效率较高
线程不安全
2、LinkedList
采用链表存储方式,插入、删除元素效率比较高
没有实现RandomAccess接口,不具备随机元素访问功能
线程不安全
Set详解:(存取无序,元素唯一)
靠元素重写hashCode方法和equals方法来判断两个元素是否相等,如果相等则覆盖原来的元素,依此来确保元素的唯一性
1、HashSet(底层数据结构是哈希表,元素唯一)按Hash算法来存储元素,具有很好的存取和查找性能。
特点:
不能出现重复元素
不能保证元素的排列顺序
HashSet不是同步 线程不安全
集合元素值可以为null
2、TreeSet(内部实现是红黑树,默认排序从小到大。)当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
特点:
对插入的元素进行排序,是一个有序的集合(主要与HashSet的区别);
底层使用红黑树结构,而不是哈希表结构;
允许插入Null值;
不允许插入重复元素;
线程不安全;
3、LinkedHashSet(是HashSet 的子类,插入性能略低于HashSet,迭代访问 Set 里的全部元素时有很好的性能)
特点:线程不安全
Map详解:
1、HashMap
只允许一条记录的key(键)为NULL(多条会覆盖),允许多条记录的value(值)为NULL
线程不安全
2、TreeMap
能把保存的键(Key)排序,默认升序
不允许键(key)的值为NULL
线程不安全
3、HashTable
key和value的值都不允许为NULL
线程安全,所以写入时比较慢
4、LinkedHashMap
保存了记录的插入顺序,先得到的肯定是先插入的
遍历时会比HashMap慢
key和value的值都允许为NULL
线程不安全
增强for循环遍历,使用keySet()遍历
for (String key : map.keySet()) {
System.out.println(key + " :" + map.get(key));
}
增强for循环遍历,使用entrySet()遍历
for(Map.Entry<String,String> entry:map.entrySet()){
System.out.println(entry.getKey() + " :" + entry.getValue());
}
迭代器遍历,使用keySet()遍历
Iterator iterator=map.keySet().iterator();
while(iterator.hasNext()){
String key=iterator.next();
System.out.println(key + " : " + map.get(key));
}
迭代器遍历,使用entrySet()遍历
Iterator iterator=map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> entry=iterator.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
总结:
1、增强for循环使用方便,但性能较差,不适合处理大量级别的数据
2、迭代器的遍历速度比增强for循环快很多,是增强for循环的2倍左右
3、使用entrySet遍历的速度比keySet快很多,是keySet的1.5倍左右