dw+如何做自适应网站,wordpress 一键排版,企业网站源码怎么获取,wordpress数据库引擎2.Java基础【Java面试第三季】前言推荐2.Java基础01_字符串常量Java内部加载-上58同城的java字符串常量池面试code讲解intern()方法---源码解释02_字符串常量Java内部加载-下whyOpenJDK8底层源码说明递推步骤总结考查点03_闲聊力扣算法第一题字节跳动两数求和题目说明面试题解法…
2.Java基础【Java面试第三季】前言推荐2.Java基础01_字符串常量Java内部加载-上58同城的java字符串常量池面试code讲解intern()方法---源码解释02_字符串常量Java内部加载-下whyOpenJDK8底层源码说明递推步骤总结考查点03_闲聊力扣算法第一题字节跳动两数求和题目说明面试题解法04_TwoSum暴力解法05_TwoSum优化解法考察点字节跳动手写LRU算法最后前言
2023-2-1 13:23:19
以下内容源自 【尚硅谷Java大厂面试题第3季跳槽必刷题目必扫技术盲点周阳主讲-哔哩哔哩】 仅供学习交流使用
推荐
Java开发常见面试题详解LockSupportAQSSpring循环依赖Redis
2.Java基础 01_字符串常量Java内部加载-上 58同城的java字符串常量池
面试code
package javase;public class StringPool58Demo1 {public static void main(String[] args) {String str1new StringBuilder(58).append(tongchen).toString();System.out.println(str1.intern());System.out.println(str1 str1.intern());System.out.println();String str2new StringBuilder(ja).append(va).toString();System.out.println(str2);System.out.println(str2.intern());System.out.println(str2 str2.intern());}
}
讲解
intern()方法—源码解释 由于运行时常量池是方法区的一部分所以这两个区域的溢出测试可以放到一起进行。HotSpot从JDK 7开始逐步“去永久代”的计划并在JDK 8中完全使用元空间来代替永久代的背景故事在此我们就以测试代码来观察一下使用永久代还是“元空间来实现方法区对程序有什么实际的影响。
String:intern()是一个本地方法它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串则返回代表池中这个字符串的String对象的引用否则会将此String对象包含的字符串添加到常量池中并且返回此String对象的引用。在JDK 6或更早之前的HotSpot虚拟机中常量池都是分配在永久代中我们可以通过-XX:PermSize和-XX:MaxPermSize限制永久代的大小即可间接限制其中常量池的容量。
package javase;public class StringPool58Demo1 {public static void main(String[] args) {String str1new StringBuilder(58).append(tongchen).toString();System.out.println(str1.intern());System.out.println(str1 str1.intern());System.out.println();String str2new StringBuilder(ja).append(va).toString();System.out.println(str2);System.out.println(str2.intern());System.out.println(str2 str2.intern());}
}
输出结果
58tongchen
58tongchen
truejava
java
false02_字符串常量Java内部加载-下 why
按照代码结果Java字符串答案为false,必然是两个不同的java那另外一个java字符串如何加载进来的?为什么 有一个初始化的Java字符串JDK出娘胎自带的在加载sun.misc.Version这个类的时候进入常量池。
OpenJDK8底层源码说明
递推步骤
System代码解析 System - initializeSystemClass() - Version
System
package java.lang;public final class System {/* register the natives via the static initializer.** VM will invoke the initializeSystemClass method to complete* the initialization for this class separated from clinit.* Note that to use properties set by the VM, see the constraints* described in the initializeSystemClass method.*/private static native void registerNatives();static {registerNatives();}//本地方法registerNatives()将会调用initializeSystemClass()private static void initializeSystemClass() {...sun.misc.Version.init();...}...
}
Version
package sun.misc;//反编译后的代码
public class Version {private static final String launcher_name java;...
}
测试Version的其他字符串
public class Version {private static final java.lang.String launcher_name java;private static final java.lang.String java_version 1.8.0_60;private static final java.lang.String java_runtime_name Java(TM) SE Runtime Environment;private static final java.lang.String java_profile_name ;private static final java.lang.String java_runtime_version 1.8.0_60-b27;
}String str3 new StringBuilder(1.8.0_60).toString();String str4 new StringBuilder(Java(TM) SE Runtime Environment).toString();String str5 new StringBuilder().toString();String str6 new StringBuilder(1.8.0_60-b27).toString();System.out.println(str3 str3.intern()||str4 str4.intern()||str5str5.intern()||str6str6.intern());//false 类加载器和rt.jar----根加载器提前部署加载rt.jar OpenJDK8源码 http://openjdk.java.net/openjdk8\jdk\src\share\classes\sun\misc
总结
《深入理解java虚拟机》----第二章 Java内存区域与内存溢出异常----2.4 实战OutOfMemoryError异常----2.4.3 方法区和运行时常量池溢出----代码清单2-8 String.intern()返回引用的测试 这段代码在JDK 6中运行会得到两个false而在JDK 7中运行会得到一个true和一个false。产生差异的原因是在JDK 6中intern()方法会把首次遇到的字符串实例复制到永久代的字符串常量池中存储返回的也是永久代里面这个字符串实例的引用而由StringBuilder创建的字符串对象实例在Java堆上所以必然不可能是同一个引用结果将返回false。 而JDK 7(以及部分其他虚拟机例如JRockit的intern()方法实现就不需要再拷贝字符串的实例到永久代了既然字符串常量池已经移到Java堆中那只需要在常量池里记录一下首次出现的实例引用即可因此intern()返回的引用和由StringBuilder创建的那个字符串实例就是同一个。而对str2比较返回false这是因为“java”这个字符串在执行StringBuilder.toString()之前就已经出现过了字符串常量池中已经有它的引用不符合intern()方法要求“首次遇到”的原则“计算机软件这个字符串则是首次出现的因此结果返回true。 sun.misc.Version类会在JDK类库的初始化过程中被加载并初始化而在初始化时它需要对静态常量字段根据指定的常量值(ConstantValue〉做默认初始化此时被sun.misc.Version.launcher静态常量字段所引用的java字符串字面量就被intern到HotSpot VM的字符串常量池——StringTable里了。 sun.misc.Version类会在JDK类库的初始化过程中被加载并初始化而在初始化时它需要对静态常量字段根据指定的常量值(ConstantValue〉做默认初始化此时被sun.misc.Version.launcher静态常量字段所引用的java字符串字面量就被intern到HotSpot VM的字符串常量池——StringTable里了。
考查点
intern()方法判断true/false《深入理解java虚拟机》书原题是否读过经典JVM书籍 03_闲聊力扣算法第一题 字节跳动两数求和
然后考了2个算法:
1给定一个数m求大干该数的最小2的n次幂、返同n 这个我一分钟内就完成了。
2.leetCode的第i题
给定一个整数数组nums和一个目标值 target请你在该数组中找出和为目标值的那两个整数并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是数组中同一个元素不能使用两遍。示例:
输入nums [2,7,11,15], target 9
输出[0,1]
解释因为 nums[0] nums[1] 9 返回 [0, 1] 。
快手算法:
给定一个链表.删除相邻相同的数据项。比如2 -〉2-〉3 返回 2-〉3。这个算法也没运行出来但是之前题目打的比较好一面过了。
给定一个链表其中元素只有0和1删除0的节点并返回链表。≤(后来面试官说这是AQS的一部分源码……)
题目说明
https://leetcode.cn/problems/two-sum/
面试题
package javase;import java.util.HashMap;/*** 给定一个整数数组nums和一个目标值 target请你在该数组中找出和为目标值的那两个整数并返回他们的数组下标。* 你可以假设每种输入只会对应一个答案。但是数组中同一个元素不能使用两遍。示例:* 输入nums [2,7,11,15], target 9* 输出[0,1]* 解释因为 nums[0] nums[1] 9 返回 [0, 1] 。*/
public class TwoSumDemo2 {public int[] twoSum(int[] nums, int target) {return null;}public static void main(String[] args) {int[] numsnew int[]{2,7,11,15};int target9;}
}
解法
暴力 04_TwoSum暴力解法 package javase;import java.util.Arrays;
import java.util.HashMap;/*** 给定一个整数数组nums和一个目标值 target请你在该数组中找出和为目标值的那两个整数并返回他们的数组下标。* 你可以假设每种输入只会对应一个答案。但是数组中同一个元素不能使用两遍。示例:* 输入nums [2,7,11,15], target 9* 输出[0,1]* 解释因为 nums[0] nums[1] 9 返回 [0, 1] 。*/
public class TwoSumDemo2 {//遍历--暴力破解/*** 通过双重循环遍历数组中所有元素的两两组合,* 当出现符合的和的返回两个元素的下标* param nums* param target* return*/public static int[] twoSum1(int[] nums, int target) {for (int i 0; i nums.length; i) {for (int j i1; j nums.length-1 ; j) {if (target-nums[i]nums[j]){return new int[]{i,j};}}}return null;}public static void main(String[] args) {int[] numsnew int[]{2,7,11,15};int target9;System.out.println(Arrays.toString(twoSum1(nums, target)));}
}
还有没有更优的解法 05_TwoSum优化解法 哈希
package javase;import java.util.Arrays;
import java.util.HashMap;/*** 给定一个整数数组nums和一个目标值 target请你在该数组中找出和为目标值的那两个整数并返回他们的数组下标。* 你可以假设每种输入只会对应一个答案。但是数组中同一个元素不能使用两遍。示例:* 输入nums [2,7,11,15], target 9* 输出[0,1]* 解释因为 nums[0] nums[1] 9 返回 [0, 1] 。*/
public class TwoSumDemo2 {//遍历--暴力破解/*** 通过双重循环遍历数组中所有元素的两两组合,* 当出现符合的和的返回两个元素的下标* param nums* param target* return*/public static int[] twoSum1(int[] nums, int target) {for (int i 0; i nums.length; i) {for (int j i1; j nums.length-1 ; j) {if (target-nums[i]nums[j]){return new int[]{i,j};}}}return null;}public static int[] twoSum2(int[] nums, int target) {HashMapInteger,Integer mapnew HashMap();for (int i 0; i nums.length; i) {if (map.containsKey(target-nums[i])){return new int[]{map.get(target-nums[i]),i};}map.put(nums[i],i);}return null;}public static void main(String[] args) {int[] numsnew int[]{2,7,11,15};int target9;System.out.println(Arrays.toString(twoSum1(nums, target)));System.out.println(Arrays.toString(twoSum2(nums, target)));}
}
考察点
你都想来大厂了算法居然从来没有刷过?呵呵机会偏爱有准备有实力的头脑不是白说的…
字节跳动手写LRU算法
见Redis最后(请坚持到最后一章)
最后
2023-2-1 14:56:19
这篇博客能写好的原因是站在巨人的肩膀上
这篇博客要写好的目的是做别人的肩膀
开源为爱发电
学习为我而行