副标题#e#
不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题。
- B/S(Browser/Server),浏览器/服务器程序
-
C/S(Client/Server),客户端/服务端,桌面应用程序
C/S(Client/Server),客户端/服务端,桌面应用程序
HTTP:超文本传输协议 FTP:文件传输协议 SMPT:简单邮件协议 TELNET:远程终端协议 POP3:邮件读取协议
JVM:java虚拟机,运用硬件或软件手段实现的虚拟的计算机,Java虚拟机包括:寄存器,堆栈,处理器
大多情况下是不需要的。Java提供了一个系统级的线程来跟踪内存分配,不再使用的内存区将会自动回收
JDK:java development kit:java开发工具包,是开发人员所需要安装的环境
JRE:java runtime environment:java运行环境,java程序运行所需要安装的环境
计算机保存,组织数据的方式
面向对象编程
世间万物都可以看成一个对象。每个物体包括动态的行为和静态的属性,这些就构成了一个对象。
类是对象的抽象,对象是类的具体,类是对象的模板,对象是类的实例
显示转换就是类型强转,把一个大类型的数据强制赋值给小类型的数据;隐式转换就是大范围的变量能够接受小范围的数据;隐式转换和显式转换其实就是自动类型转换和强制类型转换。
Char在java中也是比较特殊的类型,它的int值从1开始,一共有2的16次方个数据;Char 属性、方法、内部类、构造方法、代码块。 不好,因为计算机在浮点型数据运算的时候,会有误差,尽量在布尔表达式中不使用浮点型数据(if,while,switch中判断条件不使用浮点型) 使用Bigdecimal类进行浮点型数据的运算 静态实例化:创建数组的时候已经指定数组中的元素, 动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值 Object 有指针,但是隐藏了,开发人员无法直接操作指针,由jvm来操作指针 理论上说,java都是引用传递,对于基本数据类型,传递是值的副本,而不是值本身。对于对象类型,传递是对象的引用,当在一个方法操作操作参数的时候,其实操作的是引用所指向的对象。 改变了,因为传递是对象的引用,操作的是引用所指向的对象 不能,数组一旦实例化,它的长度就是固定的 创建一个新数组,从后到前循环遍历每个元素,将取出的元素依次顺序放入新数组中 #p#副标题#e##p#分页标题#e# 形参:全称为“形式参数”,是在定义方法名和方法体的时候使用的参数,用于接收调用该方法时传入的实际值;实参:全称为“实际参数”,是在调用方法时传递给该方法的实际值。 不能构造方法当成普通方法调用,只有在创建对象的时候它才会被系统调用 可以重写,也可以重载 方法的重载就是在同一个类中允许同时存在一个以上的同名方法,只要它们的参数个数或者类型不同即可。在这种情况下,该方法就叫被重载了,这个过程称为方法的重载(override) 静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法; 普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。 如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法。 如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外同类可以通过该属性调用普通内部类的方法或者访问普通内部类的属性 如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可。 Static可以修饰内部类、方法、变量、代码块 Static修饰的类是静态内部类 Static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象的,静态方法也不能被重写,可以直接使用类名来调用。在static方法中不能使用this或者super关键字。 Static修饰变量是静态变量或者叫类变量,静态变量被所有实例所共享,不会依赖于对象。静态变量在内存中只有一份拷贝,在JVM加载类的时候,只为静态分配一次内存。 Static修饰的代码块叫静态代码块,通常用来做程序优化的。静态代码块中的代码在整个类加载的时候只会执行一次。静态代码块可以有多个,如果有多个,按照先后顺序依次执行。 String,StringBuffer,StringBuilder StringBuffer与StringBuilder都继承了AbstractStringBulder类,而AbtractStringBuilder又实现了CharSequence接口,两个类都是用来进行字符串操作的。 在做字符串拼接修改删除替换时,效率比string更高。 StringBuffer是线程安全的,Stringbuilder是非线程安全的。所以Stringbuilder比stringbuffer效率更高,StringBuffer的方法大多都加了synchronized关键字 一共有两个引用,三个对象。因为”aa”与”bb”都是常量,常量的值不能改变,当执行字符串拼接时候,会创建一个新的常量是” aabbb”,有将其存到常量池中。 不能。Equlas大多用来做字符串比较,要判断基本数据类型或者对象类型,需要使用== ==可以判断基本数据类型值是否相等,也可以判断两个对象指向的内存地址是否相同,也就是说判断两个对象是否是同一个对象,Equlas通常用来做字符串比较。 Stringbuilder或者stringbuffer的reverse方法 封装、继承、多态 Java中既有单继承,又有多继承。对于java类来说只能有一个父类,对于接口来说可以同时继承多个接口 重载和重写都是java多态的表现。 重载叫override,在同一个类中多态的表现。当一个类中出现了多个相同名称的方法,但参数个数和参数类型不同,方法重载与返回值无关 #p#副标题#e##p#分页标题#e# 重写叫overwrite,是字符类中多态的表现。当子类出现与父类相同的方法,那么这就是方法重写。方法重写时,子类的返回值必须与父类的一致。如果父类方法抛出一个异常,子类重写的方法抛出的异常类型不能小于父类抛出的异常类型。 可以重载,必须重写 必须重写 会执行。当创建一个子类对象,调用子类构造方法的时候,子类构造方法会默认调用父类的构造方法。 是java多态一种特殊的表现形式。创建父类引用,让该引用指向一个子类的对象 子类重写了父类方法和属性,访问的是父类的属性,调用的是子类的方法 Abstract 不是必须。抽象类可以没有抽象方法。 包含抽象方法的类一定是抽象类 不可以。定义抽象类就是让其他继承的,而final修饰类表示该类不能被继承,与抽象类的理念违背了 接口就是某个事物对外提供的一些功能的声明,是一种特殊的java类 接口弥补了java单继承的缺点 异常捕捉:try…catch…finally,异常抛出:throws。 继承一个异常类,通常是RumtimeException或者Exception 会执行,如果有finally,在finally之后被执行,如果没有finally,在catch之后被执行 Try块必须存在,catch和finally可以不存在,但不能同时不存在 Error和Exception都是java错误处理机制的一部分,都继承了Throwable类。 Exception表示的异常,异常可以通过程序来捕捉,或者优化程序来避免。 Error表示的是系统错误,不能通过程序来进行错误处理。 有,log4j是用来日志记录的,记录一些关键敏感的信息,通常会将日志记录到本地文件或者数据库中。记录在本地文件中,会有频繁的io操作,会耗费一些系统资源。记录在数据库中,会频繁地操作数据库表,对系统性能也有一定的影响。但是为了程序安全以及数据的恢复或者bug的跟踪,这点资源消耗是可以承受的。 由低到高:debug、info、wran、error Java反射 通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低 Coillection、Map。 List:线性表、Set:无序集合。 顺序存储、可以有重复值。 #p#副标题#e##p#分页标题#e# 无须存储、不能有重复值。 Array与ArrayList都是用来存储数据的集合。ArrayList底层是使用数组实现的,但是arrayList对数组进行了封装和功能扩展,拥有许多原生数组没有的一些功能。我们可以理解成ArrayList是Array的一个升级版。 使用PreparedStatement类,而不是使用Statement类 使用CallableStatement 数据库连接是非常消耗资源的,影响到程序的性能指标。连接池是用来分配、管理、释放数据库连接的,可以使应用程序重复使用同一个数据库连接,而不是每次都创建一个新的数据库连接。通过释放空闲时间较长的数据库连接避免数据库因为创建太多的连接而造成的连接遗漏问题,提高了程序性能。 Dbcp,c3p0等,用的最多还是c3p0,因为c3p0比dbcp更加稳定,安全;通过配置文件的形式来维护数据库信息,而不是通过硬编码。当连接的数据库信息发生改变时,不需要再更改程序代码就实现了数据库信息的更新。 按功能来分 按类型来分 抽象类: 接口: 进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位 #p#副标题#e##p#分页标题#e# 进程和线程的关系: 线程与进程的区别: &是位运算符。&&是布尔逻辑运算符,在进行逻辑判断时用&处理的前面为false后面的内容仍需处理,用&&处理的前面为false不再处理后面的内容。 不会,在下一个垃圾回收周期中,这个对象将是可被回收的。 吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。