最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。
=================================================================================
以**private static native String getSystemTimeZoneID(String javaHome)**为例
getSystemTimeZoneID方法所在的package java.util.TimeZone;
如图所示,找到TimeZone.c下的getSystemTimeZoneID方法
/*
- Gets the platform defined TimeZone ID
*/
JNIEXPORT jstring JNICALL
Java_java_util_TimeZone_getSystemTimeZoneID(JNIEnv *env, jclass ign,
jstring java_home, jstring country)
{
const char *cname;
const char *java_home_dir;
char *javaTZ;
if (java_home == NULL)
return NULL;
java_home_dir = JNU_GetStringPlatformChars(env, java_home, 0);
if (java_home_dir == NULL)
return NULL;
if (country != NULL) {
cname = JNU_GetStringPlatformChars(env, country, 0);
/* ignore error cases for cname */
} else {
cname = NULL;
}
/*
- Invoke platform dependent mapping function
*/
javaTZ = findJavaTZ_md(java_home_dir, cname);
free((void *)java_home_dir);
if (cname != NULL) {
free((void *)cname);
}
if (javaTZ != NULL) {
jstring jstrJavaTZ = JNU_NewStringPlatform(env, javaTZ);
free((void *)javaTZ);
return jstrJavaTZ;
}
return NULL;
}
重点:调用不同平台相关的映射函数
/*
- Invoke platform dependent mapping function
*/
javaTZ = findJavaTZ_md(java_home_dir, cname);
去查找findJavaTZ_md方法时,发现存在分别在solaris和windows两个目录下。
查了下这两个目录的差别:
因为OpenJDK里,Java标准库和部分工具的源码repo(jdk目录)里,BSD和Linux的平台相关源码都是在solaris目录里的。
原本Sun JDK的源码里平台相关的目录就是从solaris和windows这两个目录开始的,后来Unix系的平台相关代码全都放在solaris目录下了,共用大部分代码。
作者:RednaxelaFX
链接:https://www.zhihu.com/question/58982441/answer/170264788
来源:知乎
简单的理解就是:
window系统下,使用windows目录下编译的JDK代码
unix系的平台下,使用solaris目录下编译的JDK代码
=============================================================================================
/*
- Detects the platform time zone which maps to a Java time zone ID.
*/
char *findJavaTZ_md(const char *java_home_dir, const char *country)
{
char winZoneName[MAX_ZONE_CHAR];
char winMapID[MAX_MAPID_LENGTH];
char *std_timezone = NULL;
int result;
winMapID[0] = 0;
result = getWinTimeZone(winZoneName, winMapID);
if (result != VALUE_UNKNOWN) {
if (result == VALUE_GMTOFFSET) {
std_timezone = _strdup(winZoneName);
} else {
std_timezone = matchJavaTZ(java_home_dir, result,
winZoneName, winMapID, country);
}
}
return std_timezone;
}
注释写得很清楚,获取“Time Zones”注册表中的当前时区
/*
- Gets the current time zone entry in the “Time Zones” registry.
*/
static int getWinTimeZone(char *winZoneName, char *winMapID)
{
…
}
时区的设置方式:
那时区上的选择值是从哪取到的,上面有说了,是在注册表中取值
打开注册表 :Regedit–>
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
findJavaTz_md()方法的注释上写得很清楚了:将平台时区ID映射为Java时区ID
/*
-
findJavaTZ_md() maps platform time zone ID to Java time zone ID
-
using <java_home>/lib/tzmappings. If the TZ value is not found, it
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
外链图片转存中…(img-TWOhi9X8-1715269102969)]
[外链图片转存中…(img-sjphi5pW-1715269102969)]
[外链图片转存中…(img-bPTyTZsb-1715269102970)]
[外链图片转存中…(img-2I5FlRbD-1715269102970)]