【Java面试题】Java基础语法

news2024/9/24 3:22:09

文章目录

  • JDK、JRE和JVM的关系
  • 栈和堆分别存的什么数据
  • 异步和同步
  • 线程和进程区别
  • java的数据类型有哪些
  • equals和HashCode重写的问题?
  • 深拷贝和浅拷贝的区别
  • ==和equals的区别
  • 常见的运行时异常有哪些?

JDK、JRE和JVM的关系

JDK、JRE和JVM的关系:

  • JDK(Java Development Kit)是Java开发工具包的缩写,包含了Java编译器、Java运行时环境(JRE)和其他开发工具。JDK是开发Java应用程序的必备工具,它提供了编写、编译、调试和运行Java程序所需的所有组件。
  • JRE(Java Runtime Environment)是Java运行时环境的缩写,包含了Java虚拟机(JVM)和Java类库。JRE提供了Java程序运行的环境,包括了Java虚拟机和Java类库,可以让Java程序在任何支持Java虚拟机的操作系统上运行。
  • JVM(Java Virtual Machine)是Java虚拟机的缩写,是Java程序执行的核心组件。JVM是一个虚拟计算机,它可以在任何支持Java虚拟机的操作系统上执行Java程序。JVM负责将Java源代码编译成字节码,并在运行时解释执行字节码。

因此,可以简单地将JDK看作是开发工具包,JRE看作是Java程序运行的环境,而JVM则是Java程序执行的核心组件。在实际使用中,通常需要安装JDK来开发Java应用程序,然后通过命令行或集成开发环境(IDE)来运行JRE来测试和调试Java程序,最终通过JVM来执行Java程序。

在这里插入图片描述

栈和堆分别存的什么数据

栈和堆是计算机内存中的两种数据结构,它们分别用于存储不同类型的数据。

  1. 栈(Stack):栈是一种后进先出(LIFO)的数据结构,也就是说最后进入栈的数据会最先被弹出。栈通常用于存储函数调用时的参数、局部变量、返回地址等数据。在Java中,基本类型数据(如int、float、char等)和对象引用都属于栈上数据,而数组元素也是栈上数据。

  2. 堆(Heap):堆是一种先进先出(FIFO)的数据结构,也就是说最先进入堆的数据会最先被弹出。堆通常用于存储动态分配的内存,比如Java中的new操作符创建的对象、数组等。在Java中,对象实例和数组元素都属于堆上数据。

补充:堆是一种树形数据结构,它可以动态地分配和回收内存,支持高效的插入、删除和排序等操作。

需要注意的是,Java中的垃圾回收机制会自动管理堆上的内存分配和释放,程序员不需要手动进行内存管理。

在这里插入图片描述

异步和同步

异步调用和同步调用都是指程序中不同组件之间的调用方式。

在同步调用中,**程序的某个组件会在调用另一个组件时等待该组件完成后,才会继续执行下一步操作。**也就是说,在同步调用过程中,程序的运行会阻塞等待被调用组件的响应结果。

而在异步调用中,程序的调用不会等待被调用组件返回结果,而是继续执行下一步操作。被调用组件会通过回调函数或事件通知的方式返回结果,程序在收到结果后再对其进行处理。也就是说,在异步调用过程中,程序的运行不会被阻塞,可以同时执行多个调用操作。

异步调用通常用于网络请求、GUI编程和其他需要同时处理多个任务的场景中,而同步调用通常用于需要依次处理任务的场景中。

线程和进程区别

在这里插入图片描述

线程和进程是操作系统中用于实现多任务处理的两个基本概念,它们有以下区别:

  1. 资源占用:一个进程可以独立占用系统资源,如内存、CPU等;而一个线程只能占用一定的系统资源,如栈空间、寄存器等。
  2. 调度:进程是操作系统中的独立实体,它可以被操作系统分配资源和调度执行;而线程是在进程内部的执行单元,它的调度由进程管理。
  3. 通信:由于进程之间是相互独立的,它们之间的通信需要通过进程间通信(IPC)机制来实现;而线程之间共享同一个进程的内存空间,因此可以直接进行通信。
  4. 数据保护:由于每个进程都有自己独立的内存空间,因此不同进程之间的数据是相互隔离的;而线程共享同一个进程的内存空间,因此需要注意数据保护的问题。

