• Java基础汇总2019


    1、事务的ACID性:

    (1)原子性:要么做,要么都不做。程序操作执行未成功,则所做的更改会被撤销;

    (2)一致性:比如转账,a转给b一百元,则a的账户少100,b的账户多100,前后数据要一致;

    (3)隔离性:由数据库锁实现。事务的隔离级别有4种:未提交读、提交读、可重复读、串行化;

    (4)持久性:数据的修改提交是永久的(个人理解);

    (1)(2)可由Undo日志实现,系统操作数据的时候,Undo日志会备份数据,当系统出现错误或者回滚的时候,就从备份数据中恢复;

    (4)由Redo Log重做日志。将Redo Log持久化,不用持久化数据,当系统奔溃时,可根据Redo Log的内容,恢复所有数据到最新状态。

    2、索引:快速检索数据库中的数据,是一种数据结构。

    MySQL的优化:三种方式:1索引优化、2 sql优化、3 表优化

    (1)索引优化:a、设置索引:where子句常用的列设置索引;

                               b、不使用索引:模糊查询不使用索引,比如like '%a'这种;

                               c、联合索引:order by多个字段进行排序,建立联合索引;

    (2)sql优化:a、少用select *,而用select 具体的字段;

                             b、多表连接时,小表驱动大表,即小表join大表(小表数据更少,join出来的数据集也会更小);

                             c、用exist 代替in;

                             d、where子句中避免对字段进行函数操作

    (3)表优化: a、字段尽可能设置not null;

                             b、字段长度固定,查询会更快;

    另,MySQL的分页:sql中使用limit  page,rows。页数少则使用基本分页方式;页数多用字查询的分页方式;

    3、线程的四种实现方式:(1)继承thread类并重写run方法;

                                               (2)实现runnable接口并重写run方法;

                (3)实现callable接口通过FutureTask包装器来创建Thread线程;

                (4)使用ExecutorService、callable、Future实现有返回结果的线程;

    4、线程的生命周期:new新建 -->   runnable就绪 -->  running运行 --> blocked阻塞 --> dead死亡

    5、线程start方法与run方法的区别:start方法使线程开始执行,就绪状态,一旦得到CPU则开始run方法,结束则线程终止,实际上start方法还是去执行线程中的run方法;

                                                             run方法一般都是重写的,相当于一个普通方法,直接调用还是要顺序执行的,在主线程之后执行。

    6、volatile只修饰成员变量:则该变量对所有线程可见,保证多线程间的可见性,每次读取volatile变量一定是最新数据

                volatile与CAS(compareAndSet)结合,保证了原子性

                volatile变量可以保证下一个读取操作在前一个写操作之后发生;

                使用volatile会禁止语义重排序;

    7、类加载过程: 加载 --> 连接 --> 初始化 --> 使用 --> 卸载

    加载过程:将class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据(静态变量、静态代码块、常量池等),在堆中生成一个Class类对象代表这个类(反射原理),作为方法区类数据的访问入口。

    连接:• 验证确保加载的类信息符合JVM规范,没有安全方面的问题。 

              • 准备正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。

         • 解析虚拟机常量池内的符号引用替换为直接引用(地址引用)的过程

    初始化:执行构造器方法

    8、StringBuffer与StringBuilder

      StringBuffer是线程安全的,效率低,它的append方法有同步锁

          StringBuilder是线程不安全的,效率高,它的append方法没有同步锁。

    9、hashmap与hashTable

      hashmap是线程不安全的,hashTable线程安全,因为他的方法是synchronized,是同步的

      hashmap允许null作为key或value,hashTable不允许。

    10、ArrayList、LinkedList与Vector

      都是List的子类;

      ArrayList线程不安全,单线程访问集合时,用它,效率高。 扩容是增加原来的0.5倍;

      Vector是线程安全的。扩容是增加原来的1倍;

      LinkedList线程不安全,基于双向链表实现。

    11、List与Map的区别:

      List数据是有序的且允许重复;   Map数据无序,key不能重复,value可以

    12、匿名类与内部类

    内部类:A类中定义的另一个类B,B称为内被类 ;

        A的成员变量B中也有效,可以用(内部类可直接调用静态或非静态的外部类属性),但B的类体不能声明类变量;

        B中的方法可以调用A的方法(A的类方法也可以调用B的方法);

        B可由A创建B的对象来使用

    局部内部类:A的方法中创建的内部类,不能访问所在局部的局部变量,不能定义static变量

    匿名类:没有名字的类,不能引用,不能实例化,只用一次,不能有构造器;

        利用父类的构造函数和自身类体构成一个类;

        可继承或重写父类方法,可访问外部类的成员变量和方法;

        类体不能声明static成员变量或方法

        interface Cubic{   Double   getCubic(int n);   }

        Class A {   void f(Cubic c) {  xxxxx  }}

        Demo {

          main(){

             A a= new A();

             //此处f函数的参数就是匿名内部类,没有名字,实现了接口Cubic的getCubic方法

             a.f(new Cubic(){

                public double getCubic(int n){ xxxx }

             })

          }

        }

    13、多线程如何避免死锁?    指定获取锁的顺序

    多线程创建线程池:使用线程池工厂类Executors中的静态方法newFixedThreaPool(numThreads)来创建

    一个线程池:ExecutorService   es = Executors.newFixedThreaPool(2);   //初始2个线程

    无限线程池:ExecutorService ctp = Executors.newCachedThreadPool();

          以上,创建newCachedThreadPool实际都是用java.util.concurrent.ThreadPoolExecutor来返回:

              public static ExecutorService newCachedThreadPool(){

                  return new ThreadPoolExecutor(0,Integer.Max_VALUE,60L,TimeUnit.SECONDS,new SynchrononsQueue<Runnable>());

              }

    单个线程线程池:  Executors.newSingleThreadExecutor(); 

    关闭线程池:
      shutdown执行后停止接受新任务,会把队列中的任务执行完;
      shutdownNow执行后停止接受新任务,但会中断所有的任务,将线程池状态改为stop
     
    14、final关键字:
    (1)修饰变量,代表变量的值不能被修改
    (2)修饰方法,代表继承该类的子类不能重写此方法
    (3)修饰类,代表本类不能被继承
     
    15、mybatis中#与$的区别
    (1)#将传入的数据当成一个字符串,会对传入的数据加一个双引号order by #user_id#,如传入的值是111,则解析成的sql是order by "111"
    (2)$只是单纯将传入的值sql,不加引号
    (3)#能防止sql注入,$不能,例如传入的参数值是-- where  id > 0,用$此条件就失效了,因为--被直接接到sql中,相当于注释了
     
    #是将其解析为一个?占位符,类似在statement组装sql的时候
     
    16、Object类有哪些方法,分别讲解一下

     有12个成员方法:

    构造函数Object()

    hashCode()和equals()函数用来判断对象是否相同

    wait(),wait(long),wait(long,int),notify(),notifyAll() ,线程相关

    toString()和getClass()

    clone() :另存当前对象

    finalize()用于在垃圾回收

  • 相关阅读:
    POJ 1061 青蛙的约会(扩展欧几里得)
    贝祖定理(裴蜀定理)
    C语言 gets()和scanf()函数的区别
    非递归方式遍历二叉树
    zip包的解压
    八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)
    数字反序与数字的和
    合并两个有序数组,合并后数组仍有序
    使用递归方式和非递归方式求斐波那契数
    求100到999之内的水仙花数
  • 原文地址:https://www.cnblogs.com/blackdd/p/12089188.html
Copyright © 2020-2023  润新知