Java基础概念(全面)

来源:互联网 发布:与淘宝齐名的公司 编辑:程序博客网 时间:2024/05/16 11:03

一、 基本知识

1. JDK和JRE的区别

答:JDK是java语言开发工具包,包含JRE和开发工具(javac.exe等);JRE是java语言的运行环境,包含JVM和核心类库;JVM是java虚拟机,保证了java的跨平台性。

 

2. JVM跨平台吗?

答:JVM不具有跨平台性,不同的操作系统所对应的JVM不一样。正是因为JVM的不跨平台,才能够使java语言具有跨平台性。

 

3. 保留字是什么?

答:保留字是还未使用的关键字,可能在java以后的版本中使用。有goto和const。

 

4. java语言的特点?

答:完全面向对象,跨平台性,开源,简单易学,安全可靠,高性能,分布式处理,多线程,健壮性,多态。

 

5. main是关键字吗?

答:不是的。main是主函数的名字,能够被虚拟机识别,是程序执行的入口。

 

6. path和classpath的区别?

答:path环境变量配置的是可执行文件.exe的执行路径;能够在不同盘符下访问path路径下的可执行文件。Classpath配置的java语言编译后生成的字节码文件的执行路径。

 

7. 计算机最基本的存储单位是:字节(byte)

   计算机能直接识别的进制是:二进制

 

8进行运算的时,变量和常量有什么区别?

答:变量在运算过程中的值是变化的,可以被多次赋值。常量则是固定的。

 

9标识符的组成?以及命名规则?

答:标识符有26个字母的大小写,0到9,_和$组成。

命名规则:不能使用关键字,不能数字开头,严格区分大小写,要见名知义。

函数名和变量名如果是多个单词组成,第一个单词的首字母小写,其余首字母大写。

类名和接口名如果是多个单词组成,首字母全部大写。

包名全部小写。

常量名全部大写,如果是多个单词,用_隔开。

 

10.变量数据类型分为哪几种?如何使用变量?

答:基本数据类型:整形:包括byte、short、int、long。浮点型:包括float、doble。

字符型;char;布尔型:boolean。

引用数据类型:数组、类、接口,枚举。

变量需要先定义,再赋值,才能使用。

 

11.常量分为哪几种?

答:自定义常量和字面值常量。自定义常量是我们自己通过final修饰定义的常量。字面值常量包括整数、小数、布尔、字符、字符串。

 

12.byte的范围多少?char的范围多少?

答:byte范围-128到127 。   char范围0到65535.

 

13. ASCII码表中 字符 '0'  , 'a' , 'A' 分别对应int类型的值是多少.

答:0在表中对应的值是48,a对应的是97;A对应的是65.

 

14. long是8个字节,float是4个字节,为什么long 比 float小?

答:底层采用的运算规则不一样。

 

15. 以取值范围的大小排列数据的基本类型.

答:double>float>long>int>char>short>byte

 

16.+=、-=、这些运算符内隐含了强制类型转换。

 

17.++和—的使用?

答:单独使用的时候,在前在后都一样。

参与运算的时候,在前是先自加或者自减,然后再用这个结果参与运算。在后是先参与运算,再进行自加或者自减。

 

18. 逻辑或 " | " 和 短路或 " || "有什么区别?

答:|不管前面的结果是真是假后面的都会运算,||前面为真后面的不参与运算。但是结果是一样的。

 

19. 逻辑与 " & " 和 短路与 " && " 由什么区别?

答:&不管前面的结果是真是假后面的都会运算,&&前面为假后面的不参与运算。但是结果是一样的。

 

20.Math.round原理是什么?

答:先加0.5,然后再取floor值。

 

21.生成随机数的方法?

答:第一种:Random类中的方法;第二种Math.random()方法,生成的是0.0和1.0范围直接的小数。

 

22.if…else..和三元表达的区别

答:能用三元表达式写的就能用if语句写,但是能用if语句写的,三元表达式不一定能写。三元表达式必须要有一个结果。

 

23.while、do while 、for的区别?

答:do while语句是先性后判断,while和for先判断后执行。

for循环结束后,其中定义的初始化条件不能再使用。

 

24.if和switch区别?

答:if1.对具体的值进行判断。2.对区间判断。3.对运算结果是boolean类型的表达式进行判断。

switch: 1.对具体的值进行判断。2.值的个数通常是固定的  

 

25. switch语句的表达式可以放什么?

答:byte、short、int、char。JDK1.5以后可以使用枚举,1.7之后可以使用String。

 

26. 死循环的两种写法.

答:while(true)  和  for(;;)

 

27. break和continue的区别

答:break是完全跳出循环,不再执行循环体的代码。也可以用在switch语句中。Continue是提前结束本次循环,进入下次循环。Return是结束方法。

 

28.switch中break可以省略吗?default可以省略吗?

答:break在最后一个可以省略,其他的不要省略。Default可以省略。

 

29:方法重载和方法重写的区别?

答:方法重载是在同一个类中出现同名方法,参数列表不同,与返回值类型无关。

方法重写是在子父类间,子类出现和父类声明完全相同的方法时,就成为方法重写。重写要求返回值必须相同或者有子父类关系。

