Java类、变量、集合、数据结构基础知识

1.与类名同名的方法可以是构造方法或其他普通方法
2.final类的方法都不能是abstract的,因为final类不能被继承
3.Java区分大小写,只要不与关键字冲突都是合法的变量名。这里冲突是完全一样,包括大小写。
4.StringBuffer是线程安全的,因为里面的方法是同步的。StringBuilder不是线程安全的。
5.Thread resume()方法重新开始被 方法中断的线程的执行。
6.HashMap不是线程安全的,HashTable是线程安全的,且key和value不能为null
7.ArrayList的遍历迭代方式
8.快速排序是属于交换排序,是对冒泡排序的一种改进。其基本思想是:通过一趟排序将要排序的数据分割成独立的两部份,其中一部分所有数据都比另一部分所有数据要小。排序过程用递归实现。
9.二叉排序树,每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值,对二叉排序树进行中序遍历得到一个有序序列。在二叉排序树中查找一个结点的平均时间复杂度为O(log n)
10.堆是一个完全二叉树,且每个结点值都大于或等于其左右孩子结点的值。堆是为了实现排序而设计的一种数据结构。
11.希尔排序实质是分组插入排序,又称缩小增量排序,是对直插入排序的改进。其基本思想是先将整个待排序列分割成若干个子序列,分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中元素基本有序时,再对全体元素进行一次直接插入排序。
12.List要求List中的泛型对象只能是T或者T的子类对象;List要求List中的泛型对象只能是T或者T的父类对象
13.int与Integer的区别。int是Java8种基本数据类型之一,Integer是int的封装类。int的默认值是0,Integer的默认值是null。
14.java静态内部类的创建不需要依赖于外围类(外部类),它不能使用任何外围类的非static成员变量和方法。
15.java的finalize方法会在对象空间被回收之前执行。
16.当一个对象不再被引用后,就成为垃圾可以被回收,但线程就算没有被引用也可以独立运行。
17.java的内存泄露内容主要有:(1)静态集合类,此类数据只有在程序结束时才能被回收。 (2)各种连接,如数据库连接、网络连接、IO连接。当这些连接不再使用时,需要调用close方法释放连接。对于JDBC中Connection、Statement、ResultSet不显式关闭,会造成大量对象无法回收。(3) 监听器,在释放对象时,没有删除监听器,可能会导致内存泄露。(4) 不合理的作用域,把本该放在局部变量中的变量放在了成员变量中。
18.使用父类引用指向子类,当对象getClass().getName()时,取得的仍是子类类名。
19.接口中不能定义静态方法和非public方法。可以加abstract关键字,加以加public关键字
20.java的构造方法不能使用static静态修饰
21.java的构造方法不能使用synchronized修饰
22. 子类方法不能缩小父类方法的访问权限
23. 子类覆盖父类同步方法可以不加同步关键字
24. 数据库的隔离级别由数据库系统实现
25.数据库四种事务隔离级别:read uncommit,read commit,repeatable read,serializable,串行最严格,重复读应用最广泛。
26. 一个数字和自身异或都等于0,相同为0,不同为1。可用于查找出现偶数次的数字。
27. 异或运算满足交换率。
28. 一个类实现两个接口的相同方法(方法名,参数列表均相同),实现中只有一个方法,可以正常运行。
29.一个类实现两个接口同名方法,但返回类型不同的,编译不通过,因为Java不支持返回值类型重载。
30.一个类实现两个接口同名方法,但参数类型不同,需要实现两个方法,编译通过,正常运行。
31. 不可变类(immutable class)是指当创建了这个类的实例后,就不允许修改它的值,对象一旦被创建出来,其整个生命周期,成员变量都不能被修改。java中所有基本类型的包装类都是不可变类。对不可变类的赋值或修改其属性,实际上并不是改变原对象,而是重新开辟了新的对象。不可变类通常使用final关键字修饰。
32. 接口相关:
- 接口定义只能使用public,缺省,abstract,不能使用protected,private,static,final 等修饰词。
- 接口中可以直接使用int a =1来定义常量,JVM默认会加上public static final,所以只能定义常量,使用int a;是不合法的。必须得有初始值。
- 接口中的方法不能使用static,private,protected,final修饰,因为接口中的方法都是public abstract的(可以显式写出,也可以不写),其子类得实现这些方式,所以不能使用final;
33. abstract 只可修饰类和方法,不能修饰属性。
34. 抽象类和接口的区别和使用场景:
- 接口只有定义,其方法不能接口中实现
- 接口需要实现,抽象类只能被继承
- 接口强调功能的实现,抽象类强调所属关系
- 接口中定义的成员变量默认为public static final,即常量,而抽象类中可以定义成员变量。
- 接口中的方法都是抽象的,没有方法体抽象类中的方法可以有方法体,非抽象的。
- 接口中的方法都是公有的,抽象类可以有保护或私有方法。
- 接口多继承,抽象类单继承。
- 接口的抽象方法不需要显式添加abstract关键字,抽象类的抽象方法需要显式添加。
使用场景:
使用抽象类:当需要公共方法时,需要使用抽象类来简化接口的实现,可以加快开发速度。需要使用/修改父类变量的场景。
使用接口:已继承类,多继承场景。
35. 抽象类可以有main方法,且能正确运行。
36. String有一个私有属性char[]value,这个数组保存着构成此字符串的所有字符,equals方法,比对的就是value.而toCharArray()并没有直接返回value的引用,而是使用Ssytem.arraycopy()返回value的副本,所以返回的字符数组更新,不影响字符串。
37.StringBuffer线程安全,StringBuilder不是线程安全。StingBuilder效率更高。
38.super关键字不能出现在静态方法中。
38. Java类,只有在没有定义任何构造方法JVM才会生成默认的构造方法。如果有有参的构造函数也会导致JVM不生成默认的构造函数。
39. 未初始化的局部变量不能使用。
40. final类不能有抽象方法,因为final类不能有子类。
41. 抽象类不必实现父类的抽象方法。
42. ASCII编码是7位编码,包含128个字符。
43.拓扑结构是指资源网络的拓扑结构。
44.不同种类型的引用不能直接使用==进行比较,编译不通过。如果使用equals,将返回false,因为API的equals实现会先比较引用的类型,再比较值。若类型不同,直接返回false.基本类型的封装类重写的equals,会先比较类型,再比较值,而不是比较内存地址。直接使用双等号会比较内存地址。而包装类直接与常量做比较会引发拆箱操作。如:

