Java重点知识点(一)

0.讲述一下JVM:
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是
一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入
Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟
机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目
标代码(字节码),就可以在多种平台上不加修改地运行。

1.讲述一下GC:
参考答案:JAVA GC(Garbage Collection,垃圾回收)机制是区别C++的一个重要特征,
C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因为垃
圾回收这件繁琐的事情JVM已经为我们代劳。根据JVM规范,JVM把内存划分成了如下几个
区域:1.方法区(Method Area)2.堆区(Heap)3.虚拟机栈(VM Stack)4.本地方法栈
(Native Method Stack)5.程序计数器(Program Counter Register),其中只有方法区和
堆区需要进行垃圾回收,回收的对象就是那些不存在任何引用的对象。

2.说一说三种循环的使用场合
参考答案:for循环必须已知循环次数,所以只能用在次数确定的场合,比如一定数量的数
字累加操作等;while和do-while必须知道循环条件,不必要知道次数,所以当条件已知,
次数不确定的循环场合可以使用while或do-while。那具体使用哪一种,要看循环条件是不
需要执行就已确定的条件,还是需要执行一次后才可以知道的条件。前者使用while,后者
两种都可以,一般使用do-while更加符合后者场景。

3.for和while的区别:
参考答案:循环的结构不同for循环的表达式为:for(单次表达式;条件表达式;末尾循环
体){中间循环体;}。while循环的表达式为:while(表达式){循环体}。2.执行条件的判
断方式不同for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上
述循环,当条件不成立时则跳出当下for循环。while循环当满足条件时进入循环,进入循环
后,当条件不满足时,执行完循环体内全部语句后再跳出(而不是立即跳出循环)。3.使用
的目的不同for循环的目的是为了限制循环体的执行次数,使结果更精确。while循环的目的
是为了反复执行语句或代码块。4.语法不同for循环的语法为:for (变量 = 开始值;变量 <= 结束值;变量 = 变量 + 步进值) {需执行的代码 }。while循环的语法为:while (<条件>) {需执行
的代码 }。

4.说一说使用switch要注意什么?
参考答案:1. switch有两个参数:()中必须使用变量,类型必须是String、byte、short、 int、char、枚举中的某一种类型,不能是long 类型。case后面跟着的必须是常量;2. switch仅适用于等值判断场合,发生区间判断的场合仅能使用if-else if-else方式。3. switch
中的break一般不能省略,省略后会发生case穿透,导致两个case中的代码同时进行,仅适
用于确定想让多个case执行相同语句,或多个case的执行代码互相包含时才会选择性省略
case,如月份日期的输出、文件更新补丁包的覆盖等等。4. default语句一般可以省略,适
合需要对确定分支之外的所有情况进行判定时使用。5.前面case定义的变量在后面的case中
会发生同名冲突现象,解决方案:将每个case都封装成各自的方法或者单独加上大括号表示
分隔。

5.数组有没有 length()方法?String 有没有 length()方法?
参考答案:数组没有 length()方法,有 length 的属性。String 有 length()方法。JavaScript
中,获得字符串的长度是通过length 属性得到的,这一点容易和 Java 混淆。

6.驼峰命名法中,类、方法、变量、常量该如何命名?
参考答案:骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命
名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成
变量和函数的名字。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一
的可读性比较好的命名方式。类:类使用大驼峰命名,即第一个字母也大写,其他单词首字
母也大写;变量&方法:变量和方法一般用小驼峰法标识。驼峰法的意思是:除第一个单词
之外,其他单词首字母大写。譬如int myStudentCount;常量:常量全字母大写,单词之间
使用下划线链接。

7.面向对象封装的理解?
参考答案:什么是封装:封装就是把类中的属性给上不同的访问权限,不允许外界随意修改
为什么封装:保护类中的数据不被破坏。怎么封装:把类中的属性用不同的访问修饰符修
饰,给外界提供可以操作的方法

8.关键字static用法?
参考答案:static修饰成员方法不能访问类的非静态成员变量和非静态成员方法,static修饰
成员变量被所有对象 共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始
化,static修饰代码块类初次被加载的时候,会按照static块的顺序来依次执行每个static
块,并且只会执行一次。

9.讲解一下Java中4种权限修饰符及其作用范围。
参考答案: private(私有的) private可以修饰成员变量,成员方法,构造方法,不能修饰类(此刻指的是外部类,内部类
不加以考虑)。被private修饰的成员只能在其修饰的本类中访问,在其他类中不能调用(这
里也可以看出为什么不能修饰class,因为private本来就是作用于类内部的东西),但是被
private修饰的成员可以通过set和get方法向外界提供访问方式
default(默认的) default即不写任何关键字,它可以修饰类,成员变量,成员方法,构造方法。被默认权限
修饰后,其只能被本类以及同包下的其他类访问。
protected(受保护的) protected可以修饰成员变量,成员方法,构造方法,但不能修饰类(此处指的是外部类,内
部类不加以考虑)。被protected修饰后,只能被同包下的其他类访问。如果不同包下的类要
访问被protected修饰的成员,这个类必须是其子类
public(公共的) public是权限最大的修饰符,他可以修饰类,成员变量,成员方法,构造方法。被public修
饰后,可以再任何一个类中,不管同不同包,任意使用。

10.说说&和&&的区别?
参考答案:1.&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的
表达式的结果都为 true 时,整 个运算结果才为 true,否则,只要有一方为 false,则结果为
false。 2.&&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达
式,例如,对于 if(str!=null &&!str.equals(“”))表达式,当 str 为 null 时,后面的表达式不
会执行,所以不会出现 NullPointerException 如果将 &&改为&,则会抛出
NullPointerException 异常。If(x==33&++y>0)y 会增长,If(x==33&&++y>0)不会增长 3.&
还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,
我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,
0x31&0x0f 的结果为 0x01。