父类私有的方法,子类不能重写,因为子类压根就不能继承 子类重写父类方法时,权限不能更低,最好一致。

30.方法的注意事项:

答:要明确方法的返回值类型,明确方法的参数列表。

 

31.方法的调用?

答:有返回值时可以单独调用,但是没有意义;也可以放在输出语句中;可以赋值给变量。无返回值直接调用即可。

 

32.数组的定义格式?

答:int[] arr =new int[5];int arr[]= new int[5];

int[] arr = new int[]{1,5,6,7,…} int[] arr = {23,6,8,9…}

二维数组

String[][] arr = new String[3][];

Syso(arr[0])  打印的结果是null。

 

33.数组的默认值?

答;整形的默认值是0,引用数据类型是null;boolean型的是false。

 

34.栈内存和堆内存?

答:栈内存用于存储局部变量和代码的执行,堆内存中都是new出来的。

 

35.数组和集合的区别:

(1)长度区别:数组长度是固定的;集合长度可变。

(2)存储内容:一个数组只能存储同一种数据类型的元素;集合可以存储不同数据类型的元素。

(3)数据类型:数组能够存储基本数据类型,也能够存储引用数据类型;集合只能存储引用数组类型。

 

36.数组和集合的转换?

答:数组转为集合:Arrays.asList(数组),转为集合后不能添加、删除元素。但是可以修改元素。把基本类型的数组转为集合,把这个数组作为对象存入集合中。

集合转为数组:list.toArray().

 

二、面向对象

37.局部变量和成员变量的区别:

(1)定义位置不同:成员变量定义在类中方法外,局部变量定义在方法内。

(2)作用范围不同:成员变量在整个类中有效,局部变量在所在的方法有效。

(3)内存位置不同:成员变量随着对象的创建存放在堆内存中,局部变量存放在栈内存中。

(4)初始化值不同:成员变量是有默认的初始化的值的;局部变量不赋值不能用。

(5)生命周期不同:成员变量随着对象的存在而存在,随着对象的消失而消失;局部变量随着方法的调用而存在,方法调用完毕而消失。

 

38.变量的使用顺序?

答:就近原则。先在局部找,局部找不到在本类中找,本类找不到就去父类找,找不到就编译失败。

 

39.类和对象的关系?

答:类是具有相同或相似一类事物的抽象;对象是类的实例化。

 

40.java描述事物最基本的单位?

答:类

 

41.什么叫面向对象?

答:面向对象是一种思想,它是基于面向过程的,强调的是具备功能的对象,让对象调用方法解决问题。在开发中,要完成特定的功能就去寻找相应的对象,如果找不到就创建对象,使用对象,维护完善对象。

自己举例说明:厨师做饭,女朋友洗衣服。。。。。

思想特点:1.让复杂的事情简单化;2,更符合人类的思维需求;3.角色从执行者到指挥者。

三大特征:封装,继承,多态。

 

42.什么是封装?封装的原则?好处?

答:封装就是把不需要对外暴露的状态信息隐藏在对象内部,不允许外部程序直接访问对象的信息,而是通过该类对外提供公共的访问方式对其访问和操作。

原则:(1)将不需要对外暴露的信息隐藏;(2)对外提供公共的访问方式。

好处:将变化隔离;提高了安全性;便于使用,提高了重用性。

 

43.封装就是私有,对吗?为什么?

答:private是封装的一种体现形式。方法也是封装。

 

44. Java中参数传递的问题:

答:如果是基本数据类型,传递的参数要和形参的类型一致;如果是引用数据类型,那么传递的参数类型和形参的一致,或者是他的子类。

 

45. 构造方法,set方法都可以给成员变量赋值,这两种赋值方式有什么区别?

答:构造方法主要作用是用来给对象初始化,赋值只是他的兼职工作,也可以不用赋值。

Set方法只能用来赋值,在原有对象的基础上赋值。

 

46. static关键字的特点?注意事项是什么?有什么好处和弊端?

答:(1)被static修饰的变量和方法随着类的加载而加载(2)优于对象存在(3)能够被类名直接调用(4)资源共享。

注意事项:静态方法中不可以定义this、super关键字,因为静态优先于对象存在,静态只能覆盖静态。

好处:static能够被类名直接调用,定义的是对象的共性内容,不用每个对象单独定义,节省空间。弊端:生命周期过长。

 

47.类变量和实例变量的区别?

答:(1)所属不同:类变量属于类,是对象的共性内容;实例变量属于对象,是特性内容。

(2)存储位置不同:类变量随着类的加载存储于方法区;实例变量随着对象的创建存储于堆内存中。

(3)生命周期不同:类变量随着类的加载而存在,随着类的消失而消失;实例变量随着对象的存在而存在,随着对象的消失而消失。

(4)调用方式不同:类变量能够被类名直接调用,有对象的时候也能被对象调用;实例变量只能被对象调用。

48. 构造方法能不能重载?

答:可以,在同一个类中,参数列表不同,与返回值无关

 

49.静态代码块和构造代码块的区别?

