首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【面试题系列】——Java基础

1,Java科普 1.1 为什么安装包要分JDK和JRE? JRE主要包含JVM,用于运行Java程序。 JDK包含了JRE,除此之外,包含了比如像javac等程序开发需要用到的工具。...那么运行字节码的环境就是JRE。(JRE的核心就是JVM) 了解完JDK和JRE是什么之后,再聊聊为什么开发者当时要把一个安装包分成两部分呢? 平常使用的软件都是一键安装的,但JDK需要安装两次。...JVM有两个主要的功能: 适配不同的操作系统的指令集(兼容不同的操作系统) 翻译字节码文件为机器码执行 (Oracle官网上下载JDK,不同操作系统的JDK是不一样的,对应不同的虚拟机) 1.3 为什么安装完...例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。...换句话说,如果在java,javac的目录下执行这个两个命令,是没有问题的。但是如果更换了目录,系统在当前目录找不到,就会去环境变量中寻找。

60830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Java面试系列】Java 基础常问面试题

    和 b 指向的是同一个引用,所以 == 也是 true,但是 new 每次都会重新开辟堆内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。...另外需要注意的是: Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法通常用来将对象的 内存地址 转换为整数之后返回。...(可以快速找到所需要的对象) 为什么一定要有hashCode? 我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode?...finally 是异常处理语句结构的一部分,表示总是执行. finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,...; 3)finally 是在 return 后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保 存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是

    59840

    面经手册 · 第15篇《码农会锁,synchronized 解毒,剖析源码深度分析!》

    所以,你要学会的是自我学习的能力,之后是从哪开始都可以,重要的是开始和坚持! 二、面试题 谢飞机,小记,周末逛完奥特莱斯,回来就跑面试官家去了!...2. synchronized 特性 2.1 原子性 「原子性」是指一个操作是不可中断的,要么全部执行成功要么全部执行失败。...sign) 会一直执行,不会随着线程 Thread02 修改 sign = true 而退出循环。...也就是常说的:「如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程,所有的操作都是无序的。」...synchronized锁对象的时候有个计数器,他会记录下线程获取锁的次数,在执行完对应的代码块之后,计数器就会-1,直到计数器清零,就释放锁了。 「之所以」,是可以重入。

    55810

    Visual Studio 调试系列3 断点

    例如,如果变量item是要添加到集合中,选择的对象为 true并键入item == $ ,其中 的对象 ID 号. 会在将该对象添加到集合中时中断执行。...按下F5继续运行, 代码走到61行时,断点变成黄色箭头,鼠标悬浮在黄色箭头上,提示如下,条件表达式计算结果为 true。所以命中61行的断点。 ?...按下F5继续运行, 代码走到62行时,断点变成黄色箭头,鼠标悬浮在黄色箭头上,提示如下,条件表达式计算结果为 true。所以命中62行的断点。 ?...下面是要检查的几个事项: 如果在多个进程或多台计算机运行你的代码,请确保你正在调试的正确的进程或计算机。 确认你的代码正在运行。...要停止命中此断点,请确保从 “断点” 窗口删除该断点的所有实例。

    5.4K20

    C++中关于main函数的几点说明

    main函数是C++程序的入口函数,C++标准要求main()函数的返回值类型为int。...1.函数内并可以不出现return语句 当main()函数的返回值为int,而函数内并没有出现return语句时,同样可以通过编译并正常运行。...在main()函数中,将语句return I;改成函数调用exit(i);,这个程序的执行结果不发生变化。exit(i)的执行效果是返回操作系统,并将i作为程序的返回结果。...如果要对类中的成员对象进行初始化,那么这些对象的构造函数也是在main()函数之前执行的。如果在这些构造函数中还调用了其他函数的话,就可以是更多的函数先于main()函数之前运行。...int main(int argc,char* argv[]) { if(argc>1) cout<<"Hello "<<argv[1]<<endl; return 0; } 假设此程序经过编译之后生成的

    1K20

    C++关于main函数的几点说明

    ); 当main()函数的返回值为int,而函数内没有出现return语句时,同样可以通过编译并正常运行。...int main(int argc,char* argv[]) { if(argc>1) { cout<<"Hello "<<argv[1]<<endl; } return 0; } 假设此程序经过编译之后生成的...当然,以上代码不具有可移植性,在Linux环境下使用g++编译不会通过,提示返回值类型必须为int,可见GNU C++更加严格的实现了C++标准的内容。...在main()函数中,将语句return i;改成函数调用exit(i);,这个程序的执行结果不发生变化。exit(i)的执行效果是返回操作系统,并将i作为程序的返回结果。...如果要对类中的成员对象进行初始化,那么这些对象的构造函数也是在main()函数之前执行的。如果在这些构造函数中还调用了其他函数的话,就可以有更多的函数先于main()函数之前运行。

    7.1K50

    【Python】Python中的运算符与注释

    ,注释要与代码相对应; 注释的篇幅要合理,不能过于精简,也不能太长; 注释的语言与工作环境要对的上,根据公司要求来选择合适的语言进行注释; 注释的内容要积极向上,不要带有负能量 在了解完了注释的内容之后...,还是会存在一定的问题,因此小数之间的比较通常是通过作差之后比较精度,如下所示: 可以看到,此时获取的结果不是我们想象中的结果,为什么会这样呢?...在Python中关系运算符还能够执行C/C++中无法执行的连续比较操作,如下所示: 如果是在C/C++中,连续比较的逻辑则是3>2成立,结果为1,再用1与1进行比较,1>1不成立,结果为0,因此最后输出结果是...如果 x 为 False,它返回 True。 Python中的逻辑操作符相比于C/C++中的逻辑操作符而言,在操作符用法的表示上会更加的容易让人理解。...2 not in 如果在指定的序列中没有找到值返回 True,否则返回 False。

    8810

    年后面试必备:95%错误率的9道面试题!

    第1道 如果在try或catch块上放置return语句或System.exit()会发生什么?最后会阻止执行吗?...另外,请注意,即使x本身是NaN,比较x == Double.NaN也始终求值为false。要测试x是否为NaN,应该使用方法调用Double.isNaN(x)检查给定的数字是否为NaN。...然而,这不是程序打印的,这就是为什么这个问题很棘手。事实上,程序的输出是依赖于操作系统和语言环境的。...在具有美国语言环境的Windows XP上,上述程序打印[63],如果在Linux或Solaris上运行此程序,则会得到不同的值。...默认编码方案是操作系统和区域设置相关。在Linux上,它是UTF-8,在Windows上具有美国语言环境,默认编码为Cp1252。

    96020

    还不知道如何在java中终止一个线程?快来,一文给你揭秘

    简介工作中我们经常会用到线程,一般情况下我们让线程执行就完事了,那么你们有没有想过如何去终止一个正在运行的线程呢?今天带大家一起来看看。...但是这个方法从jdk1.2之后就不推荐使用了,为什么不推荐使用呢?...如果此线程在InterruptibleChannel上的I/O操作中处于被阻塞状态,则该channel将被关闭,该线程的中断状态将被设置为true,并且该线程将收到java.nio.channels.ClosedByInterruptException...如果此线程在java.nio.channels.Selector中处于被被阻塞状态,则将设置该线程的中断状态为true,并且它将立即从select操作中返回。...如果上面的情况都不成立,则设置中断状态为true。

    43530

    一文看懂 Node.js 中的多线程和多进程

    由于 Node.js 的非阻塞性质,不同的线程执行不同的回调,这些回调首先委托给事件循环。Node.js 运行时负责处理所有这一切。 为什么要使用NodeJS?...要开始使用辅助线程,需要先导入 worker_threads 模块。之后需要创建 Worker 类的实例以创建工作线程。...如果在工作线程中调用了 process.exit(),则会将 exitCode 提供给回调。如果 worker.terminate() 终止工作线程,则代码为 1。...使用工作线程的方式 有两种使用工作线程的方法: 方法 1 – 涉及产生工作线程,执行其代码并将结果发送到父线程。此方法需要每次为新任务从头创建新的 worker 线程。...worker_threads 模块中可用的重要属性 isMainThread – 当不在工作线程内操作时,此属性为 true。如果需要,则可以在 worker 文件的开头包含一个简单的 if 语句。

    3.6K10

    Java中finalize()用法

    为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。...在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。...在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。...在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。...在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。

    2.5K30

    《JavaEE》----2.<多线程的简介&创建&Thread类>

    运行代码,我们可以发现两边的日志都在交替打印 1.每个线程都是独立执行的逻辑,独立的执行流。 2.从t.start();代码之后,就会兵分两路,并发执行。...ps:为什么总是向上转型(java) Java这个圈子就爱这么写, 如果c++,这里的代码绝对不会写成向上转型。...c++是一个生态,这里的这群人不喜欢向上转型,他们觉得向上转型之后,触发多态,会有额外的运行时开销,不符合c++把性能追求到极致这样的初心。这边能不向上转型就不转型。...相互影响越大,我们认为是耦合越高 创建线程,需要两个关键操作: 1.明确线程要执行的任务, 2.调用系统api,创建出线程。...t.setDaemon(true); t.start(); } } 运行程序,我们发现什么都没有打印, 改成后台线程之后,主线程飞快执行完了,于是进程结束,

    12610

    新手React开发人员做错的5件事

    请勿执行的操作以及如何解决的方法,这部分内容是针对React的新手开发人员提供的。 ? 1.忘记大写React组件 考虑一下这段代码,它创建一个简单的div,其中包含父组件的标题。...Parent Component ); } } 尽管此代码可以编译并运行无误...只有当showIntro 和 showBody 分别设置为 true 时才会这样。 ChildComponent 希望将两个布尔值作为prop传递。如果在父组件中执行类似的操作,会发生什么情况?...对于前两个 ChildComponent,将 showIntro 和 showBody 都计算为 true。 这是由于 && 运算符的隐式强制类型转换。...当您在 render() 函数中调用 setState() 时也会发生此错误。 为什么会这样?每次调用 setState() 时,React将通过调用 render() 重新渲染。

    1.7K20

    面试题98:说一下synchronize实现原理

    如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized...---- 【为什么采用自旋而不是等待】 很多synchronized里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题...threadId是否与其线程id一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁...偏向锁:顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程竞争的情况,则线程是不需要触发同步的,减少加锁/ 解锁的一些CAS操作(比如等待队列的一些 CAS操作...如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。

    28450

    千万不要错过的后端【纯干货】面试知识点整理 I

    此函数经常用在函数调用时用户定义类型的值传递及返回。 为什么要内存对齐?...如果在构造函数中初始化,那么首先调用默认的构造函数,然后调用指定的构造函数 所以对于用户定义类型,使用列表初始化可以减少一次默认构造函数调用过程 c/c++ 程序调试方法 printf 大法(日志...file 加载被调试的可执行程序文件 b / 在第几行或者某个函数第一行代码前设置断点 r 运行 s 单步执行一行代码 n 执行一行代码,执行函数调用(如果有) c 继续运行程序至下一个断点或者结束...,并返回指向这块空间的指针 void* realloc(void* ptr, size_t size); ptr 是要调整的内存地址 size 是调整之后新大小 返回值为调整之后的内存起始位置 这个函数在调整原内存空间大小的基础上...,还会将原来内存中的数据移动到的空间 realloc在调整内存空间的时候存在两种情况 情况1:原有空间之后有足够大的空间 情况2:原有空间之后没有足够大的空间 当是情况1的时候,要扩展内存就直接在原有内存之后直接追加空间

    52840
    领券