jilu

同步、异步: 1、同步--线性安全 2、异步--非线性安全 普通类和抽象类的区别: 1、普通类不可以有抽象方法,抽象类可以包含抽象(不一定都是抽象方法)方法 2、抽象类不能直接实例化,普通类可以直接实例化 接口和抽象类的区别: 1、接口用implements实现,

同步、异步:
    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倍左右

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

知秋君
上一篇 2024-07-13 14:36
下一篇 2024-07-13 14:02

相关推荐