答:(1)静态代码块属于类,给类进行初始化,类一加载就会执行,只执行一次,经常用于加载驱动。

(2)构造代码块给对象进行统一初始化,每创建一次就会执行一次。

50.什么是继承?

答:当多个类中有很多共性的内容时,我们可以把这些共性内容抽取出来封装成一个类,让这些类与这个封装的类产生关系。这种关系就是继承。

 

51.继承的的特点和好处,弊端?

答:特点:java只支持单继承,但是能够多层次继承;接口能够单继承,也能够多继承。

好处:( 1)提高了代码的复用性(2)提高了代码的维护性(3)提高了代码的扩展性。(4)让类与类产生了关系,是多态的前提。

弊端:增强了类与类的耦合性。

 

 

52.this和super 的区别?

答:this代表对象的引用,super代表当前对象父类的引用。

 

53.Super()和this()在构造方法能同时使用吗?

答 :不能,super调用的是父类的构造,要放在构造函数的第一行;this调用的是本类的构造,也要放在第一行。

 

Super关键字和this关键字能否在构造函数中共存?

答:能。

 

54.为什么每个构造函数中第一行都有默认的super()?

用于子类对象访问父类前,对父类数据进行初始化。

 

55.为什么默认的super()都是空参的呢?

因为Object类是所有 类的父类,Object中只有一个空参构造。

 

56.构造方法的特点?

答:(1)方法名和类名相同(2)没有返回值,连viod都没有。(3)不用写return,可以有return;

 

57.this的作用?

答:(1)区别局部变量和成员变量(2)代表本类对象的引用(3)也可以用于构造方法的调用。

 

58.子父类都有静态代码块,构造代码块,构造方法的执行顺序?

答:父类的静态代码块先执行,再执行子类中的静态代码块;接着执行父类的构造代码块和父类的构造方法,最后执行子类的构造代码块和构造方法。

 

 

59. final修饰的变量的初始化时机:

答:a.未被static关键字修饰                

* 可以显示初始化

* 可以在构造方法中初始化

b.被static修饰

* 可以显示初始化

* 可以在静态代码块中初始化

* 不能在构造方法中初始化

 

60. final如果修饰局部变量,会发生什么事情?

答:基本类型,是值不能被改变,引用类型,是地址值不能被改变,对象中的属性可以改变。

 

61. 什么是多态?多态的体现,前提,好处和弊端分别是什么?

答:同一事物在不同时刻表现出来的不同状态。

体现:父类引用指向子类对象,父类引用作为参数可以接收其子类对象,接口引用作为参数可以接收其实现类对象。

前提:(1)类与类之间要有关系,要么继承,要么实现(2)要有方法重写(3)父类或者接口引用指向子类对象

好处:(1)提高了代码的维护性(2)提高了代码的扩展性,父类引用指向子类对象

弊端:父类引用只能调用父类的方法,不能调用子类特有的方法和属性。

 

*向上转型:父类或者父接口指向子类对象。

*向下转型:把那个引用强制转为子类对象。

 

62.多态中成员方法和变量的特点?

答:(1)一般方法:编译看左边,运行看右边。(2)静态方法:编译看左边,运行看左边。(3)变量:编译看左边,运行看左边。

 

63.抽象类和抽象方法的特点,有什么关系?

答:抽象类不能创建对象,需要子类继承;抽象方法没有方法体,需要子类去实现。抽象类不一定含有抽象方法,抽象方法一定在抽象类中。

一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

* 可以

* 这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

 

 

64.抽象类中的抽象方法和非抽象方法的区别?

答:抽象方法要求子类必须重写,完成相应的功能;非抽象方法让子类继承,提高代码的复用性。

 

65.abstract不能和哪些关键字共同存在?

答:private:私有的方法是不可见的,无法被复写

final:被final修饰的方法是最终方法,无法被复写

static:被static修饰的方法,要随类加载到方法区,由于抽象方法没有方法体所以不能加载

 

66.final修饰的变量、方法、和类有什么特点?

答:final修饰的变量只能赋值一次,不能发生改变,如果修饰的基本类型,是其值不能发生改变,如果修饰的引用数据类型,是地址值不能发生改变;final修饰的方法不能被重写;final修饰的类不能被继承,也称最终类。

 

67.final、finally、finalized的区别?

答:(1)final是一个关键字,是用来修饰类,成员变量,成员方法的,

它修饰的类不能被继承,但是可以继承其他类,

它修饰的成员变量是一个常量,只能赋值一次

它修饰的成员方法不能被子类重写

(2)finally是 try-catch-finally语句的一个模块,正常情况下里边的代码永远会执行,一般是用来释放资源的

(3)finalize是Object类中的方法,当对象变成垃圾的时候,由GC(Java中的垃圾回收机制)来调用该类的finalize()方法回收垃圾。

 

68.接口中的成员的特点?

答:都是常量,public static final ;方法都是抽象方法,public abstract;没有构造方法。

 

69、类与类、类与接口、接口与接口的关系?

答:类只能单继承类,但是能够多层次继承;类实现接口,能同时实现多个接口,能在继承类的同时实现接口;接口可以单继承接口,也能多继承。

 

