JDK 源码设计 时间换空间 & 空间换时间

JDK 源码设计 时间换空间 & 空间换时间  

package test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;

public class StringTest {

 public static void main(String[] args) throws Exception{
  String s ="123456";
  //以空间换时间
  String s2 = s.substring(1,2);
  
  a(s2);
  //以时间换空间
  String s3=new String(s2);
  a(s3);
  String s4 =new String(s.toCharArray(),0,4);
  a(s4);
  //以空间换时间
  Constructor con=s.getClass().getDeclaredConstructor(int.class,int.class,char[].class);
  con.setAccessible(true);
  String newStr = (String) con.newInstance(1,2,s.toCharArray());
  System.out.println("new Str ===="+newStr);
  a(newStr);
  
  //以空间换时间
  List l = new ArrayList();
  l = l.subList(1, 2);
  
  //以空间换时间
  BitSet a = new BitSet();
 }
 
 
 public static void a(String s2)throws Exception{
  Field f=s2.getClass().getDeclaredField("value");
  f.setAccessible(true);
  char[] c =(char[])f.get(s2);
  System.out.println(new String(c));
 }
}
当遇到空间换时间时,需要注意内存泄露问题

对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式:访问串行化,对象共享化。而ThreadLocal采用了“以空间换时间”的方式:访问并行化,对象独享化。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前