01

it2023-11-03  73

①. Java字符串常量池

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

①. 代码演示 除了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 } } ②. 原因解释一(字节码): 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>.两数之和

①. 提供力扣网址:https://leetcode-cn.com/problems/two-sum/

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

/* 题目: 给定一个整数数组 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; } }
最新回复(0)