70.接口和抽象类的区别?

(1)成员的特点:抽象类可以有变量、常量、构造方法、一般方法、抽象方法;接口有且只能有常量和抽象方法。

(2)关系特点:类与类支持单继承,不能多继承,但是能够多层次继承,类与接口是实现关系,一个类能实现多个接口,一个类继承类一个类的同时能实现多个接口;接口与接口之间能单继承,也能多继承;

(3)设计理念:抽象类定义的是该继承体系的共性功能,是is a的关系。接口定义的是该体系的拓展功能,是like a的关系。

 

71.接口的思想特点?

(1)对外暴露的规则(2)接口是程序对外的功能拓展(3)接口是用来多实现的(4)接口的出现降低了类与类之间的耦合性。

 

 

72.什么是内部类,特点是什么?

答:在类中定义的类就是内部类。特点(1)能够直接访问所在类的成员,包括私有的。(2)外部类访问内部类需要创建内部类的对象。

 

73.成员内部类是什么?

答:成员内部类是定义在成员位置的类。能够被私有、静态修饰。

 

74.内部类的方法如果访问局部变量,内部类的成员变量,外部类的成员变量?

答:局部变量可以直接访问;内部类的成员变量this.   ;外部类的成员变量:外部类名.this.

 

75.局部内部类访问的局部变量为什么要用final修饰?

答:因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用。但是JDK1.8以后取消了这个特性,会默认加上final的。

 

76.什么是匿名内部类?

答:匿名内部类就是没有名字的内部类,是内部类的简化形式。匿名内部类必须继承或实现一个接口,在使用的时候直接用父类的名字创建一个子类对象并实现其中的方法,匿名内部类的实质是一个继承了该类或者实现该接口的匿名的子类对象。

前提:必须继承一个类或实现一个接口。

规则:(1)不能是抽象的,因为它的本质是一个子类对象。(2)不能定义构造方法,因为没有类名。

使用:(1)当接口中的只有一个抽象方法时,并对方法调用一次的时候(2)传递参数的时候,如果参数是接口或抽象类,其实需要的就是实现类对象或者子类对象,这个时候使用匿名内部类。

 

77、匿名对象何时使用?

答:(1)当对对象方法调用一次的时候(2)可以作为实际参数进行传递

 

78适配器模式?

当一个接口有多个抽象方法时,而我们只使用其中的一个或两个方法时,每次使用的时候我们都要重写这些方法,比较麻烦。我们可以定义一个类去实现这个接口,并重写里面的方法,只是方法体为空,并把这个类定义为抽象类,我们使用的时候继承这个类重写需要的方法就就可以了。

 

79.四种权限修饰符的比较?

答:public的权限最大,同一类中,同一个包中,不同包中(子类),不同包中(无关类)都可以访问。  给大家使用

Protected同一类中,同一个包中,不同包中(子类),可以访问。强调的是子类

默认     同一类中,同一个包中 可以访问。  强调的是同一个包

Private   同一类中访问。 强调的是自己

 

80.package在第一行,只能有一个;然后是import导包;最后是class。

 

81.代码块的分类:

局部代码块:让变量尽早的消失,节约资源,提高效率。

构造代码块:用于给对象初始化;

静态代码块儿:给类进行初始化,用于加载驱动。

同步代码块:为了防止CPU高速切换出现安全问题。

 

三、API

81.==和equals的区别?

答:“==”是比较运算符,既能比较基本数据类型,又能比较引用数据类型。基本数据类型比较的是数值,引用数据类型比较的是地址值。

equals是一个方法,只能比较引用数据类型。所有的类都会继承Object的equals方法。重写equals方法比较的是对象的内容,如果没有重写将调研Object的equals方法,比较的是地址值。

 

82.String str = null 和String str = “”的区别?

答:String str = null只是声明了引用,但是没有创建对象,没有为其开辟空间,不能操作方法。String = “”是创建了一个长度为0的字符串,并在内存中分配了空间。

 

83.String s1= “abc”, String s2= new String(“abc”),s1==s2结果是什么?s1.equals(s2)结果是什么?

答:s1==s2结果为false。s1指向的常量池中的对象,s2指向的是堆内存中的对象,两者的地址值不同。s1.equals(s2)结果是true。String重写了equals方法,比较的是内容。

 

84.String,StringBuffer、StringBuilder的区别?

答: String是一个特殊的引用数据类型,是一个长度不可变的字符序列,没有缓冲区,一旦创建就不会发生变化了。即使重新赋值不是在原来对象的基础上改变的,而是创建了一个新的对象,将引用指向这个新的对象,浪费空间,效率比较低。

StringBuffer、StringBuilder是容器,是可变的字符串序列。StringBuffer是JDK1.0版本的,线程是安全的,效率比较低。StringBuilder是JDK1.5出现的,线程不安全,效率高。

 

85.StringBuilder的底层是什么?

答:底层是字符数组,原始长度为16。通过append添加元素的时候,会自动扩容,扩容规则:大字符串的长度= 小数组长度*2+2.

 

86.为什么出现基本数据类型包装类?

