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
 

 27、字符串转换整型,整形转换字符串

 
public class Thread {
    static int i=10;
    static String s="112";
    public static void main(String[] args) {
        String str=String.valueOf(i);
        int j=Integer.valueOf(s);
        System.out.println(str);
        System.out.println(j);
    }
}

28、空指针异常

public class Test {
    private int a=1;
    private int b=2;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test t1 = new Test();
        Test t2 = null;
        System.out.println(t1.a);
        System.out.println(t2.a);
        System.out.println(t2.c());
    }
}

29、

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
posted @ 2020-10-26 13:01  Spring_Xian  阅读(92)  评论(0编辑  收藏  举报