Java的核心技术都有哪些?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的核心技术都有哪些?相关的知识,希望对你有一定的参考价值。
第一:Java虚拟机 Java虚拟机的主要任务是装在class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。Java API中只有程序执行时需要的那些类才会被装载。字节码由执行引擎来执行。不同的Java虚拟机中,执行引擎可能实现得非常不同。在由软件实现的虚拟机中,最简单的执行引擎就是一次性解释字节码。另一种执行引擎更快,但是也更消耗内存,叫做"即时编译器(just-in-time compiler)"。在这种情况下,第一次被执行的字节码会被编译成本地机器代码。编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用。第三种执行引擎是自适应优化器。在这种方法里,虚拟机开始的时候解释字节码,但是会监视运行中程序的活动,并且记录下使用最频繁的代码段。程序运行的时候,虚拟机只把那些活动最频繁的代码编译成本地代码,其他的代码由于使用得不是很频繁,继续保留为字节码-由虚拟机继续解释它们。一个自适应的优化器可以使得Java虚拟机在80%~90%的时间里执行被优化过的本地代码,而只需要编译10%~20%的对性能有影响的代码。 当Java虚拟机是由主机操作系统上的软件实现的时候,Java程序通过调用本地方法(native method)和主机交互。Java中有两种方法: Java方法和本地方法。Java方法是由Java语言编写,编译成字节码文件,存储在class文件中的。本地方法是由其他语言(比如c,c++或汇编语言)编写的,编译成何处理器相关的机器代码。本地方法保存在动态链接库中,格式是各个平台专有的。运行中Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。
第二:类装载器的体系结构 一个Java应用程序可以使用两种类装载器:"启动(bootstrap)"类装载器和用户定义的类装载器。启动类装载器(这是系统中唯一的)是Java虚拟机实现的一部分。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括Java API类(启动类装载器也被称为原始类装载器、系统类装载器或者默认类装载器)。 Java应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式来装载类。例如,从网络下载class文件。尽管启动类装载器是虚拟机实现的本质部分,而用户定义的类装载器不是,但用户定义的类装载器能够用Java来编写,能够被编译成class文件,能够被虚拟机装载,还能够像其它对象一样实例化。 由于有用户定义类装载器,所以不必再编译的时候就知道运行中的Java应用程序中最终会加入的所有的类。用户定义的类装载器使得在运行扩展Java应用程序成为可能。当它运行时,应用程序能够解决它需要哪些额外的类,能够决定是使用一个或是更多的用户定义的类装载器来装载。由于类装载器是用Java编写的,所以用任何在Java代码中可以表述的风格来进行类装载。这些类可以通过网络下载,可以从某些数据库中获取,甚至可以动态生成。 每一个类被装载的时候,Java虚拟机都监视这个类,看到它到底是被启动类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载引用的类。例如,如果虚拟机使用一个特定的类装载器装载Volcano这个类,它就会使用这个类装载器装载Volcano类使用的所有类。 由于Java虚拟机采取这种方式进行类的装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装载器都有自己的命名空间。 Java应用程序可以创建多少个(或多少种)被不同的类装载器装载的类存放在不同的命名空间中,它们不能相互访问,除非应用程序显示地允许这么做。当编写一个Java应用程序的时候,从不同源文件装载的类可以分隔在不同的命名空间中。通过这种方法,就能够使用Java类装载器的体系结构来控制任何不同源文件中装载的代码之间的相互影响,特别是能够阻止恶意代码获取访问或破坏善意代码的权限。 Web浏览器是一个动态扩展的例子,Web浏览器使用用户定义的类装载器从网络下载用于Java applet的class文件。Web浏览器使用一个用来安装用户定义类装载器的Java应用程序。这个用户定义的类装载器通常被称为Java Applet类装载器,它知道如何向HTTP服务器请求class文件。Java Applet可以作为动态扩展的例子,因为Java应用程序并不知道它什么时候会开始从网络下载浏览器请求的class文件。只有当浏览器遇到有Java applet的页面时,才决定是否需要下载class文件。 Web浏览器启动的Java应用程序通常为每个提供class文件的网络地址分别创建不同的用户定义类装载器,因此,不同的用户定义类装载器装载不同来源的class文件。这就可以把它们分别放置在Java主机应用程序的不同命名空间之下。由于不同来源的Java applet文件放置在不同的命名空间中,恶意的Java applet代码就不会直接访问从别的地方下载的class文件。这就能够限制或阻止不同来源的代码之间的相互访问。
第三:Java class文件 Java class文件主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。这种途径途径打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Java class文件时可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。 当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制文件包含了对目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的"机器语言"。class文件设计得紧凑,因此它们可以快速地在网络上传送。其次,由于Java程序是动态连接和动态扩展的,class文件可以在需要的时候才下载。这个特点使得Java应用程序能够安排从网络上下载class文件的时间,从而可以最大限度地减少终端用户的等待时间。
第四:Java API Java API通过支持平台无关性和安全性,使得Java适应于网络应用。Java API是运行库的集合,它提供了一套访问主机系统资源的标准方法。运行Java程序时,虚拟机装载程序的class文件所使用的Java API class文件。所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了再Java虚拟机上运行的整个程序。 在一个平台能偶支持Java程序以前,必须在这个特定平台上明确地实现API的功能。为访问主机上的本地资源,Java API调用了本地方法。由于Java API class文件调用了本地方法,Java程序就不需要再调用它们了。通过这种方法,Java API class文件为底层主机提供了具有平台无关性、标准接口的Java程序。对Java程序而言,无论平台内部如何,Java API都会有同样的表现和可预测的行为。正是由于在每个特定的主机平台上明确地实现了Java虚拟机和Java API,因此,Java程序自身就能够成为具有平台无关性的程序。 Java API在Java安全性模型方面也有贡献。当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前,都会通过查询访问控制器来检验是否得到了授权。访问控制器是一个类,该类用来执行栈检验,已决定是否允许某种操作。
1、简单性
基本可以认为Java语法是C++语法的纯净版本,即去除了头文件、指针运算、结构、联合、操作符重载、虚基类等。
简单的另一个方面是小,即支持开发能够在小型机器上独立运行的软件。
2、面向对象
Java的面向对象特性与C++旗鼓相当,主要不同在于多继承,在Java中,取而代之的是简单的接口概念,以及Java的元类(metaclass)模型。
3、网络技能
这得益于Java的扩展例程库,用于处理像http和ftp之类的TCP/IP协议。
4、健壮性
其一,Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。
其二,Java相对C++不需要使用指针构造诸如字符串、数组这样的结构,其采用的指针模型可以消除重写内存和损坏数据的可能性。
5、安全性
简单说来,为了适用于网络\分布式环境,Java在安全方面投入了大量精力,使得其能够防范各种攻击,安全性很高。
6、体系结构中立
即编译器生成一个体系结构中立的目标文件格式,只要在有Java运行的系统就可以在许多处理器上运行。
但实际上这并不是Java专用特点,有些其他语言也有这种技术。而且为了实现这一目标,核心在于Java编译器生成与特定的计算机体系结构无关的字节码指令来实现,显然这比全速运行机器指令慢很多,因此,目前难说好坏。
7、可移植性
C/C++中有些基本数据类型的大小只限定了最低长度,二具体长度可能与具体的编译器供应商有关,而Java则不依赖于这个具体实现,其数据类型的大小永远是固定的,从而消除了代码移植时的困扰。
8、解释型
Java解释器可以在任何移植了解释器的机器上执行Java字节码,现在,使用即时编译器将字节码翻译成机器码。
9、高性能
字节码可以(在运行时刻)快速地翻译成运行这个应用程序的特定CPU的机器码。
10、多线程
相较其他编程语言,Java的多线程处理便捷性很强,其在不同的机器上调用多线程的编码完全相同,将多线程的实现交给了底层的操作系统或线程库来实现。
11、动态性
Java可以在库中自由地添加新方法和实例变量,却对客户端没有任何影响,对变化的环境适应性更强。 参考技术B JAVA核心技术是具有面向性的c++语言编程技术,不仅吸收了它本身就有的优点,还摒除了许多难以理解繁琐复杂的多继承概念,所以它有了简单和好用的两个最大优势,作为静态面向代表很好的实现了编程语言的专业理论,能够让程序员用最优雅的思维方式进行原本枯燥复杂的编程计算,同时独立性和平台全面性功能也很强,支持移植数据,分布嵌入系统运用程序。实际上由于价格成本低廉,早在二十世纪九十年代就有研究项目组对这种系统进行开发研究,这才有了现在的平台。 参考技术C
Java程序员需要了解哪些技术?Java程序员常用的技术有哪些?在学习Java的时候,可能需要学习的知识点有很多,但在工作当中,实际经常用到的可能只有20%。下面就帮大家罗列一下Java程序员需要了解的主要的技术知识有哪些。
Java程序员常用的技术:
1.一些Java最常用的包、类:例如String、collections(List/Map/Set)、IO、网络;
2.常用的库:common库、guava库;这些都值得研究源码;(guava库是有一次我在做接口调用的限流时找到的,大名鼎鼎,只是我孤落寡闻)
3.多线程:synchronized、lock、volatile、线程池;
4.JVM:内存模型、内存管理、堆和栈、垃圾回收;
5.常用的设计模式:工厂、单例、代理、策略、门面、观察者等;不要为了用而用;熟悉设计模式方便阅读其他框架的源码;
6.JDBC、异常处理、反射、序列化、Annotation、Cache;
7.熟悉每个Java版本的新特性。
8.Spring的大多数框架,都值得一学。我就把它们放在一类里面了Spring、Spring MVC、Spring boot;
9.ORM框架:Hibernate、Mybatis、JPA;
10.各种常用的数据库连接池:DBCP、C3P0、HikariCP、Druid(我们现在用这个);
11.各种消息队列:我们用到的是RabbitMQ和Kafka;
12.关系型数据库:这个根据项目来吧,Mysql或Oracle或DB2
13.非关系型数据库:MongoDB、Redis(可以当做缓存用);
14.微服务框架:Dubbo或Spring Cloud,我们是用后者,里面的内容非常多;
15.接口:Restful
16.安全认证框架:Shiro、Spring Security;
17.项目构建工具:Maven;
18.版本控制工具:Git、SVN;
19.自动化部署:Jenkins;
20.容器:Docker;
21.负载均衡:Nginx、LVS;
22.Devops
Java程序员常用的技术有哪些?以上内容是Java程序员常用的技术,需要我们熟练的掌握和不断地提升才能成为一名优秀的Java程序员。
参考技术D 【Java的核心技术】有:JDBC、JNDI、EJBS、RMI 等。JAVA核心技术是具有面向性的c++语言编程技术,不仅吸收了它本身就有的优点,还摒除了许多难以理解繁琐复杂的多继承概念,所以它有了简单和好用的两个最大优势,作为静态面向代表很好的实现了编程语言的专业理论,能够让程序员用最优雅的思维方式进行原本枯燥复杂的编程计算,同时独立性和平台全面性功能也很强,支持移植数据,分布嵌入系统运用程序。实际上由于价格成本低廉,早在二十世纪九十年代就有研究项目组对这种系统进行开发研究,这才有了现在的平台。
想了解更多有关计算机编程语音的详情,推荐咨询达内教育。达内教育已从事19年IT技术培训,累计培养100万学员,并且独创TTS8.0教学系统,1v1督学,跟踪式学习,有疑问随时和老师进行沟通;同时,其26大课程体系紧跟企业需求,企业级项目,课程穿插大厂真实项目讲解,对标企业人才标准,制定专业学习计划,囊括主流热点技术,助力学员提高自身竞争力。【感兴趣的话点击此处,免费学习一下】
Java 中都有哪些不同的记忆技术? [关闭]
【中文标题】Java 中都有哪些不同的记忆技术? [关闭]【英文标题】:What are the different techniques for memoization in Java? [closed]Java 中有哪些不同的记忆技术? [关闭] 【发布时间】:2011-04-07 03:05:53 【问题描述】:我知道这个http://onjava.com/pub/a/onjava/2003/08/20/memoization.html,但还有别的吗?
【问题讨论】:
此示例通过代理对对象的所有方法进行记忆。但典型的记忆是当时的一项功能。当你不想记住一个对象的所有方法时,这种代理技术会很烦人。 【参考方案1】:要记住不带参数的函数,请使用 Guava 的Suppliers.memoize(Supplier)
。对于带参数的函数,使用CacheBuilder.build(CacheLoader)
,带参数值对象作为键。
【讨论】:
另见github.com/google/guava/wiki/CachesExplained 记忆示例:***.com/questions/3636244/…【参考方案2】:是的。使用Guava 中的caches。
例子:
import java.math.BigInteger;
import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class Fibonacci
private static final LoadingCache<Integer, BigInteger> CACHE
= CacheBuilder.newBuilder().build(CacheLoader.from(Fibonacci::fib));
public static BigInteger fib(int n)
Preconditions.checkArgument(n >= 0);
switch (n)
case 0:
return BigInteger.ZERO;
case 1:
return BigInteger.ONE;
default:
return CACHE.getUnchecked(n - 1).add(CACHE.getUnchecked(n - 2));
【讨论】:
MapMaker 现在已弃用,取而代之的是 CacheBuilder:code.google.com/p/guava-libraries/wiki/MapMakerMigration @dzieciou 我终于将代码更新为适用于最新番石榴(撰写本文时为 18.0)的代码。而这一次,它已经过测试了!【参考方案3】:使用简单的类型安全 Java 也可以轻松实现记忆。
您可以使用以下可重用类从头开始。
我将它们用作缓存,其生命周期是 web 应用程序上的请求。
如果您需要驱逐策略或同步等更多功能,当然可以使用 Guava MapMaker
。
如果您需要记忆具有许多参数的方法,只需将参数放在具有两种技术的列表中,然后将该列表作为单个参数传递。
abstract public class Memoize0<V>
//the memory
private V value;
public V get()
if (value == null)
value = calc();
return value;
/**
* will implement the calculation that
* is to be remembered thanks to this class
*/
public abstract V calc();
abstract public class Memoize1<P, V>
//The memory, it maps one calculation parameter to one calculation result
private Map<P, V> values = new HashMap<P, V>();
public V get(P p)
if (!values.containsKey(p))
values.put(p, calc(p));
return values.get(p);
/**
* Will implement the calculations that are
* to be remembered thanks to this class
* (one calculation per distinct parameter)
*/
public abstract V calc(P p);
这个是这样使用的
Memoize0<String> configProvider = new Memoize0<String>()
@Override
public String calc()
return fetchConfigFromVerySlowDatabase();
;
final String config = configProvider.get();
Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>()
@Override
public String calc(Long id)
return fetchUsernameFromVerySlowDatabase(id);
;
final String username = usernameProvider.get(123L);
【讨论】:
Guava 尚未获准用于我们的环境、财务软件... Guava 尚未获准用于我们的环境。银行软件……但这可以。但是,我将限制地图的大小以避免内存泄漏。我不关心驱逐,因为这只会在调用一种方法时保留。 我喜欢经过高度测试的代码未被批准的方式,但粘贴在 SO 上的内容是 :) 谨慎使用 Memoize0 示例,因为它不是线程安全的。在竞争条件下,多个线程可能会多次调用 calc() 方法。 Guava 的实现是线程安全的,一旦初始化就在 get() 上无锁,因为它使用双重检查锁定:github.com/google/guava/blob/master/guava/src/com/google/common/… 看起来MapMaker
不存在(不再存在)。请改用CacheBuilder。以上是关于Java的核心技术都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章
Java核心面试宝典Day18GET和POST请求都有哪些常见面试题?