答:将基本数据类型封装为对象的好处能在对象中封装更多的功能操作数据。

 

87.String 和int直接的转换?

答:将int类型转为String类型的方法:(1)基本数据类型+“”(2)Integer.toString(int num)(3)String.valueOf(int  i)

将String转为int:Integer.parseInt(String s)

 

88.基本数据类型包装类的自动拆装箱是什么?

答:是JDK1.5版本出现的新特性,自动装箱就是把基本数据类型转为为包装类型。拆箱就是把包装类转换为基本数据类型。

 

89.Object类中的常见方法有哪些?

答:hashCode():返回值是int,是该对象的哈希玛值。

equals():返回值是boolean,比较的是地址值。

toString():返回该对象的字符串表现形式。

getClass():返回值类型是Class。返回的是创建该对象所属类对应的字节码文件。

这些方法都需要对象调用,在开发的过程中要重写。

地址值的组成:类名@十六进制的哈希值。

 

 

90.获取当前时间毫秒值有哪几种方式?

答:(1)new Date().getTime();(2)System. currentTimeMillis()(3)Calendar.getInstance().getTimeInMillis()

 

91.正则表达式常用的;

\d 数字:[0-9] 

\w 单词字符:[a-zA-Z_0-9] 

(X)表示分组

\\1表示和前面的相同

. 任何字符

 

X? ,一次或一次也没有 

X* ,零次或多次 

X+ ,一次或多次 

X{n} ,恰好 n 次 

X{n,} ,至少 n 次 

X{n,m} ,至少 n 次,但是不超过 m 次

 

92.日历类和日期类相互转换:

Calendar c = Calendar.getInstance();  c.setTime(date);  c.getTime()

 

93.Date和String类型的转换?

Date类型转为String 是格式化:format

String转Date是解析;parse

 

三、集合

94.简述集合体系?

答:集合分为单列集合和双列集合。

单列集合的顶层是Collection接口,包括List和Set集合。

(1.1)List集合的特点是元素可重复,有序,有索引,能够有角标操作集合,有特有的迭代方式ListIterator。包括ArrayList、LinkedList和Vector。

ArrayList集合底层采用的是数组数据结构,查询速度比较快,因为数组有索引,在内存中分配的空间是连续的,但是增删比较慢。线程不同步,效率高。初始容量为10。

LinkedList集合的底层采用的是链表数据结构,增删速度比较快,查询速度比较慢。线程不同步。

Vector底层数据结构也是数组数据结构,但是线程同步,效率低,特有取出元素的方式是枚举。因为效率低,逐步被ArrayList替代。

(1.2) Set集合的特点元素是无序的(存入和取出的顺序不一致),元素不可以重复。包括HashSet和TreeSet。

HashSet的底层数据结构是哈希表,线程不同步,效率高。保证元素的唯一性额有的依据是元素的hashCode和equals方法。如果hashCode不同,不调用equals方法。如果hashCode相同,才会调用equals方法判断元素是否相同。

TreeSet的底层数据结构是二叉树,线程不同步,效率高。能够给元素进行排序。保证元素唯一性的依据是compareTo和return0。排序的两种方式:第一种元素自身实现Comparable接口,重写compareTo()方法。这种排序方式叫元素的自热排序,也叫默认排序。第二种是当元素自身不具备比较性或者具备的比较性不是所需要的,这时就让集合自身具备比较性,当集合初始化时就有了比较性。定义一个比较器实现Comparator接口,重写compare方法,定义集合的时候将比较器作为参数传递给TreeSet的构造函数,这样集合就具有了比较性。

自然排序 返回值为-1时,倒序 返回值为0时一个元素 返回值为1时怎么存怎么取

比较器排序 等于0可以重复 

(2)Map是双列集合的顶层接口,该集合存储的是键值对,一对一对的往里存,而且要保证键的唯一性。包括Hashtable、HashMap、TreeMap。

Hashtable的底层数据结构是哈希表,不可以存储null键和null值,线程同步,效率低。JDK1.0.

HashMap的底层数据结构是哈希表,可以存储null键和null值,线程不同步,将Hashtable替代,JDK1.2效率高。保证键的唯一性的 依据是hashCode和equals方法。

TreeMap的底层数据结构是二叉树,线程不安全,能够给集合中的键排序。

 

95.什么时候使用什么集合?

答:(1)首先要看是单列还是双列,是单列的话就用Collection,双列就用Map。

(2)要是单列的话看元素是不是要求重复,元素重复的话使用List,看查询多还是增删多,查询多的话用ArrayList,增删多的话用LinkedList,不确定的话用ArrayList。不重复的话使用Set,看是否要求排序,排序的话用TreeSet,不需要排序用HashSet。不确定的话用HashSet。

(3)要是双列的话,看是否要求排序,要求排序用TreeMap,不要求排序用HashMap,不确定的话用HashMap。

 

96.Collection(单列)和(Map)双列的区别?

答:Collection是单列集合,Map是双列集合。Map的键是唯一的,Collection体系中的Set集合中的元素是唯一的。Map集合的数据结构针对键有效,Collection的底层数据结构针对元素有效。

 

