跳到主要内容

13 篇博文 含有标签「Java」

查看所有标签

《Java NIO系列教程》学习笔记

· 阅读需 4 分钟

Java NIO 由以下几个核心部分组成:

  • Channels
  • Buffers
  • Selectors

channel与buffer

Channel

  • FileChannel:从文件中读写数据
  • DatagramChannel:能通过UDP读写网络中的数据
  • SocketChannel:能通过TCP读写网络中的数据
  • ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel

LockSupport源码分析

· 阅读需 9 分钟

LockSupport简介

LockSupport可以控制线程的状态,从而达到线程在等待唤醒之间切换的目的,并且不用担心阻塞和唤醒操作的顺序,但要注意连续多次唤醒的效果和一次唤醒是一样的。

注意:unpark 函数可以先于 park 调用。

【LockSupport与的区别】

  • LockSupport.park和unpark不需要在同步代码块中,wait和notify是需要的。
  • LockSupport的pork和unpark是针对线程的,而wait和notify是可以是任意对象。
  • LockSupport的unpark可以让指定线程被唤醒,但是notify是随机唤醒一个,notifyAll是全部唤醒,不够灵活。

park和unpark都是调用native方法,由JVM实现:

ClassNotFoundException与NoClassDefFoundError【译】

· 阅读需 3 分钟

ClassNotFoundExceptionNoClassDefFoundError 都是某个类在运行时没有找到时出现的,但它们发生的场景不同。

ClassNotFoundException 是一个异常,当你在运行时使用 Class.forName()loadClass() 方法尝试去加载一个类且这个类没有在 classpath 下找到时会出现该异常。

NoClassDefFoundError 是一个错误,当某个类在编译时存在但在运行时丢失时会出现该错误。

ClassNotFoundException

ClassNotFoundException 是一个运行时异常,当应用程序在运行时使用 Class.forName()loadClass()findSystemClass() 方法尝试去加载一个类,并且这个类在 classpath 下找不到时会抛出该异常。举个例子,当你尝试连接到 MySQL 或 Oracle 数据库,且你还没有将需要的 JAR 文件更新到 classpath 下时,你可能就碰到过这个异常。在大多数时候,这个异常发生在当你尝试去运行一个应用程序但还没有将需要的 JAR 文件更新到 classpath 时。

深入理解Java序列化

· 阅读需 10 分钟

所谓序列化,就是将对象转为字节流,而反序列化则是将字节流还原为对象。

序列化可以将对象的字节序列持久化——保存在内存、文件、数据库中,在网络上传送对象的字节序列,或者用于 RMI(远程方法调用)。

例子

首先来看一个简单的例子。定义一个 User 类,并实现 Serializable 接口。

HashMap源码分析

· 阅读需 11 分钟

HashMap是很重要的数据结构,也是面试的宠儿,这里就HashMap的源码进行分析,以便理解HashMap的实现。

散列表

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。 也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。 这个映射函数称做散列函数,存放记录的数组称做散列表。

散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快定位。散列函数有直接定址法、数字分析法、平方取中法、折叠法、随机数法、除留余数法等。

解决哈希冲突的方法一般有:开放定址法、链地址法(拉链法)、再哈希法、建立公共溢出区等方法。在开放定址法中解决冲突的方法有:线行探查法、平方探查法、双散列函数探查法等。开放定址法的缺点在于删除元素的时候不能真的删除,否则会引起查找错误,只能做一个特殊标记。只到有下个元素插入才能真正删除该元素。

数据结构