这是Java高级面试题系列的最新篇。这部分讨论变量参数、断言、垃圾收集、初始化器、标记化、日期、日历和其他核心Java问题。程序员面试指南:https://www.youtube.com/watch?v=0xcgzUdTO5MJava面试题集锦指南:https://www.youtube.com/watch?v=GnR4hCvEIJQ什么是可变参数?断言有什么用?什么时候使用断言?什么是垃圾收集?用例子解释垃圾收集?垃圾回收什么时候运行?垃圾收集的最佳实践?什么是初始化数据块?什么是静态初始化器?什么是实例初始化块?什么是正则表达式?什么是代币化?举个代币化的例子?如何使用扫描仪类(ScannerClass)标记化?如何将小时(小时)添加到日期对象(DateObjects)?如何格式化日期对象?Java中日历类(CalendarClass)的用途是什么?如何在Java中获取日历类的实例?解释一下Calendar类中的一些重要方法?数字格式类的目的是什么?什么是可变参数?可变参数允许使用不同数量的参数调用方法。请参阅下面示例中的sum方法。可以使用1个int参数,或2个int参数,或多个int参数调用此方法。//int(type)followed...(threedot's)issyntaxofvariableargument.publicintsum(int...numbers){//insidethemethodavariableargumentissimilartoanarray.//numbercanbetreatedasifitisdeclaredasint[]numbers;intsum=0;for(intnumber:numbers){sum+=number;}returnsum;}publicstaticvoidmain(String[]args){VariableArgumentExamplesexample=newVariableArgumentExamples();//3ArgumentsSystem.out.println(example.sum(1,4,5));//10//4ArgumentsSystem.out.println(example.sum(1,4,5,20));//30//0ArgumentsSystem.out.println(example.sum());//0}什么是断言?Java1.4中引入了断言。它允许您检验假设。如果断言失败(即返回false),则抛出AssertionError(如果启用断言)。一个基本的断言如下所示。privateintcomputerSimpleInterest(intprincipal,floatinterest,intyears){assert(principal>0);return100;}什么时候使用断言?断言不应用于验证公共方法或命令行参数的输入数据。IllegalArgumentException将是更好的选择。在公共方法中,只使用断言来检查不应该发生在它们身上的事情。什么是垃圾收集?垃圾收集是Java中自动内存管理的另一个名称。垃圾收集的目的是为程序保留尽可能多的空闲堆。JVM删除堆上不再从堆中引用的对象。用例子解释垃圾收集?例如,将从函数调用以下方法。voidmethod(){Calendarcalendar=newGregorianCalendar(2000,10,30);System.out.println(calendar);}通过引用函数第一行代码中的变量calendar在堆上创建一个GregorianCalendar类的对象.函数执行完毕后,引用变量calendar不再有效。因此,不会在方法中创建对该对象的引用。JVM认识到这一点并从堆中删除该对象。这称为垃圾收集。#p#垃圾回收什么时候运行?垃圾收集运行在JVM的一时兴起(还不错)。运行垃圾回收的可能场景是:可用堆内存不足CPU空闲垃圾回收的最佳实践?以编程方式,我们可以要求(记住这只是一个请求-而不是命令)JVM通过调用System.gc()方法运行垃圾收集。当内存已满并且堆上没有可用于垃圾回收的对象时,JVM可能会抛出OutOfMemoryException。对象在通过垃圾回收从堆中移除之前运行finalize()方法。我们建议不要使用finalize()方法编写任何代码。什么是初始化数据块?初始化块——创建对象或加载类时运行的代码。初始化块有两种类型:静态初始化程序:加载类时运行的代码实例初始化程序:创建新对象时运行的代码什么是静态初始化程序?看看下面的例子:static{和}之间的代码称为静态初始值设定项。它仅在第一次加载类时运行。在静态初始值设定项中只能访问静态变量。虽然创建了三个实例,但静态初始化程序只运行一次。publicclassInitializerExamples{staticintcount;inti;static{//Thisisastaticinitializers.RunonlywhenClassisfirstloaded.//OnlystaticvariablescanbeaccessedSystem.out.println("StaticInitializer");//i=6;//COMPILERRORSystem.out.println("CountmainwhenStaticInitialize+count)staticrunning;(String[]args){InitializerExamplesexample=newInitializerExamples();InitializerExamplesexample2=newInitializerExamples();InitializerExamplesexample3=newInitializerExamples();}}输出示例创建类实例的时间。publicclassInitializerExamples{staticintcount;inti;{//这是一个instanceinitializers.Runeverytimeanobjectiscreated.//staticandinstancevariablescanbeaccessedSystem.out.println("InstanceInitializer");i=6;count=count+1;System.out.println("CountwhenInitializerisrunis"+count);}publicstaticvoidmain(String[]args){InitializerExamplesexample=newInitializerExamples();InitializerExamplesexample1=newInitializerExamples();InitializerExamplesexample2=newInitializerExamples();}}示例输出InstanceInitializerCountwhenInstanceInitializerisrunis1InstanceInitializerCountwhenInstanceInitializerisrunis2InstanceInitializerCountwhenInstanceInitializerisrunis3什么是正则表达式?Regularexpressionsmakeitveryeasytoparse,scan,and拆分字符串。Java中常用的正则表达式-Patter、Matcher和Scanner类。什么是代币化?标记化是指根据分隔符将字符串拆分为多个子字符串。例如,分隔符;将字符串ac;bd;def;e拆分为四个子字符串ac、bd、def和e。分隔符本身也可以是一个普通的正则表达式。String.split(regex)函数将正则表达式作为参数。举个代币化的例子?privatestaticvoidtokenize(Stringstring,Stringregex){String[]tokens=string.split(regex);System.out.println(Arrays.toString(tokens));}tokenize("ac;bd;def;e",";");//[ac,bd,def,e]如何使用扫描器类(ScannerClass)标记化?privatestaticvoidtokenizeUsingScanner(Stringstring,Stringregex){Scannerscanner=newScanner(string);scanner.useDelimiter(regex);List
