java 释放map_Java Map释放内存置null以及调用clear()的区别

Map map = new HashMap<>();

首先,在创建一个map对象时,map指向堆中新创建的对象,这时候的map是一个没有key和value的空对象。众所周知,

map.hashCode()某种意义上相当返回了对象的地址。所以在用刚创建的map对象调用hashCode()方法:

System.out.println("map.hashCode:"+map.hashCode()); 输出结果如下:

8aecae6d868b56afce800144a3849fbd347.jpg

a2d7c498d88fcd2af911a591eaca0cfc.png

再看看hashCode()的源码:

72856dea5891a9712b0214a0e4e9a99d.png

27e5c462dfacafb26e35445381025d79.png

8d009216b59246a87d011e03da5c6424610.jpg

86cfad32f20f3e8d48adc8ba78a63d096e8.jpg

通过源码可以发现,hashCode()方法通过获取key和value返回的哈希值进行异或运算后返回结果值,如果key和value值为空则返

回0。此时我们给map对象put值进去,然后再输出一个hashCode()返回的值:

map.put(

1,"霍去病");

map.put(

2,"李广");

map.put(

3,"刘彻");

map.put(

4,"马邑");

map.put(

5,"桑弘基");

map.put(

6,"苏武");

System.out.println(

"新map.hashCode:"+map.hashCode());

4a0c5d79ca01a8564f828fc5f6dc7de0731.jpg

966ccb691d17c4a2672e1a1b9175ad06.png

返回了一串数字,此时说明map中是有数据的,这个时候我们再使用clear()方法将map中的数据清空后再次输出hashCode()返回

的值,发现仍然是0。

map.clear();

System.out.println(

"after clear:"+map.hashCode());

7b4b7cd054468caa2ffb1ce690e6ad34361.jpg

aa7c960d80755496c37e07a7e3f6613c.png

如果直接将map对象置null,这个时候再次输出hashCode()则不会有输出结果,而是报空指针异常了。

eccbf0ed43e97e480542bc08e5218140.png

8b1cf2931a3dfdf7e5e5ba5afa208fa383b.jpg

到这里,就很明白了,虽然将map对象的数据都clear()了,key和value为null,但是内存中map对象还存在,并且map

具有强引用,虽然key和value为空,但是JVM的垃圾回收器并不会回收该对象的内存,如果再程序中创建很多这样子的没

有释放的对象就会造成内存泄漏,所以小伙伴们再创建map对象的时候,如果不再用到该对象的时候,要注意及时释放该对象

的内存空间。有什么写的不好的欢迎大家指出,我及时修改好不误人子弟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Java多线程读取文本数据并存数据库的步骤如下: 1. 首先需要创建一个文本文件读取类,可以使用Java的FileReader和BufferedReader类来读取文本文件。可以在程序中使用多个线程同时读取文件中的数据,提高读取效率。 2. 然后需要创建一个数据库连接池,通过该连接池可以获取和释放数据库连接。可以使用Java中的JDBC技术,使用连接池可以提高数据库操作的效率。 3. 接着需要处理读取到的文本数据,将数据插入到数据库中。可以使用Java的PreparedStatement类来执行SQL语句,可以通过批量处理的方式将多条数据一次性插入到数据库中,提高效率。 4. 最后需要对程序进行优化,可以使用线程池来管理线程,提高线程的复用性和效率。可以使用缓存技术来减少数据库的访问,提高程序的运行效率。 下面是一个简单的示例代码: ``` import java.io.BufferedReader; import java.io.FileReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadedFileReader { private static final String DB_DRIVER = "com.mysql.jdbc.Driver"; private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/testdb"; private static final String DB_USER = "root"; private static final String DB_PASSWORD = "root"; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); try { Class.forName(DB_DRIVER); Connection connection = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD); String line; int count = 0; BufferedReader br = new BufferedReader(new FileReader("data.txt")); while ((line = br.readLine()) != null) { count++; executor.submit(new InsertTask(connection, line)); } executor.shutdown(); while (!executor.isTerminated()) { } System.out.println("Inserted " + count + " records into the database."); br.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } class InsertTask implements Runnable { private Connection connection; private String data; public InsertTask(Connection connection, String data) { this.connection = connection; this.data = data; } public void run() { try { PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test_table (data) VALUES (?)"); preparedStatement.setString(1, data); preparedStatement.executeUpdate(); preparedStatement.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上述代码中,使用了一个线程池来管理线程,每个线程负责将一条数据插入到数据库中。同时,使用了批量处理的方式,将多条数据一次性插入到数据库中,提高了效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值