语法类问题

关于 equals 的问题

答: 对于Objects的equals更安全,当出现空指针时候不会出现空指针异常。

  1. ClassA a=null;
  2. ClassB b=new ClassB();
  3. //1.此处会报空指针异常
  4. System.out.println(a.equals(b));
  5. //2.此处返回false
  6. System.out.println(Objects.equals(a,b));

关于类的权限修饰符问题

答:class 无法使用 private 修饰

  1. - 解释:private 类内访问,本身类内就可以访问,无意义


构造器问题


继承问题


内部类问题

关于内部类的两种创建方法

  1. //1.静态内部类
  2. OutClass.InerClass className=new OutClass.InerClass();
  3. //2.成员内部类
  4. OutClass.InerClass className=new OutClass().new InerClass();

静态内部类是否可以直接访问外部类的静态成员 ?

  1. **答:可以的**,外部类的静态成员只有一份,可以被共享

静态内部类是否可以直接访问外部类的实例成员 ?

答:不可以,静态内部类属于外部类本身,不属于外部类对象。

成员内部类不能定义静态成员

答:静态成员只加载一次,在初始化时加载至静态区

  1. - 成员内部类是外部类的成员,成员是没有静态区的

静态内部类可以定义静态成员 。

成员内部类是否可以直接访问外部类的静态成员 ?

答:可以的,外部类的静态成员可以被共享

成员内部类是否可以直接访问外部类的实例成员 ?

答:可以的,成员内部类属于外部类对象,可以直接访问当前外部类对象的实例成员

总结: 成员内部类可以访问外部类的所有成员

局部内部类成分特点

答:只能定义实例成员,不能定义静态成员 。可以定义常量。

总结: 局部内部类基本没啥用


抽象类问题


接口类问题


面向对象类问题

多态使用前提

  1. 1. 必须存在**继承**或者**实现**关系
  2. 1. 必须存在父类类型的变量引用子类类型的对象
  3. 1. 需要存在方法重写

容器类问题

整个容器的继承体系问题

整个容器的祖宗接口Collection 4_1.jpg

  • List 接口:有序,索引,重复

    • LinkedList : [ 添加元素 ] 有序,有索引,可重复———基于双向链表
    • ArrayList : [ 添加元素 ] 有序,有索引,可重复———基于连续数组
  • set 接口: 无序,无索引,不重复

    • HashSet 实现类: [ 添加元素 ] 无序,无索引,不重复
      • LinkedHashSet 实现类: [ 添加元素 ] 有序,不重复,无索引
    • TreeSet 实现类: [ 添加元素 ] 默认升序排序(可排序集合),无索引,不重复

Set判重标准

  1. 1. 首先判断2个对象的 HashCode 是否相同
  2. - 若相同则重复,false
  3. 2. 接着用 equals 判断2个对象的内容是否相等
  4. - 若相同则重复,false

故new出的2个相同内容的对象,依旧会被插入进去 因此想内容相同的对象不被插入,就必须重写hashcode和equals

Java 规定的比较规则的返回值

  1. 1. 程序员认为比较者 > 被比较者,返回正数
  2. 1. 程序员认为比较者 < 被比较者,返回负数
  3. 1. 程序员认为比较者 = 被比较者,返回零值

return this.num - o.num ;

TreeSet 容器内排序的两种方法

  1. 1. 实现comparable接口,重写compareTo方法
  2. 1. 为集合设置比较器Comparator

二者共存,优先使用类内的比较准则

凡是 Set、Map 接口实现类需要保证不重复

必须需要重写 HashCode 和 equals


多线程问题

多线程实现的3种方式

  1. 1. 继承Thread类,重写 run 方法
  2. 1. 实现runnable接口,重写 run 方法
  3. 1. 实现callable接口
  1. //1.创建一个线程任务类实现callable接口,申明线程返回结果类型
  2. public class MyCallable implements Callable<String> {
  3. //2.重写call方法
  4. @Override
  5. public String call() throws Exception {
  6. for (int i = 0; i < 50; i++) {
  7. System.out.println(Thread.currentThread().getName()+"-->>"+i);
  8. }
  9. return "Are You Ok ?";
  10. }
  11. }
  12. public class MyTest{
  13. public static void main(String[] args) {
  14. //3.创建一个Callable的线程任务对象
  15. Callable call=new MyCallable();
  16. //4.把Callable包装成未来任务对象
  17. FutureTask<String> task=new FutureTask<>(call);
  18. //5.把未来任务对象包装成线程对象
  19. Thread t=new Thread(task);
  20. t.setName("子线程");
  21. //6.启动线程对象
  22. t.start();
  23. //7.模拟主线程任务
  24. for (int i = 0; i < 50; i++) {
  25. System.out.println(Thread.currentThread().getName()+"-->>"+i);
  26. }
  27. //8.最后获取线程执行结果
  28. try {
  29. String res=task.get();
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. } catch (ExecutionException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

Java集合保证线程安全的有 ?

(1)Vector:所有方法均加锁 sycnhronized 修饰 (2)Hashtable:底层的方法或变量使用 sycnhronized 关键字修饰 (3)ConcurrentHashMap:线程安全的Map (4)Statck:堆栈类,先进后出 (5)Enumeration:枚举,相当于迭代器。 [ 亦可防暴力反射破解 ]