知识点总结: Java 面试宝典 2013版(超长版) - Java 基础部分

在学习Java 时,查看了Java面试宝典2013版(超长版)
在此总结了一些知识点以便巩固,复习。

Java 基础部分

1. 一个 .java 源文件中可以有多个类,但是只能有一个public类,并且 public类的名称一定要和源文件的名称一样。
2. 逻辑操作(&,|,^)与条件操作(&&,||)的区别。
  • a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型
  • b.逻辑操作不会产生短路

例如 & 和 && 都可以表示与(and)。
& 没有短路功能,&&有短路功能,即第一个表达式为false后不再执行后面的表达式。
& 可以用作位运算符:当&操作符两边的表达式不是boolean类型时,就表示按位与操作。

3. 跳出多重循环:
  • 标号
  • 外层循环条件
4. switch(exp) 中 exp 只能是一个整数表达式或者枚举常量。
  • 整数表达式: int、Integer,可以隐式转化为int的byte、short、char及其包装类。long 和 String 就不行。
5. 类型提升:

类型自动提升等级排列

short s1 = 1;
s1 = s1 + 1; // 错误, s1 + 1 类型自动提升为int,将int赋值给short 编译时报错,需要强制类型转换
s1 += 1; //正确, += 是java语言规定的运算符,java 编译器会对其进行特殊处理,可以正确编译。

6. char 类型 2个字节,存储Unicode编码字符集,包含汉字。
7. 将一个数左移n位,表示乘以2的n次方。
8. final

final关键字修饰一个变量, 引用变量自身不能改变,引用变量所指向的对象的内容可以改变。

9. == 和 equals
  • == 比较两个变量所对应的内存中所存储的数值是否相同。 基本类型的数据或引用变量只能用== 来判断是否相等。
  • equals 比较两个独立对象的内容是否相同。Object 的 equals 方法是使用==来实现的。
10. 静态变量和实例变量
  • 静态变量:
    • static 关键字
    • 属于类
    • 类加载就分配空间并可以使用
    • 可以直接使用类名来引用
    • 一个类对应一个,与对象个数无关,所有对象共用一个
  • 实例变量:
    • 属于某个对象
    • 创建了对象后才会分配空间,才可以使用
    • 通过对象来使用
    • 一个对象对应一个,每个对象拥有一个属于自己的
11. int 和 Integer
  • int : 默认值为0;
  • Integer : 默认值为null,可以区分出 未赋值 和 值为0。
12. - Math.ceil(x) : 天花板,向上取整 Math.ceil(11.5) =
  • Math.floor(x) : 地板,向下取整
  • Math.round(x) : 四舍五入, 相当于 Math.floor(x + 0.5)
13. 访问修饰符: public,protected, friendly(默认),private
         作用域: 当前类,同一package,子孙类,其他package
14. Overload 和 Override
  • Overload 重载:同一个类中多个方法,名称相同,参数列表不同。返回值不能判断。
  • Override 重写覆盖 :子类中的方法,名称和参数列表和父类的完全一样。返回值也要求一样。抛出的异常一致或是父类异常的子类。(多态)当父类中方法为private时,不继承所以不覆盖。
15. 构造器 Constructor 不能被继承,所以不能被overrride,但是可以被 Overload。
16. 抽象类和普通类的唯一区别就是不能创建实例对象,允许有abstract 方法。
17. 面向对象:
  • 封装:将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。
  • 抽象:找出一些事物的共性,然后归为一类。
  • 继承:可以在一个已经存在的类的基础上定义和实现一个新的类。代码的可重用性和可扩展性。
  • 多态:在程序运行期间才可以确定所绑定的具体的类。灵活性和可扩展性。靠的是: 父类的引用变量可以指向子类, 或 接口定义的引用变量可以指向具体实现类的实例对象。是运行时的对象。
18. 抽象类和接口
抽象类 继承(一次) is-a 可以有自己的数据成员,也可以有非abstract方法 可以实现非抽象方法 抽象类中变量默认是friendly,可以在子类中重新定义,也可以在子类中修改
接 口 实现(多个) like-a 只能有静态的不能被修改的数据成员static final,所有成员方法都是abstract的 不能有实现方法 接口中的变量默认public static final,必须给初始值,实现类中不能重新定义,也不能修改。 接口中的方法默认都是public abstract
19. 内部类
  • 更好的封装性
  • 无限制访问外部类成员(但是静态内部类只能访问外部类中的静态成员)
  • 实现多继承
  • 4种表现形式:
    • 成员内部类,作为外部类的一个成员存在,与外部类的属性、方法并列
    • 局部内部类,在方法里面定义,与局部变量类似
    • 静态内部类,嵌套类。和外部类对象没有练习。
    • 匿名内部类,没有名字的内部类,属于局部内部类。

注意:普通的内部类对象隐含的保存了一个指向外部类对象的引用;
但是创建静态内部类对象,不需要其外部类的对象;
不能从嵌套类的对象中访问非静态的外部类对象。

注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。

20. 字符串

对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。
而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。

21. 对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。

String s="a"+"b"+"c"+"d"; 只创建了一个String对象
##### 22. 同步: synchronized

23. sleep:

Thread的方法,不释放锁

24. wait:

Object的方法,释放锁,notify后进入锁定池参与锁的竞争。

25. Lock
  • java.util.concurrent.locks.Lock 能完成synchronized所实现的所有功能,并且有更精确的线程语义和更好的性能。
  • Lock 需要显式手动解锁。
26. ArrayList & Vector
顺序 重复 存储 同步性 数据增长
ArrayList 有序集合 可重复 使用数组存储 线程不安全 可设置初始空间,不可设置增长空间,默认增长为原来的1.5倍 索引快,插入慢
Vector 有序集合 可重复 使用数组存储 线程安全 可设置初始空间和增长空间大小,默认增长为原来的2倍 索引快,插入慢

LinkedList 双向链表实现,索引慢,插入快

27. HashMap & HashTable

HashMap 是 HashTable的轻量级实现。

HashMap 实现Map接口 无序,键不能重复 允许空键值 线程不安全 containsValue(),containsKey()
HashTable 继承自Dictionary 无序,键不能重复 key和value不为空 线程安全 contains()
28. List

一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象。

29. Collection和 Collections的区别。
  • Collection是集合类的上级接口,继承与他的接口主要有Set和List.
  • Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
30. 字节流: InputStream、OutputStream
31. 字符流: Reader、Writer
32. heap和stack有什么区别。

java的内存分为两类,一类是栈内存,一类是堆内存。

  • 栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
  • 堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
33. Gabage Collection 垃圾回收

Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况
垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清理和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有

  • 分代复制垃圾回收和
  • 标记垃圾回收,
  • 增量垃圾回收。
34.内存泄漏

内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。
内存泄露的两个条件:无用,无法回收。
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露。
检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。

35. Assert

一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

36. abstract method必须以分号结尾,且不带花括号,不能以private修饰。
37. 局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
38. instant variable有default value。int的default value是0。
39. final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为”final int i =0;”。
  • static method不能直接call non-static methods。
  • static method不能访问non-static instant variable。
40. final 的用法
  • 修饰成员变量的final : 意味着被修饰成常量,不能被修改。
  • 修饰方法的final : 该方法不可以被被继承成员重新定义。即不能被覆盖(私有方法被编译器隐式修饰为final)
  • 修饰类的final : 不允许类被继承
  • 修饰类的引用或对象的引用的final: 引用本身不能被修改,引用指向的类或对象可以修改。
  • 作为参数中的对象的final: 相当于是引用的final。

猜你喜欢

转载自blog.csdn.net/linyk3/article/details/48051909