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流

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

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

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

相关文章
|
3天前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流处理二进制数据,如图像,由InputStream/OutputStream家族管理;字符流处理文本,基于Reader/Writer,适于文本文件。在文件复制示例中,字节流用FileInputStream/FileOutputStream,字符流用FileReader/FileWriter。选择流类型取决于数据类型和处理需求,文本文件优选字符流,二进制数据则选字节流。
|
2天前
|
存储 Java
杭州 java IO流详解(借鉴-侵-删)
杭州 java IO流详解(借鉴-侵-删)
7 0
|
3天前
|
Java 数据处理 开发者
Java IO流专家级教程:深入理解InputStream/OutputStream和Reader/Writer的内部机制
【6月更文挑战第26天】Java IO流涉及字节流(InputStream/OutputStream)和字符流(Reader/Writer),用于高效处理数据输入输出。InputStream/OutputStream处理二进制数据,常使用缓冲提升性能;Reader/Writer处理文本,关注字符编码转换。两者都有阻塞IO操作,但Java NIO支持非阻塞。示例代码展示了如何使用FileInputStream/FileOutputStream和FileReader/FileWriter读写文件。理解这些流的内部机制有助于优化代码性能。
|
3天前
|
存储 自然语言处理 Java
Java IO流完全手册:字节流和字符流的常见应用场景分析!
【6月更文挑战第26天】Java IO流涵盖字节流和字符流,字节流用于二进制文件读写及网络通信,如图片和音频处理;字符流适用于文本文件操作,支持多语言编码,确保文本正确性。在处理数据时,根据内容类型选择合适的流至关重要。
|
3天前
|
Java 开发者
Java IO流实战技巧:如何优化InputStream/OutputStream和Reader/Writer的使用?
【6月更文挑战第26天】Java IO流优化涉及缓冲、资源管理、字符编码和流式处理。使用Buffered流提高读写效率,如`BufferedInputStream`和`BufferedReader`。确保资源关闭使用try-with-resources,如`try (InputStream is = ...) {...}`。处理文本时指定编码,如`InputStreamReader(is, StandardCharsets.UTF_8)`防止乱码。流式处理大文件,分块读写避免内存溢出,以减少内存占用。这些技巧能提升程序性能和健壮性。
|
3天前
|
自然语言处理 Java
Java IO流进阶教程:掌握字节流和字符流的高级用法!
【6月更文挑战第26天】Java IO流助你高效交换数据,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)的高级技巧。缓冲流(Buffered*)提升读写性能,对象流(Object*Stream)支持对象序列化。字符流的BufferedReader/BufferedWriter优化文本处理,注意字符集如UTF-8用于编码转换。掌握这些,优化IO操作,提升代码质量。
|
3天前
|
Java
Java IO流终极指南:从InputStream/OutputStream到Reader/Writer的全面解读
【6月更文挑战第26天】Java IO流涵盖字节流(InputStream/OutputStream)和字符流(Reader/Writer),前者处理二进制数据,后者专司文本。例如,FileInputStream/FileOutputStream用于文件的字节级读写,而FileReader/FileWriter处理字符级文本。Buffered流提供缓冲功能,提升效率。选择合适的流类取决于数据类型和性能需求。
|
3天前
|
Java 测试技术
Java IO流深度剖析:字节流和字符流的性能对比!
【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
|
3天前
|
存储 设计模式 Java
Java IO流大揭秘:如何高效使用InputStream/OutputStream和Reader/Writer?
【6月更文挑战第26天】Java IO流核心基础,涉及InputStream/OutputStream(字节流)和Reader/Writer(字符流)。高效使用的关键包括:使用Buffered流提升性能,如BufferedInputStream和BufferedOutputStream;处理编码,通过InputStreamReader和OutputStreamWriter指定如UTF-8编码;应用装饰器模式,如DataOutputStream增强功能。理解并巧妙运用这些技巧能优化数据读写操作。
|
3天前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。