欢迎大家关注 github.com/hsfxuebao/j… ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
①. Java字符串常量池
前言:
关于String的intern,在如下地址中有详细记载,建议先看:
blog.csdn.net/TZ845195485…
-
①. 代码演示
除了java之外,其他的都会返回truepublic 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; } }
-