总之,线程和进程都是实现多任务处理的基本概念,它们各自具有不同的特点和优缺点,在实际应用中需要根据具体的需求选择合适的方式。

补充:**一个进程可以包含多个线程,这些线程共享同一个进程的内存空间和系统资源。**在Java中,一个进程可以包含多个线程,这些线程可以通过继承Thread类或实现Runnable接口来创建。

java的数据类型有哪些

类型占用字节取值范围包装类默认值
byte(字节型)1-128~127(-2的7次方到2的7次方-1)Byte0
short(短整型)2-32768~32767(-2的15次方到2的15次方-1)Short0
int(整型)4-2147483648~2147483647(-2的31次方到2的31次方-1)Integer0
long(长整型)8-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)Long0L
float(浮点型)43.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方Float0.0f
double(双精度浮点型)81.797693e+308~4.9000000e-324(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方Double0.0d
boolean(布尔型)2true falseBooleanfalse
char(字符型)1汉字字母都可以Character\u0000

equals和HashCode重写的问题?

在Java中,Object类中提供了equals()和hashCode()方法用于比较对象是否相等以及生成对象的哈希码。默认情况下,equals()方法会比较对象的内存地址,而hashCode()方法则会根据对象的属性值计算出一个整数值作为哈希码。

重写equals方法后,即使两个对象的属性值完全相同,它们也被认为是相等的。这是因为equals方法比较的是对象是否相等,而不是对象的哈希码是否相等。

因此,如果我们不重写hashCode方法,那么即使两个对象相等,它们的哈希码也可能不同。这会导致在使用哈希表等数据结构时出现意外的结果。

另外,如果多个对象具有相同的属性值,那么它们可能会被认为相等,从而出现在哈希表中出现多次的情况。这会影响哈希表的性能和正确性。

因此,为了保证对象在哈希表中的正确性和性能,我们需要重写hashCode方法,确保每个对象都有唯一的哈希码。通常的做法是将每个属性的值取反后再进行求和,这样可以避免哈希冲突的问题。

一般情况下,我们保证,当两个对象的Hashcode相同的时候对象不一定相同,但是当两个对象的equals方法相同时,这两个对象一定相同。

**举例:**如果我们有1000万个对象,这个时候要找出外界输入的对象,判断和我们1000万个对象中哪个对象相等,这个时候我们会先调用hashcode方法,去大大的缩小范围,然后再使用equals方法,这样就可以大大提高我们寻找对象的速度。

深拷贝和浅拷贝的区别

**浅拷贝:**浅拷贝是指只复制对象本身的值,不复制它所引用的对象,因此新旧对象共享同一个引用对象。在 Java 中,可以通过实现 Cloneable 接口和覆盖 clone() 方法来实现浅拷贝。

**深拷贝:**深拷贝是指复制对象本身和所有它所引用的对象,因此新旧对象不共享任何引用对象。在 Java 中,可以通过实现 Serializable 接口和使用序列化/反序列化来实现深拷贝。例如:

==和equals的区别

  • == 既可以比较基本类型也可以比较引用类型,对于基本类型就是比较值,对于引用类型及时比较内存的地址

  • equals的话,他是属于java.lang.Object类里面的方法,如果该方法没有被重写过,默认也是== ,我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equasl是比较值的错误观点.

  • 具体要看自定义类里面有没有重写Object的equals方法来判断

  • 通常情况下,重写equals方法,会比较类中的属性是否相等

/**
 * ==和equals的区别
 */
public class Test_01 {
    public static void main(String[] args) {

        /**
         * 比较基本数据类型
         */
        int a=1;
        double b=1.0;
        char c=1;
        System.out.println(a==b);  //true
        System.out.println(a==c);  //true


        /**
         * 引用数据类型
         */
        Customer c1 = new Customer("小明", 20);
        Customer c2 = new Customer("小明", 20);
        System.out.println(c1 == c2);       //false
        System.out.println(c1.equals(c2));  //false


//      String
        String str1 = new String("sth");
        String str2 = new String("sth");
        System.out.println(str1 == str2);      // false
        System.out.println(str1.equals(str2)); // true


//      java中String new和直接赋值的区别
//      对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,
//      如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
        String s1="123"; //在常量池中
        String s2="123";
        System.out.println(s1==s2);  //true
        String s3 = new String("123");  //存储在堆内存中
        System.out.println(s1==s3);
        
        /**
         * Integer
         */
        Integer i1=1;
        Integer i2=1;
        System.out.println(i1==i2); //true

        Integer i3=128;
        Integer i4=128;
        System.out.println(i3==i4); //false
        System.out.println(i3.equals(i4));
    }
}
class Customer {
    private String namg;
    private int age;

    public Customer(){

    }

    public Customer(String namg, int age) {
        this.namg = namg;
        this.age = age;
    }

    public String getNamg() {
        return namg;
    }

    public void setNamg(String namg) {
        this.namg = namg;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

常见的运行时异常有哪些?

ArithmeticException(算术异常)

ClassCastException(类转换异常)

IllegalArgumentException(非法参数异常)

IndexOutOfBoundsException(下标越界异常)

NullPointerException(空指针异常)

SecurityException(安全异常)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库监控与调优【一】—— 数据库调优的维度

数据库调优的维度 左边是千金良方的,右边是个人优化的 业务需求 不合理的需求,可能会造成很多问题勇敢地对不合理的需求说不拨乱反正,把不合理的需求变成合理的需求 例子 财务SaaS系统,财务领域有种叫做代账的概念&#xff0c…

uniapp+vue3+vite+ts+uviewPlus搭建项目

创建项目架构 首先使用官方提供的脚手架创建一个项目,这里我创建的 vue3 vite ts 的项目: npx degit dcloudio/uni-preset-vue#vite-ts project-name(如命令行创建失败,请直接访问 giteehttps://gitee.com/dcloud/uni-preset-vu…

2023-06-20 x-ui-服务器配置记录

基础软件: yum update -y yum install -y curl yum install -y socat 工作软件: bash <(curl -Ls https://raw.githubusercontent.com/sprov065/x-ui/master/install.sh) 设置: 参考: 使用云服务器搭建代理-腾讯云开发者社区-腾讯云

9 HAL库驱动框架简述

目录 HAL库驱动框架简述 HAL库外设设计思想 HAL库和Cube MX相结合 一、对外设的封装——句柄结构体 二、外设初始化 初始化结构体 初始化的逻辑 三、外设使用逻辑 通用接口函数 初始化函数 I/O操作函数 控制函数 状态参数 扩展接口函数 总结 补充&#xff1a;H…

算法拾遗三十四线段树

算法拾遗三十四线段树 线段树说明物理结构使用线段树落方块的问题 线段树说明 给定固定长度的数组&#xff0c;然后要在数组给定的范围内完成加法【如数组1&#xff0c;200下标元素加6】&#xff0c;更新【7&#xff0c;375范围数组元素更新为4】&#xff0c;查询操作【查询3到…

【云原生丶Docker】Docker镜像加速器:给冰山提提速!

Docker镜像加速器是一种用于加速Docker镜像下载和构建的工具。它可以提高Docker镜像的下载速度&#xff0c;从而加快应用程序的开发和部署速度。 Docker镜像加速器通常使用CDN(内容分发网络)技术来实现加速。CDN是一种分布式网络架构&#xff0c;可以将内容缓存在全球各地的服务…

命令行--git--多次commit如何合并成一个commit

参考:https://blog.csdn.net/qq_50652600/article/details/120800309 在我们平时开发中&#xff0c;我们提交代码免不了要和git打交道&#xff0c;那么我们肯定是先从预发分支上&#xff08;公司一般都用pre命名&#xff0c;这里为了方便演示用master&#xff09;上拉去最新的代…

测试工程师首用chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

FPGA_学习_09_PWM呼吸灯

PWM在三相电机控制中&#xff0c;有着非常重要的地位。 如果你需要用FPGA去实现三相电机的控制&#xff0c; PWM这一关是绕不过的。好在PWM的基本原理是比较简单的。所以原理部分本文就略过&#xff0c;本文基于PWM实现呼吸灯。 1 时序 {signal: [{name: clk, wave: p....…

4 STM32启动过程(以Cortex-M3为例)(保姆级介绍)

设计知识点补充在前&#xff1a; 1.关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解 参考见 关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解_Vincent_Song的博客-CSDN博客 2.哈佛结构和冯诺依曼结构的区别…

vue2中左侧菜单和头部tab标签联动

效果图 我这里是使用的vue2 element-ui来实现的&#xff0c;代码可以直接拿来使用 一、首先先安装element-ui element-ui官网 npm i element-ui -S 然后在main.js里面配置&#xff0c;安装官网的步骤来就可以了&#xff0c;这里就不一一介绍了 import Vue from vue; impor…

用wget等命令行工具下载Jenkins上的文件

背景 现在一般公司的内部CI系统都用Jenkins实现&#xff0c;本地部署的时候我会将待测试文件下载到本地&#xff0c;再上传到Linux开发板&#xff0c;但能否从Linux开发板直接下载呢&#xff1f;只要Linux与Jenkins server之间的网络是联通的&#xff0c;那就可以 解决方法 …

【从零开始学习JAVA | 第二十三篇】集合体系结构

目录 前言&#xff1a; 单列集合&#xff1a; set与list的区别&#xff1a; 双列集合&#xff1a; map的特点&#xff1a; 总结&#xff1a; 前言&#xff1a; JAVA中为我们提供了很多集合&#xff0c;这些集合都有自己很独特的特点&#xff0c;因此我们要学习所有的…

网络安全合规-网络安全工程师发展前景(三)

上海网络安全工程师工资按工作经验统计&#xff0c;其中应届毕业生工资5250&#xff0c;0-2年工资8910&#xff0c;3-5年工资11330&#xff0c;8-10年工资13500&#xff0c;6-7年工资16170&#xff0c;该数据仅供参考。 北京网络安全工程师工资按工作经验统计&#xff0c;其中…

python selenium 定位鼠标悬浮后的新弹窗数据

背景 最近需要获取网页上的标签数据&#xff0c;但是标签大于3个以后是隐藏的&#xff0c;需要鼠标hover上去才显示。如下图&#xff0c;图一是刚进来界面展示的&#xff0c;需要知道额外的7个标签则需要将鼠标移动到目标上面去。 但是比较尴尬的一个点是&#xff0c;当游览器打…

数据结构C语言版本(中)

第四章 串 串&#xff1a;限定数据元素类型的线性表。 应用实例&#xff1a; 编辑软件(本质上是字符串处理) 信息检索、病毒查找(字符串比较) 第一节 逻辑结构 一、定义 串是由字符组成的线性表。 STRING(D&#xff0c;S&#xff0c;P) D {ai| ai∈CHARACTER(字符集), i0,1…

Verilog基础之八、多路选择器实现

一、前言 选择器在FPGA中是基础的组成部分&#xff0c;英文全称为Multiplexer&#xff0c;为一个多输入单输出的结构。以器件xc7k480tffv1156为例&#xff0c;在slice中&#xff0c;也可以看到F7AMUX&#xff0c;F8MUX&#xff0c;这两个MUX都是二输入单输出的选择器。 二、工程…

【雕爷学编程】Arduino动手做(128)---2路I2C电平转换模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

VR虚拟现实技术为机械专业教学带来新思路

随着虚拟现实技术的发展&#xff0c;VR已经成为机械专业教学的一种新方式。它可以为学生提供更加生动、直观的学习体验&#xff0c;同时也可以帮助教师更好地进行教学和评估。以下是广州华锐互动总结的一些常见的应用场景&#xff1a; 模拟实验和操作&#xff1a;VR可以为学生提…

(UE4/5) PS中生成LUT进行UE4/5的色域颜色校正

整理自官方&#xff1a;使用虚幻引擎查找表&#xff08;LUT&#xff09;进行颜色校正 | 虚幻引擎5.2文档 (unrealengine.com) 一、Unreal Engine中截图 在UE4/5中截一张场景图&#xff08;比较有代表性的&#xff09; 然后&#xff0c;用这张图片&#xff1a;&#xff08;不要…