欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础总结

程序员文章站 2022-03-30 16:40:12
...

String类能被继承吗?为什么?

不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。

sleep()和wait()的区别?

  • sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
  • wait是Object类的方法,对此对象
  • 调用sleep不会释放对象锁。
  • 调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

简述synchronized和java.util.concurrent.locks.lock的区别?

  • 主要相同点:Lock能完成synchronized所实现的所有功能
  • 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会 自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

InputStream,outputStream,Reader,Write类的区别?

①Reader和writer是字符流,InputStream/OutputStream是字节流
②Reader和write用于读取文本文件,InputStream/OutputStream由于读取二进制文件
③ InputStream、Reader是输入流;OutputStream、write是输出流
④Reader和write支持16位的Unicode字符输出,InputStream/OutputStream支持8位的字符输出
⑤字节流可以用字符流形式读取

进程和线程的区别?

①进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。
②线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
③线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
④多进程是指操作系统能同时运行多个任务(程序)。
⑤多线程是指在同一程序中有多个顺序流在执行。
⑥在java中要想实现多线程,有三种手段,一种是继承Thread类,另外一种是实现Runable接口,还有就是实现Callable接口。

final, finally, finalize的区别?

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

HashMap和Hashtable的区别。

(1)HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key)。
(2)由于非线程安全,效率上可能高于Hashtable。
(3)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
(4)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
(5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

集合和数组的区别

  • 数组的长度是固定的,而集合长度是可变的
  • 数组值可以存储对象,还可以存储基本数据类型;而集合只能够只能存储对象
  • 数组存储的数据类型是固定的,而集合存储的数据类型不固定

ArrayList和LinkedList、vector

ArrayList 内部借助于数组实现元素的存储。
ArrayList 是线程不安全的,相对于线程安全的Vector来说可能效率较高。
ArrayList 内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
ArrayList 内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 )

LinkedList 内部基于链表实现元素的存储。
LinkedList是线程不安全的。
LinkedList内部基于链表实现数据存储,因此随机访问效率较低。( 需要逐个遍历链表中的结点 )
LinkedList内部基于链表实现数据存储,因此增删元素速度较快。( 增删元素只需要修改相邻两个节点的指针 )

vector线程安全,借助于数组存储数据

Vector类和Stack类

  • Vector 内部借助于数组实现元素的存储。
    Vector是线程安全的,相对于线程不安全的ArrayList来说可能效率较低。
    Vector内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
    Vector内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 )

  • Stack 类是 Vector 类的子类。

    push 将元素压入栈顶
    peek 检查栈顶元素(不弹出元素)
    pop 弹出栈顶元素
    search 从栈顶开始搜索元素( 基数从 1 开始 )
    empty 判断当前栈是否为空

线程的五种状态:

1、	新建状态:new Thread();
2、	就绪状态:t.starts();等待获得CPU
3、	运行状态:获得CPU,实现run方法
4、	阻塞状态:执行了Thread.sleep方法、发生了IO操作、或者调用了同步锁的外套方法

5、 死亡状态:代码执行完毕。

sleep 和 yield 的区别:

  1. sleep 不考虑线程优先级 ( 一个线程睡眠后其它线程都有机会获得CPU ),yield 要考虑线程优先级 ( 仅让位给 跟自己同等优先级或优先级比自己高的线程 )

  2. sleep 可能抛出 InterruptedException ,而 yield 不会抛出异常

  3. sleep 导致运行状态的线程进入到阻塞状态,而 yield 会导致运行状态的线程进入就绪状态

String、StringBuffer、StringBuilder的区别

  • String:字符串常量,字符串长度不变,是被声明程final的,一次赋值不可改变
  • StringBuffer:字符串变量,线程安全,如果需要频繁的对字符串内容进行修改,处于效率考虑最好使用StringBuffer;
  • StringBuilder:字符串变量,非线程安全,与StringBuffer的区别是StringBuilder它是在单线程环境下使用的,所以效率要比StringBuffer

int和Integer的区别

  • Integer是引用数据类型,是int提供的封装类,。int是基本数据类型中的一种。
  • Integer定义的数组初始值为null。int定义的数组初始值为0
  • Integer是一个对象,需要一个引用来指向这个对象,int是基本数据类型, 直接存储在内存中。

抽象类与接口的异同

      抽象类有代码块而接口没有代码块
      抽象类和接口都不能直接实例化
      抽象类和接口都用extends继承父类
      类(抽象类)是单继承,接口是多继承
      接口是设计的结果 ,抽象类是重构的结果
      如果一个类里有抽象方法,那么这个类只能是抽象类
      抽象类可以有具体的方法 和属性(不能用abstract定义),  接口只能有抽象方法和不可变常量
      抽象类用abstract声明,接口用interface声明

异常处理机制

  1. 当程序发生异常时会产生一个代表该异常的对象

  2. 同时当前程序会把这个异常对象交给运行时系统

  3. 运行时系统根据接受到的异常对象寻找相应代码来处理该异常。

  4. 处理异常的方式有两种,一种是 捕获异常 ,另外一种是 抛出异常。

受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的区别

  1. 运行时异常是指 直接 或 间接 继承了 java.lang.RuntimeException 类的那些 异常类,
    而 受检查异常 是指从来都没有继承过 java.lang.RuntimeException 类的那些 异常类 。

  2. 对于受检查异常来说,必须在编译之前就显式书写异常的处理代码,
    可以是通过 try … catch … finally 语句捕获并处理异常,
    也可以通过为 相应的方法 添加 throws 声明 来 声明抛出的异常类型。

  3. 对于运行时异常来说,在编译阶段可以不显式书写任何跟异常处理有关的代码。

受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的相同点
  1. 都是异常( 都是 Exception 的子类型,不是 Error 的子类型 )
  2. 都可以被 捕获 ( try … catch … finally ) 或 抛出 ( throw )

十种常见的异常

 IOException
 FileNotFoundException
 RunnTimeException
 ArithmeticException
 lllegalArgumentException
 ArrayIndexOutOfBoundsException
 NullPointerException
 ArrayStoreException
 ClassCastException
 NumberFormatException

Mysql和ORACLE的区别

  1. Oracle是大型数据库而Mysql是中小型数据库 Mysql是开源的而Oracle价格非常高
  2. Oracle支持大并发,大访问量
  3. Oracle也Mysql操作上的一些区别
  • 主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;
  • Oracle没有自动增长类型,主键一般使用的序列,插入记录时将***的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
  1. 单引号的处理 MYSQL里可以用双引号包起字符串,
    ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

单列的特点和作用

特点

  • 单例类确保自己只有一个实例。
  • 单例类必须自己创建自己的实例。
  • 单例类必须为其他对象提供唯一的实例
    作用
  • 控制资源的使用,通过线程同步来控制资源的并发访问;
  • 控制实例产生的数量,达到节约资源的目的。
  • 作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信
懒汉式:
   public class Sun{
     private static Sun s;//定义一个私有的静态成员变量用来存储那个唯一的实例
       private Sun(){
         super();
       System.out.println("private Sun");
      }
    public static Sun getInstance(){//定义一个非私有的静态成员方法
       if(s==null){
          s=new Sun;
          }else{
            return s;
            }
         }
   }
饿汉式
 public class Earth{
 private static Earth EARTH=new Earth();
    private Earth(){
         super();
       System.out.println("private Earth");
      }
    public static Earth getInstance(){
         return EARTH;
    }
    }
相关标签: Java基础知识