11.多态的两种表现是什么?
参考答案:多态可以分为两种:设计时多态和运行时多态。设计时多态:即重载,是指Java
允许方法名相同而参数不同(返回值可以相同也可以不相同)。运行时多态:即重写,是指
Java运行根据调用该方法的类型决定调用哪个方法。多态目的:增加代码的灵活度。

12.请判断,两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,该说法是否正确,为什么?
参考答案:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)
应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同
(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的
hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上
述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率
会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下
降)。

13.是否可以从一个 static 方法内部发出对非 static 方法的调用?
参考答案:不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才
可以在该对象上进行方法调 用,而 static 方法调用时不需要创建对象,可以直接调用。也
就是说,当一个 static 方法被调用时,可能还没有 创建任何实例对象,如果从一个 static
方法中发出对非 static 方法的调用,那个非 static 方法是关联到哪个对象上 的呢?这个逻
辑无法成立,所以,一个 static 方法内部发出对非 static 方法的调用。

14.重载与重写的区别?
重载1.重载Overload是一个类中多态性的一种表现2.重载要求同名方法的参数列表不同(参数
类型,参数个数甚至是参数顺序)3.重载的时候,返回值类型可以相同也可以不相同。无法
以返回型别作为重载函数的区分标准重写1.发生在父类与子类之间2.方法名,参数列表,返
回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同3.访问修饰符的限
制一定要不小于被重写方法的访问修饰符(public>protected>default>private)4.重写方法
一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常区别 方法的重载
和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行
时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参
数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重
写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访
问,不能比父类被重写方法声明更多的异常。重载对返回类型没有特殊的要求,不能根据返
回类型进行区分。

15.final关键字作用?
在Java中,final关键字可以用来修饰类、变量(包括成员变量和局部变量)当用final修饰一
个类时,表明这个类不能被继承。当用final修饰变量时,表明这个类不能被继承。

16.Java语言如何进行异常处理,关键字:throws、throw、try、 catch、finally分别如何使用?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接
口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出
现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到
这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、 throw、throws和finally。一般情况下是用try来执行一段程序,如果系统会抛出(throw)
一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)
来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想
要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能
抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异
常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常
栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈
就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。

17.阐述final、finally、finalize的区别?
final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出
新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们
在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能
读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。- finally:通
常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异
常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。-
finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内
存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过
重写finalize()方法可以整理系统资源或者执行其他清理工作

18.throw 和 throws 的区别、及处理方式?
1.throw:用于抛出异常对象,后面跟的是异常对象;throw 用在方法体内; 2.throws:用
于抛出异常类,后面跟的是异常类名,可以跟多个,用逗号隔开。throws 用在方法上 3.异
常处理方式:抛出 throws、捕捉 try-catch-finally 。 4.什么时候定义 try,什么时候定义
throws? 1.功能内部如果出现异常,如果可以处理,就用 try;2.如果内部处理不了,就必
须声明出来,让调用者处理。

19.请说明Calendar、Date、long三种类型是如何表示时间的,以 及他们的互相转换关系。
long:时间戳,表示1970年1月1日至当前时间的毫秒值;获得方法:long time=System.currentTimeMillis();Date:java.util 包提供的 Date 类来封装当前的日期和时
间。获取方式有两种:有参和无参构造:无参:当前时间long转换成的Date对象:Date date=new Date();有参:指定long数据转换成的Date对象。Date date=new Date(0);转换回
毫秒:long time=date.getTime();Calendar:Calendar 类是一个抽象类,它为特定时间与一
组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方
法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。获得方式:使用静态方
法Calendar c=Calendar.getInstance()直接获得当前时区的日历对象;转换成Date:Date date=c.getTime();转换成毫秒:long time=c.getTimeMillis();任意一种形式,只要转换成
Date,就可以根据SimpleDateformat类的方法按照指定格式输出为时间字符串。

20.Java中== 和equals()的区别?
== 是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否
相等.默认Object类的equals方法是比较两个对象的地址,此时和 == 的结果一样.换句话说:基
本类型比较用 == ,比较的是他们的值.默认下,对象用==比较时,比较的是内存地址,如果需要比
较对象内容,需要重写equal方法

21.Error和Exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一
种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉
或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正
常,从不会发生的情况。

22.遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么? Java 中 List 遍历的最佳实践是什么?

遍历方式有以下几种:for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次
读取每一个位置的元素,当读取到最后一个元素后停止。迭代器遍历,Iterator。Iterator
是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。foreach 循环遍历。foreach 内部也是采用了
Iterator 的方式实现,使用时不需要显式声明 Iterator 或计数器。优点是代码简洁,不易出
错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。最佳实
践:Java Collections 框架中提供了一个 RandomAccess 接口,用来标记 List 实现是否支持
Random Access。如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位
置读取元素的平均时间复杂度为 O(1),如ArrayList。如果没有实现该接口,表示不支持Random Access,如LinkedList。推荐的做法就是,支持 Random Access 的列表可用 for 循
环遍历,否则建议用 Iterator 或 foreach 遍历。

23.说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的 value统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是
直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

24.ArrayList与LinkedList的区别?
相同点:他们都是实现了List接口;不同点:ArrayList底层实现时数组,数组有下标,所以
他的改查功能速度要快一点,而LinkedList 的底层实现是链表,他的增删速度要快一点。

25.List、Set、Map是否继承自Collection接口?
List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储
的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适
用于按数值索引访问元素的情形。

26.List、Set、Map是否继承自Collection接口?
List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的
零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用
于按数值索引访问元素的情形。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值