Java基础名词的比较

    技术2023-09-18  80

    一、JDK和JRE的区别

      JDK是java开发工具包,里面包含jre所有的内容,还包括编译器和一些工具

      JRE是java运行时环境,里面包含了运行已编译的java内容的工具的集合,包括虚拟机,java类库,java命令等

      如果是运行已编译的java程序,那么只需要安装jre即可,如果需要编程,需要安装jdk

    二、Java和C++的区别

      1.java和c++都是面向对象的编程,都支持封装,继承,多态这三大特性

      2.java不支持指针直接访问内存,数据更加安全

      3.java是单继承的,C++是多继承的。但是java中接口可以多继承

      4.java有自动内存管理机制,不需要程序员手动释放内存

      5.在C语言中,字符串和字符数组的后面都需要“\0”来表示结束,java不需要

    三、编译型语言和解释型语言

      编译型语言是把所有的源代码一次性的翻译成机器码

      解释型语言是逐行把源代码翻译成机器码

      Java是先把.java文件编译成.class文件,再用解释器逐行解释为机器码(先编译后解释)

    四、java中只有值传递

      Java程序设计语音对于对象的传递不是引用调用,实际上对象引用是按值传递的

      1.一个方法不能修改一个基本类型的参数

      2.一个方法可以改变一个对象参数的状态

      3.一个方法不能让一个对象参数引用一个新的对象

    五、重载和重写(覆盖)的区别

    重载发生在类的内部,方法名相同,参数列表不同,返回值不要求,抛出的异常不要求 重写发生在子类继承时,方法名相同,参数列表相同,返回值相同,抛出的异常更少或删除,修饰符相同或更宽。

    六、面向过程和面向对象的区别

    面向过程比面向对象高。面向对象需要实例化对象,需要消耗资源。对性能要求较高的程序,例如单片机,linux等,一般采用面向过程开发 面向对象比面向过程更灵活,易维护,易复用,易扩展。因为面向对象有封装,继承,多态等特性,所以可以设计出低耦合的系统。

    但是java语言慢主要还是因为java是运行在虚拟机上的,需要先编译成字节码再解释成机器语言。

    补:java语言给人留下慢的印象是因为最初的虚拟机中的执行引擎中只有解释器,没有JIT及时编译器,所以会显得比较慢,但是随着技术的发展,java的运行速度已经几乎可以和C等语言的运行速度媲美。

    七、this,super,static,final关键字

    this.(参数列表):调用本类中其他的构造方法,必须是构造方法的第一行。

    super.:调用父类中被覆盖的方法

    super(参数列表):子类调用父类的构造方法,必须在构造方法的第一行

    为什么说this和super都在构造方法的第一行呢?

    this()在第一行会调用本类其他构造方法,这个构造方法的第一行还是super(),故真正在第一行的还是super()。

    static修饰的成员属于这个类,被这个类的所有对象共有。 常用的场景: static修饰的方法只能调用其他的静态方法或者是静态属性。通过类名.方法名(属性名)调用 static修饰的静态代码块在类加载的时候执行一次。

    final关键字修饰的类不能被继承

    final修饰的方法不能被重写,被private修饰的方法会被隐式的指定为final修饰的方法

    final修饰的变量不能一旦初始化之后值不能被修改,如果是引用类型,引用的地址不会被修改。

    八、继承和多态

    ①.继承不能继承父类中的私有变量或者私有方法。每一个类都只能有一个直接父类。 ②.多态不能调用只在子类中存在不在父类中存在的方法 ③.B继承A,C继承B,可以用A引用指向C对象。可以实现多继承。

    九、接口和抽象类的区别

    语法上: ①、接口中只能有公开静态常量,抽象类中可以有任意属性 ②、接口中没有构造方法,抽象类中有构造方法 ③、接口可以多实现,抽象类只能单继承 ④、接口中只能是公开抽象方法(JDK9引入私有方法和静态方法),抽象类中可以有任何方法。 应用上: ①、接口主要用于对系统结构方法的设计,联系各个模块。 ②、抽象类主要在代码方面体现作用,实现代码的复用。在父类中定义子类相同的部分,把不同的部分留给子类去重写。

    十、String,StringBuilder,StringBuffer的区别

    ①、String中保存的对象是不可变的,因为String底层保存字符串中字符的数组是用final修饰的。StringBuilder和StringBuilder 都是继承AbstractStringBuilder的,底层存放字符串的字符数组没有用final修饰,所以这两种对象是可变的。 ②、StringBuffer中对方法加了同步锁,StringBuilder没有加。故前者是线程安全的,后者是线程不安全的。后者比前者效率高10%-20% 注:String类中的equals方法是先比较引用地址是否相同,相同返回true,不同比较内容是否相同。 应用场景: 操作少量数据用String 单线程下操作大量数据用StringBuilder 多线程下操作大量数据用StringBuffer

    补:String.StringBuilder,StringBuffer类底层都是使用final关键字修饰的,都是引用不可变,对象可变

    十一、hashcode()和equals()的区别

    hashcode()是获取对象在哈希表中的索引位置 ①、equals比较相等hashcod一定相等 ②、重写equals()必须重写hashcode() ③、hashcode相同两个对象不一定相同

    十二、线程,进程和程序的区别

    程序是含有指令和数据的文件,存储在磁盘或者其存储设备中 进程是程序的一次运行,一个进程包含多个线程。 进程和线程的区别: ①、每个进程之间都有独立的数据和内存空间 ②、一个进程之间的线程使用的都是该进程的资源,线程的堆空间和栈空间是共享的,虚拟机栈,本地方法栈,程序计数器是线程私有的。

    ③、多个进程可以同时执行,同一时间只能有一个线程拿到CPU时间片 线程的六种状态:初始化,运行,等待,超时等待,阻塞,终止。

    十三、HashSet,LinkedHashSet,TreeSet的区别

    HashSet底层是HashMap实现的,HashMap底层是数组+链表实现的,JDK1.8之后加入红黑树,当链表长度大于阈值时,链表自动转换为红黑树。 LinkedHashMap是HashMap的子类,能够按照添加的顺序遍历 TreeSet底层是红黑树,可以按照元素的添加顺序排序,也可以自定义排序规则。

    补:为了保证线程的安全而且并发效率高,使用的是CurrentHashMap,在jdk1.7之前采用的是分段锁的方法,jdk1.8之后舍弃了分段锁,采用了CAS算法,是一种无锁算法。

    十四、ArrayList和LinkedList的区别

      ArrayList底层是数组实现的,所以查询快,增删慢,LinkedList底层是用链表实现的,所以增删快,查询慢

      LinkedList比ArrayList占用的空间更多,因为每一个节点都存储了两个引用,分别指向前一个结点和后一个节点

    十五、HashTable和HashMap的区别

      HashTable是线程同步的,HashMap是线程不同步的。 

      继承的类不同,HashTable继承了Dictionary,HashMap继承了AbstractMap。两者都实现了Map接口

      HashTable中不允许出现null值,HashMap中可以有一个键的值为null,一个或多个值可以为null。

      扩容方式不同,前者初始长度为11,每次扩容为old*2+1。后者初始长度默认为16,且每次扩容的长度都为2倍。

      哈希值的使用不同,前者直接使用对象的HashCode,后者重新计算哈希值

      遍历方式不同,虽然两者都是用Iterator遍历,但是HashTable中还有Enumeration遍历

    十六、实例变量和类变量的区别

      实例变量和类变量都在类中,方法和构造方法之外。

      实例变量随着对象的创建而创建,随着对象的销毁而销毁,对于每一个对象来说是私有的。

      类变量一般是static修饰的变量,在程序启动时就会创建,是本类的全部对象共有的,任何一个对象改变他的值其他对象中也会改变。

    十七、BIO和NIO的区别

      BIO是面向流的,NIO是面向缓冲区的

      BIO是同步阻塞的,操作简单,并发效率低

      NIO是同步非阻塞的,客户端和服务器之间使用通道通讯,实现多路复用

      AIO是异步非阻塞的,

    Processed: 0.014, SQL: 9