100.遍历集合的方式有哪些?

答:遍历List集合的方式有普通for、增强for、迭代器Iterator、列表迭代器ListIterator。

遍历Set集合的方式有增强for、迭代器Iterator。

遍历map集合的方式有keySet(),entrySet()。然后通过增强for、迭代器Iterator遍历。

 

101.用迭代器和增强for遍历集合,能否用集合的方法操作集合?

答:不能,会出现并发修改异常,ConcurrentModificationException。

并发修改异常就是在用普通迭代器的时候用集合的方法增加、删除元素。可以用列表迭代器。

 

102.泛型是什么?有什么好处?

答:简单的说一种标签,不确定的类型,用户使用的时候确定类型,是JDK1.5出现的新特性,用于解决安全问题,是一种类型安全机制。

好处:(1)将运行时期会可能出现的异常转移到编译期(2)提高了安全性。(3)避免了强制类型转换的麻烦。

 

103、上限和下限?

? super E:  E、E的父类,固定下边界。

? extends E: E、E的子类  固定的上边界。

 

104.字典排序,自然排序和比较器排序是什么?

答:字典排序按照字典上的顺序排序。 

自然排序是对强制对实现Comparable接口的类进行排序,实现Comparable接口,重写compareTo()方法,根据返回值进行排序。

比较器排序是实现Comparator方法,重写compare()方法,根据返回值进行排序。

105.TreeSet的两种排序方式有什么区别?

答:TreeSet的构造方法中不传参数,会按照类的Comparable排序,没有的话就会报错。TreeSet传入比较器,会按照比较器排序。

 

106.Map有哪些取出元素的方式?原理是什么?

答:keySet():将Map集合中的键取出放在Set集合,然后通过遍历Set集合取出里面的键,再用map的get(key)方法取出对应的值。

entrySet()将Map集合中的键值对关系取出放在Set集合,然后通过遍历Set集合取出里面的键值对关系,然后通过entry的getKey()和getValue()方法取出元素。

 

107.Collections 和 collection的区别?

答:Collections是用来操作集合的工具类,它是个类;collection是单列集合的顶层接口。

 

108:

*栈和队列:

队列结构:先进先出的规则

栈结构:先进后出规则

*链表和数组的区别:

数组:一块连续的存储区域

链表结构:每个元素指向下一个元素

 

四、异常

109.异常体系概述?

答:Throwable(踹奥包)类

|--Error(易肉):无法通过处理解决的错误

|--Exception(易可赛博深):

|--编译时异常:就是在编译程序生成.class文件时产生的异常,这种异常必须处理,要么抛出,要么捕获,否则编译无法通过

|--运行时异常:编译时期不会出现,只有在运行时才产生,这种异常,可以处理,也可以不处理,可以声明,也可以不声明 

 

110.异常处理有哪些方式?

答(1)捕获处理try{}catch{}    try{}catch{}finally{}    try{}finally{}

(2)声明抛出

 

111.运行异常和编译异常的区别?

答:所有的RumtimeException类及其子类的实例是运行异常,其他异常时编译异常。编译异常必须显式处理,否则会编译失败。运行时异常可以不处理,可以通过编译。

 

112.throw和throws的区别?

答:throws是在方法声明后面,用来声明异常,后面跟的异常类名;可以跟多个异常类名,用逗号隔开;表示抛出异常,需要由调用者处理。

Throw定义在方法体内,跟的异常对象名;只能跟一个异常对象。

 

113.子父类间异常的注意事项?

答:(1)子类继承父类时,父类方法抛出了异常,子类重写该方法时只能抛出相同的异常或者该异常的子类。

(2)如果父类抛出了多个异常,子类在重写方法时只能抛出相同的异常或者他的子集,不能抛出父类没有的异常。

(3)如果父类没有抛出异常,子类重写该方法时不能抛出异常。如果子类出现了异常,只能进行try处理,不能抛出。

 

 

114.异常处理的注意事项:

(1) 子类不能出现父类没有的异常

(2) 如果父类没有抛出异常,子类重写该方法时不能抛出异常。如果子类出现了异常,只能进行try处理,不能抛出。

(3) 功能内部如果出现异常,如果内部可以处理,就用try。如果功能内部处理不了,就必须声明出来,让调用者处理。

 

116.JVM是如何处理异常的?

先自己处理,处理不了交给调用者处理。

 

五、IO

117.递归的注意事项?

答:1.递归必须要有出口,否则是死递归,造成栈内存溢出。2.递归不能多层次调用,否则会造成栈内存溢出。3.构造方法不能递归调用。

 

117.路径的分类?

答:分为相对路径和绝对路径。绝对路径是相对盘符而言的;相对路径相对的是工程。

 

118.集合的顶层是什么?IO的顶层是什么?

答:集合的顶层是接口。IO的顶层的是抽象类。

 

119.什么IO流?

用来在硬盘和内存直接交换数据的。

 

120:简述IO的分类?

答:按照流向分输入流和输出流。

按照操作分为字节流和子字符流。

字节流能操作任意类型的文件,如果操作文本,可能会出现乱码。分为字节输出流和字节输入流。