Integer s = new Integer(9);
        Integer t = new Integer(9);
        Long u = new Long(9);
        //System.out.println(s == u);     // 编译不通过
        System.out.println(s == t);        // false
        System.out.println(s.equals(t));// true
        System.out.println(s.equals(9));// true
        System.out.println(s.equals(new Integer(9)));// true
        System.out.println(s.equals(u));// false
        System.out.println(s == 9);// true  

45.ORM中,表的参考关系与类之间的依赖没有直接明确的对应关系。
46.CPU时间片切换不会导致阻塞。
47.异常不是错误,并不是十分严重的错误。
48.JVM内存设置:

    -Xmx:最大堆大小
    -Xms:初始堆大小,即最小内存的值
    -Xmn:年轻代大小
    -XXSurvivorRatio:年轻代中Eden与一个Survivor区大小比值
例题:
-Xmx1024m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
最小内存为10240m Survivor区总内存为2048m
因为Survivor区有两个,Eden:Survivor=3, 即3:1:1 ,survivor共占年轻代的2/5,即2048

49.sleep与wait区别:sleep使当前线程停滞状态,阻塞当前线程,让出CPU资源。Sleep()是Thread的static方法,所以无法改变对象的锁,当一个synchronized块中调用sleep方法,线程虽然休眠了,但是对象的锁并没有被释放。wait()是Object类的方法,是对象的方法,当一个线程执行到wait()方法时,它就进入到了一个和该对象相关的等待池,同时失云了对象的锁。其他线程可以访问其同步对象。watit()使用notify或notifyAll指定睡眠时间来唤醒当前线程。wait()必须放在synchoronized块中,否则会抛出IllegalMonitorStateException。总结,其区别是sleep保持对象锁,wait释放对象锁。

你可能感兴趣的:(java基础,java,数据结构,线程安全,stringbuilder)