zoukankan      html  css  js  c++  java
  • Java基础--->自学部分

    1、权限

     default:包权限(默认权限)

    2、执行过程

    ——》父类静态域——》子类静态域

    ——》父类成员初始化——》父类构造块——》父类构造方法

    ——》子类成员初始化——》子类构造块——》子类构造方法

    初始化过程: 
    1. 初始化父类中的静态成员变量和静态代码块 ; 
    2. 初始化子类中的静态成员变量和静态代码块 ; 
    3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
    4.初始化子类的普通成员变量和代码块,再执行子类的构造方法; 
     

    3、final

    final修饰的方法,不允许被子类覆盖。
    final修饰的类,不能被继承。
    final修饰的变量,不能改变值。
    final修饰的引用类型,不能再指向别的东西,但是可以改变其中的内容。
    final修饰的成员变量在赋值时可以有三种方式。1、在声明时直接赋值。2、在构造器中赋值。3、在初始代码块中进行赋值。

    4、Array List<泛型>

    泛型不会影响JVM编译速度,只能提升数据传输安全性
    1,类型安全。 通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

    2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

    3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

    5、类加载器

    类的加载是由类加载器完成的,类加载器包括:根加载器( BootStrap )、扩展加载器( Extension )、系统加载器( System )和用户自定义类加载器( java.lang.ClassLoader 的子类)
    • Bootstrap :一般用本地代码实现,负责加载 JVM 基础核心类库( rt.jar );
    • Extension :从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap ;
    • system class loader :又叫应用类加载器,其父类是 Extension 。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。
    • 用户自定义类加载器: java.lang.ClassLoader 的子类
     
     

    6、关于length

    数组包含.length属性
    String只有str.length()方法
     

     7、下面的switch语句中,x可以是哪些类型的数据:()

    switch(x)
    {
    default:
    System.out.println("Hello");
    }

    byte、short、int、char、String、枚举

     8、+=和+

    +=可以自动装箱,自动强转
    +只可以进行运算,手动强转(容易报错)

    9、HashMap

     10、异常分类及处理

     oom经典Java error(栈溢出StackOverFlow,内存溢出outOfMemory)

     11、DCL

    public class Singleton {  
        private volatile static Singleton singleton;  
        private Singleton (){}  
        public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
            }  
        }  
        return singleton;  
        }  
    }

    12、hashcode 和 equals

     hashcode值相同 equals不一定相同

    equals 相同 hashcode值应该相同

    hashcode不相同 equals一定不相同

    equals不相同 hashcode 不一定

    hashcode:是一组数据的标识

    equals:比较的是具体的内容

    13、JDK1.8默认GC 垃圾回收器

    JDK1.8中默认使用的是Parallel Scavenge和Parallel Old收集器组合

     

    14、Static关键字

    Static是类变量,存放在堆内存中,

    Static关键字不可以用在方法中,方法定义在栈上,随方法销毁而消失。

    Static变量不惊醒初始化的话会有初始值。

    15、接口和抽象类

    抽象类

    特点:
    1.抽象类中可以构造方法
    2.抽象类中可以存在普通属性,方法,静态属性和方法。
    3.抽象类中可以存在抽象方法。
    4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
    5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
    6,抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰

    关键字使用注意:
    抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。

    接口

    1.在接口中只有方法的声明,没有方法体。
    2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final
    3.在接口中的方法,永远都被public来修饰。
    4.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类)
    5.接口可以实现多继承
    6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
    7,接口可以继承接口,用extends

    16、synchronized(类锁,对象锁,方法锁,代码块)

    修饰非静态方法 锁的是this 对象

    修饰静态方法 锁的是class对象

    synchronized修饰不加static的方法,锁是加在单个对象上,不同的对象没有竞争关系;

    synchronized修饰加了static的方法,锁是加载类上,这个类所有的对象竞争一把锁。

    17、三目运算符

    public static void main(String[] args) {
    Object o1 = true ? new Integer(1) : new Double(2.0);
    Object o2;
    if (true) {
                 o2 = new Integer(1);
    } else {
    o2 = new Double(2.0);
    }
    System.out.print(o1);
    System.out.print(" ");         
    System.out.print(o2);
    }

    输出结果:1.0    1 

    三目运算符会做转换,向高类型转换

    18、Object 常用方法

    wait,clone,equals,notify,finalize(GC),hashcode,toString,getClass

    19、Mysql 索引

    带头大哥不能死,中间兄弟不能断!

     20、判断一块内存空间是否符合垃圾回收标准(引用计数,根可达)

    在java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
    1.给对象赋值为null,以下没有调用过。
    2.给对象赋了新的值,重新分配了内存空间。

     21、内部类

     

     22、线程池工作过程

    1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面 有任务,线程池也不会马上执行它们。

    2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:

    a) 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;

    b) 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;

    c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要 创建非核心线程立刻运行这个任务;

    d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池 会抛出异常 RejectExecutionException。

    3. 当一个线程完成任务时,它会从队列中取下一个任务来执行。

    4. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运 行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它 最终会收缩到 corePoolSize 的大小。

     

     23、ABA 问题(CAS)

    乐观锁,每次读取都不会认为别人会修改(ABA问题)

    悲观锁,每次去拿数据的时候都认为别人会修改

    ABA 问题需要加版本号即可解决

    24、创建一个Java线程池

    =newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

    =newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    =newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

    =newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

     

     25、如何让10个线程在某一时刻同时执行

     

    26、instanceof (boolean result = obj instanceof Class

    instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例
     1、obj 必须为引用类型,不能是基本类型
     2、obj 为 class 接口的实现类
     3、System.out.println(arrayList instanceof List);//true
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Redis分布式锁的正确实现方式
    Redis+Jedis封装工具类
    MyCat配置文件详解--server.xml
    linux buff/cache释放
    mycat中间件--schema.xml配置文件详解
    mycat中间件--linux安装mycat1.6版本
    如何查找SHELL的进程号并杀死
    dubbo常用配置及注意事项
    xxxx
    解决docker镜像无法下载的问题
  • 原文地址:https://www.cnblogs.com/springxian/p/13413884.html
Copyright © 2011-2022 走看看