一、接口和抽象类的区别

  • 抽象类中可以含有构造方法,而接口内不能有。
  • 抽象类中可以有普通成员变量,而接口中不能有。
  • 抽象类中可以包含非抽象的普通方法,而接口中所有方法必须是抽象的,不能有非抽象的普通方法。
  • 抽象类中的抽象方法的访问类型可以是public、protected和默认类型,但接口中的抽象方法只有public和默认类型。
  • 抽象类中可以包含静态方法,接口内不能包含静态方法。
  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以是任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。
  • 一个类可以实现多个接口,但只能继承一个抽象类。
  • 接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码重用。

二、java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些?

  1. 程序计数器:线程私有,当前线程执行的字节码的行号指示器。
  2. 虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型。
  3. 本地方法栈:为虚拟机使用到的Native方法服务。
  4. java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域。
  5. 方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
  6. 运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。
  7. 直接内存:不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,容易引起OOM异常,NIO会调用,不受Java堆大小的限制。

三、HashMap与HashTable的区别?

  1. HashTable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
  2. HashTable的方法是同步的,而HashMap的方法不是,因此HashTable是线程安全的,但是代码的执行效率上要慢于HashMap。
  3. HashMap允许空值和空键,但是HashTable不可以。
  4. HashMap非同步实现Map接口,是一个【链表数组】的数据结构,最大承载量是16,可以自动变长,由Entry[]控制(key、value、next),hashCode() 判断key是否重复。
  5. 建议:如果需要做同步,使用ConcurrentHashMap,降低了锁的粒度。在HashMap的基础上,ConcurrentHashMap将数据分为多个segment,默认为16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁的几率,提高并发效率。这里在并发读取时,除了key对应的value为null之外,并没有使用锁。

四、ArrayList和LinkedList的区别?

  1. ArrayList基于数组实现,LinkedList基于链表实现ArrayList增加和删除比LinkedList慢,但是LinkedList在查找的时候需要递归查找,效率比ArrayList慢。关于多线程方面,如果要求线程安全的,有一个Vector,不过比较多的使用是CopyOnWriteArrayList代替ArrayList,CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景中,比如缓存。发生修改时做copy,新老版本分离,保证读的高性能,适用于以读为主的情况。

五、Set接口

  1. HashSet是Set接口的典型实现,HashSet使用hash算法来存储元素,因此具有很好的存取和查找性能。缺点:无法保证元素的排列顺序,顺序有可能发生变化;HashSet是异步的;集合元素值可以是null;当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode() 方法来得到该对象的hashCode值,然后根据该HashCode值来确定该对象在HashSet中存储的位置。HashSet还有一个子类LinkedHashSet,其集合也是根据元素hashCode值来决定元素存储位置,但它同时用链表来维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHashSet集合元素时,它将会按元素的添加顺序来访问集合中的元素。所以LinkedHashSet的性能略低于HashSet,但在迭代访问全部元素时将有很好的性能,因为它以链表维护内部顺序。
  2. TreeSet是SortSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态。TreeSet不是根据元素插入顺序进行排序的,而是根据元素的值来排序。TreeSet支持两种排序方法:自然排序和定制排序。
  3. EnumSet中所有值都必须是指定枚举类型的值,它的元素也是有序的,以枚举值在枚举列的定义顺序来决定集合元素的顺序。EnumSet集合不允许加入null元素,否则抛出NPE(NullPointerException)异常。EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象。
  4. 总结:它们都是线程不安全的。Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2) = false,Set最多有一个null元素。A.  HashSet的性能比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的Set时,才会用TreeSet。B.  EnumSet是性能最好的,但它只能保存枚举值。
  5. 关于HashSet,条目数和容量之和来讲,迭代是线性的。因此,如果迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选的太大,既浪费空间,也浪费时间。默认的初始容量是101,一般来讲,它比你所需要的多。可以用int构造函数来指定初始容量。如下:
Set s = new HashSet(15)

六、Set中的区别

  1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。
  2. Map的key和Set都有一个共同点就是集合的唯一性,TreeMap更多的是提供了一个排序的功能。
  3. hashCode() 和 equal() 是HashMap用的,因为无需排序所以主需要关注定位和唯一性即可。
  4. 说明:hashCode()是用来计算hash值的,hash值用来确定hash表的索引,hash表中的一个索引处存放的是一张链表,所以还需要用equal方法循环比较链上的每一个对象,才可以真正定位到键值对应的Entry。put时如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则替换Entry中的value,并返回旧value。
  5. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较,当然也是用它定位的。说明:Comparator可以在创建TreeMap时指定;如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口。TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了。

  

