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
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Educational Codeforces Round 83 --- F. AND Segments
    Educational Codeforces Round 83 --- G. Autocompletion
    SEERC 2019 A.Max or Min
    2019-2020 ICPC Southwestern European Regional Programming Contest(Gym 102501)
    Educational Codeforces Round 78 --- F. Cards
    今天我学习了一门全新的语言
    codeforces 1323D 题解(数学)
    Educational Codeforces Round 80 (Div. 2) 题解 1288A 1288B 1288C 1288D 1288E
    Educational Codeforces Round 81 (Div. 2) 题解 1295A 1295B 1295C 1295D 1295E 1295F
    Codeforces Round #617 (Div. 3) 题解 1296C 1296D 1296E 1296F
  • 原文地址:https://www.cnblogs.com/springxian/p/13413884.html
Copyright © 2011-2022 走看看