java基础必须要知道的几种区别

java里需要掌握的几种区别

final,finally,finalize有什么区别

**答:**final可以用来修饰类,方法,变量。如果final修饰类,那么这个类是不可以被继承扩展的,final修饰的变量是不可以改变的,final修饰的方法是不可以重写的。

finally则是java保证重点代码一定要被执行的一种机制。我们一般使用try-finally或者try-catch-finally代码块来执行jdbc连接关闭,IO流关闭,unlock释放等动作。

finalize是Object对象的一个方法,它设计目的是保证对象在被垃圾收集之前完成特定资源的回收。finalize并不推荐使用,因为无法保证finalize什么时候执行,执行的是否符合预期,使用不当的话,可能会影响性能,也有可能会造成程序死锁,挂起等现象。

关于finally的一些补充说明

列几个 fanlly 不会被执行的情况:

//1. try-cach 异常退出。
   try{
   system.exit(1)
   }fnally{
   print(abc)
   }

//2. 无限循环
   try{
   while(ture){
   print(abc)
   }
   }fnally{
   print(abc)

   }

//3. 线程被杀死
//  当执行 try,fnally 的线程被杀死时。fnally 也无法执行。
//总结
//1,不要在 fnally 中使用 return 语句。
//2,fnally 总是执行,除非程序或者线程被中断。

Exception和Error的区别

**答:**Exception和Error都继承了Throwable类。在java中,只有Throwable类型的实例才能被throw或者catch,Throwable是异常处理机制的基本组成类型。

Exception和Error体现了java平台设计者对不同异常情况的分类。Exception是程序正常运行中,可以预料到的意外情况,并且应该被捕获,进行相应的处理。Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常的,不可恢复的状态。既然是非正常情况,所以也不便于也不需要被捕获。例如OutOfMemoryError之类,都是Error的子类。

Exception又被分为可检查和不检查异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。不检查异常通常是可以通过编码避免的逻辑错误。具体根据需求来判断是否需要捕获异常。

问题扩展

NoClassDefFoundError和ClassNotFoundException有什么区别

1.首先,NoClassDefFoundError是一个错误,ClassNotFoundException是一个异常。

2.NoClassDefFoundError既然是一个错误,是指jvm加载类时候,某一个类没有找到导致的错误。一般是ClassLoader尝试加载类(例如引用或者new对象时),找不到这个类的定义,此时会暴露这个错误。当部署项目时候,jar包或者定义的类丢失会导致这样的问题出现。

3.ClassNotFoundException是一个异常。应该是编译不会发现问题,但是在项目运行时候或者调用方法应用时候,发生了异常。

比如 Class c = Class.forName(“com.demo.Test”).此时编译可过,但是真正运行该代码时候,如果com.demo.Test没有找到就会跑出ClassNotFoundException。上述将类名作为参数时候会出现这样的异常,所以要避免类名写错。

String,StringBuffer,StringBuilder的区别

**答:**String是Java语言非常基础和重要的类,提供了操作字符串的基本API。它是典型的不可变类,被声明成final class。所有的属性也都是不可以变的。也是由于不可变性,导致了拼接,裁剪字符串等操作,都会产生新的String对象,对性能,效率有着显著的影响。(会有一篇讲解String的不可变)

StringBuffer是为了解决String拼接等操作产生大量的中间对象而提供的一个类,我们可以调用它的append方法,把字符串添加到已有序列的末尾,或者指定位置。StringBuffer是一个线程安全的类,为了保证线程安全,也带来性能的额外开销。

StringBuilder是为了解决StringBuffer因为保证线程安全,而导致额外的性能开销的问题,是jdk1.5中新增的类,但是去掉了线程安全的部分。

基本类型和对应的包装类型的区别

答(以int为例):

java中有8中基本数据类型:byte,short,int,long,float,double,long,char,boolean。java虽说一切都是对象,但是基本数据类型是例外的。

Integer是Int的包装类型,它有一个int类型的属性存储数据,并且提供基本操作的API,比如数学运算,类型的转换等。在java5中,引入了自动装箱和拆箱的功能。

关于integer的值缓存,在java5中提供了静态方法,valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进,这个值默认缓存是-128到127之间。

重载和重写的区别

重写 总结:
1.发生在父类与子类之间 。

2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同。

3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 。

4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

重载 总结:
1.重载Overload是一个类中多态性的一种表现 。

2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序) 。

3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

接口和抽象类的区别

接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API定义和实现分离的目的,接口不能实例化,不能包含任何非常量成员,任何field都是常量,都隐含着public static final的意义。同时,不能有具体的分静态方法实现,也就是说要么是抽象方法,要么是静态方法。

抽象类是不能实例化的类,用abstract修饰class,其目的主要是代码重用,除了不能实例化,形式上和一般的java类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法,抽象类大多用于抽象相关java类的共用方法实现,或者共同的成员变量,然后通过继承的方式达到代码的复用。

ArrayList,Vector,LinkedList的区别

答:

Vector是Java早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。

ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与Vector近似,ArrayList也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector在扩容时会提高1倍,而ArrayList则是增加50%。

LinkedList顾名思义是Java提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。

Hashtable、HashMap、TreeMap、ConcurrentHashMap的区别

Hashtable、HashMap、TreeMap都是最常见的一些Map实现,是以键值对的形式存储和操作数据的容器类型。
Hashtable是早期Java类库提供的一个哈希表实现,本身是同步的,不支持null键和值,由于同步导致的性能开销,所以已经很少被推荐使用。
HashMap是应用更加广泛的哈希表实现,行为上大致上与HashTable一致,主要区别在于HashMap不是同步的,支持null键和值等。通常情况下,HashMap进行put或者get操
作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户ID和用户信息对应的运行时存储结构。
TreeMap则是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、put、remove之类操作都是O(log(n))的时间复杂度,具体顺序可以由指定
的Comparator来决定,或者根据键的自然顺序来判断。

ConcurrentHashMap是线程安全的HashMap,内部数据结构与HashMap一致。(这一部分会详细讲解)

同步/异步,阻塞/非阻塞的区别

同步、异步(消息通知机制):

  • 同步,就是发起调用后,被调用者处理消息,必须等处理完才直接返回结果,没处理完之前是不返回的,调用者主动等待结果;
  • 异步,就是发起调用后,被调用者直接返回,但是并没有返回结果,等处理完消息后,通过状态、通知或者回调函数来通知调用者,调用者被动接收结果。

阻塞、非阻塞(CPU线程调度):

  • 阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;
  • 非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值