牛客学习笔记今日份整理

本文详细介绍了Java中HashMap解决哈希冲突的方法(开放地址法和链地址法),以及线程资源释放的不同操作(sleep、wait、yield和join)。同时讨论了Java虚拟机内存区域的划分及其线程共享与非线程共享的原理,以及synchronized和lock的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在Java中HashMap中是用那些方法来解决哈希冲突的?

开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 style="color: rgb(255,0,0);">沿此序列逐个单元地查找,直到找到给定
的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的
地址则表明表中无待查的关键字,即查找失败。 


  链地址法: style="color: rgb(255,0,0);">将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数
组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。

2.哪些操作会使线程释放资源?

1.sleep()方法

  在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。

  sleep()使当前线程进入阻塞状态,在指定时间内不会执行。

  2.wait()方法

  在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

  当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。

  唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。

  waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

  3.yield方法 

  暂停当前正在执行的线程对象。

  yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

  yield()只能使同优先级或更高优先级的线程有执行的机会。 

  4.join方法

  等待该线程终止。

  等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

3.下面说一下关于虚拟机的知识

大多数 JVM
将内存区域划分为 Method
Area(Non-Heap)(方法区) ,Heap(堆) , Program
Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA
方法栈的),Native Method
Stack  ( 本地方法栈 ),其中Method Area 和 
Heap 是线程共享的 
,VM Stack,Native Method Stack  和Program
Counter Register 

是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。


  首先我们熟悉一下一个一般性的
Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class
为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM
通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好 Method
Area(方法区) 和Heap(堆) ,而JVM
每遇到一个线程,就为其分配一个 Program Counter
Register(程序计数器) ,   VM Stack(虚拟机栈)和Native Method
Stack  (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因

4.Synchrpnized和lock的区别\n(1)synchronized是关键字,lock是一个类\n\n(2) synchronized在发生异常时会自动释放锁,lock需要手动释放锁\n\n(3)synchronized是可重入锁、非公平锁、不可中断锁,lock的ReentrantLock是可重入锁,可中断锁,可以是公平锁也可以是非公平锁\n\n(4)synchronized是JVM层次通过监视器实现的,Lock是通过AQS实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学Java的duck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值