java中级,知识点归纳(一)的更多相关文章

  1. Java中级知识归纳(四)

    十六.Java内存模型 特点:原子性.可见性.有序性. 原子性:read.load.use.store.write.synchronized关键字保证原子性 可见性:synchronized.vola ...

  2. Java中级知识归纳(三)

    十一.Java垃圾回收机制 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间.可以使用显式调用,System.gc();Runtim ...

  3. Java中级知识归纳(二)

    六.Java中Collection和Collections的区别? java.util.Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法. java.util.Coll ...

  4. 给Java新手的一些建议----Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  5. 给Java新手的一些建议——Java知识点归纳(Java基础部分)

    原文出处:CSDN邓帅 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些Java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行 ...

  6. 给Java新手的一些建议——Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  7. 给Java新手的一些建议----Java知识点归纳(J2EE and Web 部分)

    J2EE(Java2 Enterprise Edition) 刚出现时一般会用于开发企业内部的应用系统,特别是web应用,所以渐渐,有些人就会把J2EE和web模式画上了等号.但是其实 J2EE 里面 ...

  8. 【重走Android之路】【路线篇(二)】知识点归纳

    [重走Android之路][路线篇(二)]知识点归纳   参考:http://blog.csdn.net/xujing81/article/details/7313507   第一阶段:Java面向对 ...

  9. Java基础知识点(一)

    前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新...... 1.Java的访问权限 Java中有四种访问权限:默认访问权限.public.p ...

  10. 初学Java 精简知识点总结

    面对Java丰富的知识资料,很多初学者难免觉得迷惘,该学什么,怎么去学?下面给大家讲Java基础知识做了精简总结,来帮助你梳理学习思路,赶快看看吧! 方法/步骤1 对象的初始化(1) 非静态对象的初始 ...

随机推荐

  1. pycharm2019.2一个奇怪的bugger,执行后输出内容被莫名处理

    2019-08-20 07:45:07 python爬虫是一直来大家都用的多的,我也是常常用到. requests做请求方便的很,但是今天却遇到requests的bug.text内容不可信. pych ...

  2. /cygdrive/c/MinGW/bin/autoconf-2.68: line 501: /mingw/bin/autom4te-2.68: No such file or directory

    出现如下错误 编译openssh的时候 # autoconf /cygdrive/c/MinGW/bin/autoconf-2.68: line 501: /mingw/bin/autom4te-2. ...

  3. linux下搭建jenkins

    为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...

  4. git在idea中的冲突解决(非常重要)

    1.什么是冲突 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致.读起来有点绕,结合下面的案例理解. 从上面对冲突的定义来看,冲突时发生在同一个文件上的. 2.生产上冲突的场景 常见冲突的 ...

  5. 如何优雅地停止Spark Streaming Job

    由于streaming流程序一旦运行起来,基本上是无休止的状态,除非是特殊情况,否则是不会停的.因为每时每刻都有可能在处理数据,如果要停止也需要确认当前正在处理的数据执行完毕,并且不能再接受新的数据, ...

  6. flask接收跨域请求

    ajax发送数据类型为json即可 接受数据详见下文 https://www.cnblogs.com/anxminise/p/9814326.html

  7. Linux—添加开机启动(服务/脚本)

    系统启动时需要加载的配置文件 /etc/profile./root/.bash_profile/etc/bashrc./root/.bashrc/etc/profile.d/*.sh./etc/pro ...

  8. Lnmp架构部署动态网站环境.2019-7-3-1.3

    Php安装 一.安装准备 1.Php依赖包 [root@Lnmp tools]# yum install -y zlib libxml libjpeg freetype libpng gd curl ...

  9. TensorFlow Federated:基于分散式数据的机器学习

    https://www.tensorflow.org/federated/ TensorFlow Federated (TFF) 是一个开源框架,用于对分散式数据进行机器学习和其他计算.我们开发 TF ...

  10. 电商网站名词item-->SKU与SPU

    一.总述: item sku spuitem 代表一种商品,是和店铺关联的.sku 商品的库存量单位 , 代表商品的规格和属性spu 产品单位最小分割的商品 ,与商家无关 它的属性会影响价格. 简单的 ...