这是Java高级面试题系列的最新篇。这部分讨论变量参数、断言、垃圾收集、初始化器、标记化、日期、日历和其他核心Java问题。什么是可变参数?断言有什么用?什么时候使用断言?什么是垃圾收集?用例子解释垃圾收集?什么时候运行垃圾收集?垃圾收集的最佳实践?初始化程序?什么是实例初始化块?什么是正则表达式?什么是代币化?举个代币化的例子?如何使用Scanner类进行标记化?如何将小时数添加到日期对象?如何格式化日期对象?Java中日历类的用途是什么?如何在Java中获取Calendar类的实例?解释一下Calendar类中的一些重要方法?NumberFormattingClass(数字格式类)?什么是可变参数?可变参数允许使用不同数量的参数调用方法。请参阅下面示例中的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认识到这一点并从堆中删除该对象。这称为垃圾收集。垃圾回收什么时候运行?垃圾收集运行在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();}}实例输出StaticInitializerCountwhenStaticInitializerisrunis0.什么是实例初始化块呢?每次创建类的时候看一个例子,代码在实例初始化程序中运行。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什么是正则表达式?正则表达式能让解析、扫描和分割字符串很容易。Java中常用的正则表达式-Patter、Matcher和Scanner类。什么是代币化?分词是指根据分隔符将一个字符串分成若干个子串。例如,分隔符;将字符串ac;bd;def;e拆分为四个子字符串ac、bd、def和e。分隔符本身也可以是一个普通的正则表达式。String.split(regex)函数将正则表达式作为参数。举一个标记化的例子?e",";");//[ac,bd,def,e]如何使用扫描器类(ScannerClass)分词?privatestaticvoidtokenizeUsingScanner(Stringstring,Stringregex){Scannerscanner=newScanner(string);scanner.useDelimiter(regex);List
