Java字符串常量池+两数之和

254 阅读2分钟

欢迎大家关注 github.com/hsfxuebao/j… ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈

①. Java字符串常量池

前言:
关于String的intern,在如下地址中有详细记载,建议先看:
blog.csdn.net/TZ845195485…

  • ①. 代码演示
    除了java之外,其他的都会返回true

    public class StringPools58Demo { public static void main(String[] args) { /* (1).str1 str1 会有4个对象 一个StringBuilder、 一个58 ldc、 一个tongcheng ldc、 String 这个时候常量池中没有58tongcheng这个ldc在 str1.intern():在jdk7后,会看常量池中是否存在,如果没有,它不会创建一个对象, 如果堆中已经这个字符串,那么会将堆中的引用地址赋给它 所以这个时候str1.intern()是获取的堆中的 * */ String str1=new StringBuilder("58").append("tongcheng").toString(); System.out.println(str1); System.out.println(str1.intern()); System.out.println(str1==str1.intern());//true System.out.println();

        /*
        sum.misc.Version类会在JDK类库的初始化中被加载并初始化,而在初始化时它需要对静态常量字
        段根据指定的常量值(ConstantValue)做默认初始化,此时sum.misc.Version.launcher静态常
        量字段所引用的"java"字符串字面量就被intern到HotSpot VM的字符串常量池 - StringTable
        里了
        str2对象是堆中的
        str.intern()是返回的是JDK出娘胎自带的,在加载sum.misc.version这个类的时候进入常量池
        */
        String str2=new StringBuilder("ja").append("va").toString();
        System.out.println(str2);
        System.out.println(str2.intern());
        System.out.println(str2==str2.intern());//false
    }
    

    }

    1234567891011121314151617181920212223242526272829303132333435

  • ②. 原因解释一(字节码):
    String str1=new StringBuilder(“58”).append(“tongcheng”).toString();
    这句话中常量池中是没有58tongcheng的 无ldc
    在这里插入图片描述

  • ③.原因解释二(深入OpenJDK8底层源码分析):
    (sum.misc.Version类会在JDK类库的初始化中被加载并初始化,而在初始化时它需要对静态常量字段根据指定的常量值(ConstantValue)做默认初始化,此时sum.misc.Version .launcher静态常量字段所引用的"java"字符串字面量就被intern到HotSpot VM的字符串常量池 - StringTable里了)
    在这里插入图片描述

在这里插入图片描述在这里插入图片描述

②. 两数之和

2>.两数之和

  • ①. 提供力扣网址:leetcode-cn.com/problems/tw…

  • ②. 使用暴力法和哈希解法:

    /* 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数, 并返回他们的数组下标你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使 用两遍。

    • */ public class TwoSumDemo { public static void main(String[] args) { int[]nums ={2, 7, 11, 15}; int target = 99; //int[]indexCollection=twoSum1(nums,target); int[]indexCollection=twoSum2(nums,target); if(indexCollection!=null){ for (int index : indexCollection) { System.out.print(index+" "); } } }

      //1.暴力法: //通过双重遍历数组中所有元素的两两组合,当出现符合的和时返回两个元素的下标 public static int[] twoSum1(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i+1; j <nums.length ; j++) { if(target-nums[i]==nums[j]){ return new int[]{i,j}; } } } return null; } //2.哈希(更优解法) public static int[] twoSum2(int[] nums, int target){ Map<Integer,Integer> map=new HashMap<>(); for (int i = 0; i < nums.length; i++) { int param=target-nums[i];//2 7 if(map.containsKey(param)){ return new int[]{map.get(param),i}; } map.put(nums[i],i); } return null; } }

转自:blog.csdn.net/TZ845195485…