• 一些与“区别“相关的知识点


    Java与C++的区别

    • C++中有指针的概念,Java中去掉了指针的功能,规避了指针使用中可能存在的混乱情况
    • Java具有良好的平台间移植性,可以一次编写,到处运行
    • C++中的垃圾对象需要程序员自己回收,而Java则不需要程序员自己完成这个工作,有自己的垃圾回收机制
    • Java不需要引入头文件,而是去导包,import 和 package.

    ==和equals

    == 运算符: 作用于基本类型值时,是比较两个数值是否相等。
    作用于引用数据类型时,是比较两个对象的内存地址是否相同,即判断他们是否为同一个对象
    equals(): 没有重写时,默认使用==实现的,
    进行重写后,按照对象的内容来进行比较。内容相同返回true,不同就false。

    重载和重写

    重载

    • 在同一个类中,同名的方法有着不同的参数列表(参数类型不同,参数个数不同,参数顺序不同)则称为重载。与返回值类型无关。
    • 重载(Overload)是一个类中多态性的一种表现

    重写

    • 发生在父类和子类之间
    • 方法名,参数列表,返回值类型必须相同
    • 子类方法访问修饰符的权限一定不能低于父类方法的访问修饰符
      权限比较:(public>protected>default>private)

    String,StringBuffer,StringBuilder

    • String是底层结构是final修饰的,不可变,不能被继承,每次操作都会产生新的对象
    • StringBuffer和StringBuilder都是在原对象上进行操作的
    • StringBuffer是线程安全的,StringBuilder是线程不安全的
    • StringBuffer的方法通过synchronized修饰,所以安全
    • 性能:StringBuilder>StringBuffer>String
    • 场景:经常需要改变字符串内容时优先使用后面两个

    自动拆箱,自动装箱

    装箱:把一个基本类型的数据直接付给对应的包装类型
    拆箱:把一个包装类型的对象直接付给对应的基本类型
    可以大大简化基本类型与包装类对象之间的简化过程,比如:某个方法的参数类型为包装类型,调用时我们所持有的数据却是基本类型的值,则可以不做任何特殊的处理,直接将这个基本类型的值传给方法即可。

    jdk和jre的区别

    JDK是Java的开发工具,它不仅提供了Java程序运行所需的JRE,还提供了一系列的编译,运行等工具,如javac,java,javaw等。JDK包含了JRE和JVM
    JRE只是Java程序的运行环境,它最核心的内容就是JVM(Java虚拟机)及核心类库

    集合和数组的区别

    • 集合的容量是可以自增的,而数组是固定长度的
    • 提供了高性能的数据结构和算法,提高了代码复用性和可操作性
    • 可以方便地扩展或改写集合,提高代码的复用性和可操作性
    • 通过使用JDK自带的集合类,可以降低代码维护和学习API成本

    Collection和Collections的区别

    • Collection是一个集合接口(集合类的一个顶级接口),它提供了对集合对象进行基本操作的通用接口方法。
    • Collections是一个包装类,它包含有各种有关集合操作的静态多态方法。
    • Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式其直接继承接口有ListSet.
    • Collections,此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。

    3. Array和ArrayList的区别

    • 存储的内容:Array 数组可以包含基本类型和对象类型,ArrayList却只能包含对象类型。Array 数组在存放的时候一定是同种类型的元素。ArrayList 就不一定了 。
    • 空间大小:Array 数组的空间大小是固定的,所以需要事前确定合适的空间大小。ArrayList的空间是动态增长的,而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。
    • 方法:ArrayList方法上比 Array更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。

    ArrayList和LinkedList

    • ArrayList底层是一个动态数组,LinkedList底层是一个双向链表
    • 插入,删除时,LinkedList的效率高,查询时,ArrayList的效率高
    • 对于随机访问方法get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针

    Hashtable和HashMap

    • Hashtable是线程安全的,他的方法上都有一个sychronized关键字进行加锁.而HashMap是线程不安全的.
    • Hashtable不允许键和值为空,而HashMap允许键值为空,但是只允许一个键为空
    • HashMap是没有contains方法的,而包括containsValue和containsKey方法;hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。
    • HashMap每次扩容是原来容量的两倍(不是size的二倍),Hashtable扩容为原容量的2倍+1

    深拷贝和浅拷贝

    • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 。
    • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象。
    • 区别:浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;深拷贝改变新对象不会影响原对象,他们之前互不影响。

    序列化与反序列化

    • 序列化
      概念:把Java对象转换为字节序列的过程
      作用:在传递和保存对象时,保证对象的完整性和可传递性,对象转换为有序的字节流,以便在网络上传输和保存在本地
      优点:将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)
      序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。
      通过序列化可以在进程间传递对象。
    • 反序列化
      把字节序列转换为Java对象的过程

    字节流和字符流的区别?

    字节流读取的时候,读到一个字节就返回一个字节;

    字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。

    字节流可以处理所有类型数据,如:图片,MP3,Mp4视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

    字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、InputStream字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。

    MyISAM与InnoDB的区别

    MyISAM:

    • 不支持事务,但是每次查询都是原子的
    • 支持表级锁,即每次操作都是对整个表加锁;
    • 存储表的总行数
    • 采用非聚簇索引,索引文件的数据域存储指向数据文件的指针,索引和数据是分离开的。辅索引与主索引基本一致,但是辅索引不用保证唯一性

    InnoDB:

    • 支持ACID事务,支持事务的四种隔离级别
    • 支持行级锁和外键约束:因此可以支持写并发
    • 不存储总行数
    • 采用的是聚簇索引,数据文件和索引是绑定在一起的,必须要有主键

    并发,并行,串行

    • 并发指两个或多个事件在同一时间间隔内发生,即交替做不同事的能力,多线程是并发的一种形式。
    • 并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时进行,即同时做不同事的能力
    • 串行在时间上不可能发生重叠,前一个任务没搞定,下一个任务只能干等着。

    线程与进程

    根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度的基本单位

    资源开销:线程可以看是一种轻量级进程,同一类线程共享代码和数据空间,每个线程都有自己的独立运行栈和程序计数器,所以说线程之间切换的开销较小。

    包含关系:如果一个进程内有多个线程,那么执行过程是由这些线程共同完成的;线程是进程的一部分,所以线程也被称为轻量级进程

    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

    影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃后,会对其他线程产生影响,从而导致进程崩溃掉.

    单例模式中饿汉模式与懒汉模式

    • 饿汉模式:在类加载的同时,就创建线程实例,后面直接使用即可
    • 懒汉模式:类加载的时候不会创建,第一次使用的时候才会创建实例
    • 懒汉模式是线程不安全的,解决方法:把创建实例的代码放在一个方法中,然后给这个方法加上一个synchronized锁,以保证线程安全。
    • 懒汉模式的优化:在加锁的基础上,使用双重if判定,降低锁的竞争频率;给instance加上volatile关键字,保证其可见性.

    Thread和Runnable

    • 首先,创建线程的方式不一样,Thread是一个类,需要一个类去继承,然后重现run()方法,而Runnable是一个接口,需要一个类去实现,然后重写run()方法
    • 调用start方法时,extends Thread :t.start();
      implements Runnable : new Thread(t).start();
    • 如果有复杂的线程操作请求,就使用Thread,如果只是简单的执行一个任务,就用Runnable

    sleep,wait,yield,join

    • sleep:Thread的静态方法,将cpu的执行资格和执行权让出去,不再运行此线程,当定时时间过了后,参与cpu的调度,获取到cpu的使用权后就可以继续运行了。sleep不依赖同步器synchronized。

    • wait:Object类的方法,当线程调用wait方法后,会将线程放入到等待池中,不会自动唤醒,得依靠notify,notifyAll方法。依赖同步器synchronized。

    • yield:执行后线程会进入就绪状态,并且,马上释放cpu的使用权,但是保留了cpu的执行资格。

    • join:执行后线程进入阻塞状态,在B中调用A的join,B线程会进入阻塞态,一直到A结束或者中断线程

    sleep() 和wait()

    • sleep() 是 Thread类的静态本地方法;wait() 是Object类的成员本地方法
    • sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread “Thread-0” java.lang.IllegalMonitorStateException
    • sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态

    synchronized 和 volatile

    • volatile 仅能使用在变量级别,synchronized 则可以使用在变量、方法、类级别、代码块上。
    • volatile 仅仅能实现变量修改可见性,并不能保证原子性,volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取,synchronized 可以实现变量的修改可见性和原子性。
    • volatile 不会造成线程阻塞,synchronized 可能会造成线程阻塞。
    • volatile 标记的变量不会被编译器优化,synchronized 标记的变量可以被编译器优化。
    • volatile 修饰的变量,jvm 每次都从主内存中读取,而不会从寄存器(工作内存)中读取。synchronized 表示只有一个线程可以获取作用 对象 的锁,执行代码,阻塞其他线程。
    • volatie 仅能实现变量的可见性,无法保证变量操作的原子性。而synchronized可以实现变量的可见性与原子性。

    synchronized和lock都能进行加锁,那么区别是什么呢?

    • 从语法上看:synchronized是自动的加锁释放锁,而lock是我们进行显式(手动)来加锁和释放锁(执行完,不管是否出现异常,都需要释放锁)。Lock相对就更加的灵活。

    • lock提供了更多的获取锁的方式:

      lock():和synchronized申请锁类似,申请失败就干等(无条件等)

      lockInterruptibly():可被中断的申请锁(申请失败等待时,可以被其它线程中断)

      tryLock():尝试获取锁(不阻塞),如果申请成功就加锁返回true,反之马上就返回false。

      tryLock(long timeout,TimeUnit unit):尝试获取锁,如果申请失败,是超时等待(等待一段时间),这段是时间过去后还没获取到锁,就返回false。

    • 从效率上看,当线程冲突比较严重的时候,lock的性能要高很多。
      synchronized在申请锁成功的线程释放锁以后,所有之前因为申请锁失败而阻塞的线程,都会再次竞争。
      lock是基于aqs来实现:aqs是一个双端队列,专门用来进行线程状态的管理;相当于:竞争锁失败的线程就放到队列中(入队),并设置状态(未获取到锁),释放锁以后,把队列中的线程引用拿出来,设置状态(获取到锁),aqs提供了很多种方法,用来方便的实现独占锁/共享锁,公平锁/非公平锁lock就是基于aqs独占锁的方式来实现,提供了公平和非公平锁的设置。公平就相当于队列的先进先出,非公平锁就是我们的随机出队。

    TCP,UDP

    • TCP是面对连接的可靠的服务,UDP是无连接的不可靠的服务
    • TCP是面向字节流的,UDP是面对数据报文的
    • TCP只支持点对点通信,UDP支持一对一,一对多,多对多
    • TCP有拥塞控制机制,UDP没有

    使用场景:对某些实时性比较高的情况,选择UDP,比如游戏,媒体通信,直播等等,即使出现了传输错误也是可以容忍的;其他大部分情况下,HTTP都是使用的TCP,因为要求传输的内容要可靠,不允许出现丢失.

    HTTP和HTTPS

    • HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
    • HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    • HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

    Cookie和Session

    • 存储位置不同:cookie将数据存储在客户端浏览器,session将数据存储在服务器
    • 安全性高低:cookie的安全性较低,存储信息是明文显示的,可以随意的修改和伪造,session将数据存储在服务器中,安全性较高
    • 信息重要程度:一般比较重要的信息都是存储在session中的,其他需要保留的信息都是存储在cookie中
    • 服务器性能:session将数据存储在服务器中上,当访问增多的话,会比较占用服务器资源,如果要考虑服务器性能,那就将一部分数据存储在cookie中.

    GET和POST

    • url可见性:get参数url可见;​post,url参数不可见

    • 数据传输上:get通过拼接url进行传递参数;post,通过body体传输参数

    • 缓存性:get请求是可以缓存的,post请求不可以缓存

    • 后退页面的反应: get请求页面后退时,不产生影响
      post请求页面后退时,会重新提交请求

    • 传输数据的大小: get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
      post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。

    DDL,DML,DCL

    • DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 c r e a t e 、 d r o p 、 a l t e r create、drop、altercreate、drop、alter 等。
    • DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录(增删改查),并检查数据完整性,常用的语句关键字主要包括 i n s e r t 、 d e l e t e 、 u d p a t e insert、delete、udpateinsert、delete、udpate 和 s e l e c t selectselect 等。
    • DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 g r a n t 、 d e n y 、 r e v o k e 、 c o m m i t 、 s a v e p o i n t 、 r o l l b a c k grant、deny、revoke、commit、savepoint、rollbackgrant、deny、revoke、commit、savepoint、rollback 等。
  • 相关阅读:
    动态环境下的语义SLAM算法
    简析区块链节点运营的门槛、方法和难点
    JavaScript 最新动态:2024 年新功能
    C Primer Plus(6) 中文版 第10章 数组和指针 10.8 变长数组(VLA)
    广度优先搜索简介
    缓存服务——Redis集群简介
    SpringBoot【SpringBoot指标监控、SpringBoot日志管理、SpringBoot项目部署、 SpringBoot容器化部署】(五)-全面详解(学习总结---从入门到深化)
    MySQL基础进阶
    YOLO物体检测-系列教程7:YOLOV3源码解读5之 Darknet
    RichView TRVStyle
  • 原文地址:https://blog.csdn.net/weixin_47278183/article/details/126967012