java基础-hashmap-io

简介: java基础-hashmap-io

一、Java基础

1.==和equals()的区别

==比较基本类型的值,equals比较引用类型的地址

equals是Object的方法,底层还是==实现的,但是有的类重写了equals方法,例如string,重写之后比较的值,如果重写了equals一定要重写hashcode,如果只重写equals不重写hashCode,会在某些场景下导致程序异常执行,也会降低hash类型的集合的效率

2.HashMap原理

HashMap在JDK1.7采用数组+链表实现

HashMap在JDK1.8采用数组+链表+红黑树实现,key不可重复可以为null,线程不安全

扩容机制

默认容量为16,负载因子为0.75,当HashMap中元素个数超过容量*负载因子的时候,数组长度变为两倍,数组长度达到64,链表长度达到8的时候扩容为红黑树

put过程

  1. 对key的hashCode()进行hash运算,得到index
  2. 如果没碰撞就放入bucket里
  3. 如果碰撞了就放到链表末尾
  4. 如果碰撞导致链表过长就转换为红黑树
  5. 如果节点已经存在就替换旧的value
  6. 如果bucket满了就resize(扩容检测)

get过程

  1. 对key的hashCode()进行hash运算,得到index
  2. 如果bucket第一个节点命中,直接返回
  3. 如果有冲突,需要key.equals(k)去查找对应的entry
  4. 如果是树,在树中查找O(logn)
  5. 如果是链表,在链表中查找O(n)

3.ConcurrentHashMap

线程安全的hashmap

JDK1.7 使用分段锁,一个map分为16段,每一段是单独的hashmap,每次使用对其中一段加锁

JDK1.8 采用CAS+Synchronized保证线程安全,插入采用cas版本标记,在其他线程没有操作的时候扩容,删除的时候使用Synchronized去保证并发删除

4.HashMap和HashTable的区别

  1. hashtable每个方法都用Synchronized修饰,线程安全但是效率低
  2. hashtable的key不可以null,hashmap可以有一个null的key
  3. hashtable对key只做一次hash,hashmap做两次hash
  4. hashtable底层是数组+链表

5.ArrayList和LinkedList的区别

arraylist是动态数组,满了之后new一个1.5倍的大小,将原来的copy过来,数组查找快,删除慢

linkedlist是链表实现,查找慢,添加数据快

6.如何保证ArrayList的线程安全

  1. 采用collentions.synchronizedList()给arraylist加锁
  2. 使用Vector,底层和array一样,但是每个方法都加锁,效率低
  3. 使用juc的CopyOnWriterArrayList,该类读不加锁,写创建了一个副本,写完修改指针

7.String、StringBuffer、StringBuilder区别

String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。

StringBuffer可变并且线程安全

StringBuiler可变但线程不安全。

操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。

8. instanceof关键字的作用

判断一个对象是否是一个类的实例

boolean res = obj instanceof Class

其中obj为一个对象,如果obj是class的对象或者直接间接继承这个类或者实现了这个接口,就会返回true 否则返回false

9. java创建对象的方式

new 反射 clone方法 反序列化

10.说说java中的IO流

按照流向分:输入流和输出流

按照操作单元分:字节流和字符流

按照角色分:节点流和处理流

相关文章
|
8月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
238 0
|
5月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
250 1
|
7月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
Java之HashMap详解
本文介绍了Java中HashMap的源码实现(基于JDK 1.8)。HashMap是基于哈希表的Map接口实现,允许空值和空键,不同步且线程不安全。文章详细解析了HashMap的数据结构、主要方法(如初始化、put、get、resize等)的实现,以及树化和反树化的机制。此外,还对比了JDK 7和JDK 8中HashMap的主要差异,并提供了使用HashMap时的一些注意事项。
441 2
Java之HashMap详解
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
265 3
|
8月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
177 2
|
7月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
299 2
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
324 2
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
667 2