字符流只能操作纯文本文件,分为字符输入流和字符输出流。

字节流

顶层(抽象)父类InputStream/OutputStream(字节输入流和字节输出流)

FileInputStream/FileOutputStream(文件字节输入流/文件字节输出流)

BufferedInputStream/BufferedOutputStream(带缓冲区的)

字符流

顶层(抽象)父类Writer和Reader(字符输出流/字符输入流)

FileWriter/FileReader(文件字符输出流/文件字符输入流)

BufferedWriter/BufferedReader(带缓冲区的)

121.为什么read()方法返回值是int类型?

答:为了防止中间出现11111111(-1的反码)这样的数据,后面的内容就读不到了。

 

122.字符流通往字节流的桥梁是什么?字节流通往字符的桥梁是什么?

答:字符流通往字节流的桥梁是OutputStreamWriter;字节流通往字符流的桥梁是InputstreamReader。

 

123.标准输入流和输出流是什么?

答:标准输入流的是System.in。标准输出流是System.out.

 

124.高效字符流的方法?

ReadLine()读不到\r\n跨平台

newline()针对当前操作系统换行

 

125.字节输入流read()一次读取的一个字节,返回的字节的对应的ASCII值。

 

126.字符缓冲流和字节缓冲流的缓冲区的默认大小是多少?

答:字符缓冲流缓冲区默认的大小是8192个字符,16kb。

字节缓冲流缓冲区默认的大小是8192个字节,8kb。

Writer的2kb。

 

127.close()和flush()的区别:

答:flush()方法是来刷新缓冲区的,刷新之后还可以再次写出。

Close()是用来关闭流释放资源的,如果是带缓冲区的流对象关闭流之前还会刷新缓冲区,关闭之后无法写出。

 

六、网络编程

128.什么是网络编程?

答:网络编程又叫套接字编程,Socket编程,就是用来实现网络互连的不同计算机上运行程序之间可以进行数据的交换。大白话来讲:就是用java语言来实现网络上不同计算机的通信。

 

129.网络编程的三要素?

答:IP地址、端口、协议。

IP的组成网关和主机地址。127.0.0.1回环地址   255.255.255.255广播地址

 

130.端口的范围是什么?哪个范围的端口不能用,为什么?

答:端口的范围是0——65535.   0——1024这个范围的端口不能使用,因为已经被系统占用或者作为保留端口。

 

131.TCP和UDP协议的区别?

答:TCP是面向有连接的,三次握手机制;传输的数据无大小限制;安全(可靠)协议;效率低;区分客户端和服务器。

UDP是面向无连接的,发送的数据是通过数据报包的形式,不超过64k;不安全(可靠)协议,效率高;不区分客户端和服务器。(叫发送端和接收端)

 

132.Socket通信的原理是是什么?

答:通信的两端都有独有的Socket,Socket通信就是使用TCP或者UDP协议通过IO流在两个Socket间进行通信。

 

七、多线程

133.进程和线程?

进程是一个正在执行中的程序,每一个程序都至少有一个执行顺序,该顺序是一个路径,或者叫一个控制单元。

线程是进程中的一个独立的控制单元,线程在控制着进程的执行,是进程的执行路径。

进程:正在运行的程序

线程:进程的执行单元,执行路径。

多线程:进程有多条执行路径,每个执行路径就是线程。

 

134.多线程并发和多线程并行是什么呢?

答:两个或者多个任务发送请求时,CPU只能执行一个,就会安排这些任务交替执行,由于CPU做着高速的切换,间隔的时间比较短,我们看起来像同时执行的,这就是多线程并发。

并行是两个或多个任务同时执行,前提是多核CPU。

135.多线程的执行原理?

答: CPU在做着高速的切换。

 

136. 线程的执行具有随机性和延迟性。

延迟加载模式

单利设计模式的懒汉式

137.线程的默认命名规则?

答:Thread-编号,编号是从0开始的。

 

138.线程的优先级的范围是多少?默认的优先级是?

答:线程的优先级范围是1——10。默认的优先级是5.

 

139.Java程序的启动原理?

答:JVM启动一个主线程,再由主线程调用某个类的main方法。

 

140.Java程序是多线程的吗?

答:是的,至少开启了一个主线程和负责垃圾回收的线程。

 

141.线程的优先级越高,代表这个线程一定是第一个执行的吗?

答:不是的,线程的优先级越高代表着在一定程度上让该线程获取更多的执行机会。

 

142.线程的两种实现 方式的区别?

答:继承Thread类:好处是:因为是继承,代码简单,能够直接使用Thread类的方法。缺点是:扩展性比较差,因为继承了Thread类,不能再继承其他的类。

实现Runnable接口:好处是扩展性比较强。缺点时:代码比较冗余,因为不是继承Thread类,无法直接使用thread中的方法。

 

143.同步代码块和同步方法的锁是谁?

答;同步代码块的锁可以是任意类型的对象;非静态同步方法的锁是this;静态方法的锁是该类的字节码文件。

 

144.实现Runnable和Callable的区别?

答:实现Runnable接口的run方法没有返回值,不能抛异常;而实现Callable接口的call方法可以抛异常,有返回值。

Runnable接口的实现类对象既可以作为参数传递给Thread的构造方法,也可以用线程池submit的参数;Callable接口的实现类对象只适应于线程池。

 

145.线程的生命周期(线程的五种状态)是什么?

答:新建、就绪、运行(运行的时候可能阻塞)、死亡。

新建:创建一个线程对象

就绪:调用start()进入就绪状态 有执行的资格但是没有执行权

运行:被执行的线程就相当于抢到了执行权,有执行资格有执行权 

阻塞:如果有sleep()或者wait()方法就会阻塞,没有执行资格也没有执行权

死亡:程序执行完就进入了死亡状态

运行:比如三条线程在抢夺资源的时候,一条线程的运行状态被抢去了,就会进入运行状态

阻塞:如果sleep时间到或者wait方法被唤醒就又回到就绪状态

线程的六种状态:新建、就绪、运行(运行的时候可能阻塞或者等待)、死亡。

 

146.sleep和wait的区别?

答:(1)sleep是让线程休眠,必须给定休眠的时间,时间到了后自动醒来,不需要唤醒,休眠时不放弃cpu的执行权

(2)wait是让线程等待,可以给时间,也可以不等时间,但是必须要唤醒才能醒来(用notify或者notifyAll),等待时放弃cpu的执行权

(3)sleep方法是Thread类中定义的方法,wait是Object中定义的方法

(4)wait用在同步代码块或者同步方法中,sleep可以在任何地方使用

(5)sleep必须捕获异常,wait不用捕获异常

 

 

 

147.什么时候会出现安全性?

多线程,并发,操作同一数据。

 

148.为什么wait()和notify()定义在Object中?

答:因为锁对象可以是任意类型的对象。

 

149.什么情况下需要同步?

当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.

如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.

(新增)多线程两种方式的查看源码区别?

继承Thread类 子类重写父类的run方法,调用start时,找的是子类的run方法

实现Runnable接口 构造函数传入Runnable的引用,成员变量记住了它,start调用run方法时内部判断该引用是否为空,不为空编译看的是Runnable的run,运行时执行的是子类的run方法

(新增)同步代码块是什么?

同步代码块就是使用synchronized关键字加上锁对象定义的一段代码。多个同步代码块如果使用相同锁对象他们就是同步的

(新增)什么时候出现线程安全问题?

多线程并发操作同一数据时出现线程安全问题

(新增)什么是死锁?

多线程同步时如果同步代码块嵌套,使用相同锁,就有可能出现死锁

八.反射

150.什么时候加载类(类的加载时机)?

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

类的加载时机:

(1)创建类的实例

(2)访问类的静态变量,或者为静态变量赋值

(3)调用类的静态方法

(4)使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

(5)初始化某个类的子类

(6)直接使用java.exe命令来运行某个主类

151.类加载器的分类?

(1)Bootstrap ClassLoader 根类加载器

* 也被称为引导类加载器,负责Java核心类的加载

* 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中

(2)Extension ClassLoader 扩展类加载器

* 负责JRE的扩展目录中jar包的加载。

* 在JDK中JRE的lib目录下ext目录

(3)Sysetm ClassLoader 系统类加载器

* 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径

 

 

152.获取字节码对象的三种方式?

(1)Object类的getClass()方法,判断两个对象是否是同一个字节码文件

(2)静态属性class,锁对象

(3)Class类中静态方法forName(),读取配置文件

 

 

153.反射中所用到的方法?

(1)构造方法

|--获取:getConstructor()和getConstructors()

|--执行:newInstance()

(2)普通的成员方法

|--获取:getMethod()和getMethods()

|--执行:invoke()

(3)成员变量

|--非私有:getField()和getFields()

|--私有:getDeclaredField

|--访问私有的成员变量先执行:setAccessible(true),然后执行set方法

 

 

154.泛型的擦除?

泛型只在编译期有效,在运行期会被擦除掉,生成.class文件之后泛型就没有了

155.暴力反射?

可以获取字节码对象中的所有属性和方法,包括私有.对于私有的属性和方法要使用暴力反射,即使用getDeclaredXxx()方法获取,

然后再设置可以访问,即调用setAccessible(true)

 

156.谈谈你对动态代理的理解?

* 代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象。

* 举例:春节回家买票让人代买

* 动态代理:在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

157.设计模式:

1,装饰

2,单例

3,简单工厂

4,工厂方法

5,适配器

6,模版

 

158.JDK5新特性

1,自动拆装箱

2,泛型

3,可变参数

4,静态导入

5,增强for循环

6,互斥锁

7,枚举

 

159.JDK7新特性

* A:二进制字面量

* B:数字字面量可以出现下划线

* C:switch 语句可以用字符串

* D:泛型简化,菱形泛型

* E:异常的多个catch合并,每个异常用或|

* F:try-with-resources 语句

 

160.JDK1.8的新特性?

(1)接口中可以定义有方法体的方法,如果是非静态,必须用default修饰 

(2)如果是静态的就不用了

 

0 0
原创粉丝点击