发表时间:2022-03-24来源:网络
为了能让您更加方便的阅读 本文所有的面试题目均已整理至下面的小程序《面试手册》 可以通过微信扫描(或长按)下图的二维码享受更好的阅读体验!

[toc]
.java
在java语言中能够我们自己起名的都叫标识符
标识符是大小写字母、数字字符、$和_组成,不能以数字开头,也不能是java关键字,并且区分大小写
path是系统用来指定可指定文件的完整路径。Path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径。
classpath是指定你在程序中所使用的类(.class)文件所在的位置。
字节码文件扩展名是 .class
d: 回车 盘符切换 dir (directory) 列出当前目录下的文件以及文件夹 cd (change directory) 改变指定目录(进入指定目录) cd.. 退回到上一层目录 cd \ 退回到跟目录 md (make directory) 创建目录 rd (remove directory) 删除目录 del (delete) 删除文件,删除一堆后缀名一样的文件*.txt cls (clear screen) 清屏 exit 退出dos命令行
Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(class file)。
JDK Java Development Kit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具(javac/java/javap等) JRE Java Runtime Environment(java运行时环境)。也就是我们说的JAVA平台。所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具(编译器、调试器和其他工具)。 JVM Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
单行注释 注释单行代码或为单行代码添加描述的时候使用 多行注释 注释多行代码或为代码添加多行描述的时候使用 文档注释 生产java帮助文档的时候使用,开发中常用来描述类、描述方法
基本数据类型byte short int long float double char boolean 引用数据类型数组 类 接口
强制类型转换 容量大的类型向容量小的类型转换时使用 隐式类型转换 容器小的类型向容量大的类型转换时使用
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。 补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
== 比较运算符,用来比较操作符两边的变量的值是否相等。 = 赋值运算符,把操作符右边的值,赋值给左边的变量
三元运算符的格式是: 条件表达式 ? 表达式1 : 表达式2
三元运算符的执行流程: 首先计算条件表达式的值看其返回结果是true还是false,如果是true就执行表达式1,如果是false就执行表达式2
第一步导包 格式: import java.util.Scanner ;位置: 在class上边 第二步创建Scanner对象 格式: Scanner sc = new Scanner(http://System.in) ; 第三步获取键盘录入数据 格式: int x = sc.nextInt() ;
for循环语句格式 for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; }执行流程:执行初始化语句 执行判断条件语句,看其结果是true还是false,如果是false,循环结束;如果是true,继续执行。 执行循环体语句 执行控制条件语句 回到b继续 while循环语句格式 while(判断条件语句) { 循环体语句; }执行流程:执行判断条件语句,看其结果是true还是false 如果是false,循环结束。 如果是true,继续执行。 执行循环体语句 回到a继续 do…while循环语句格式 do { 循环体语句; }while((判断条件语句);执行流程:执行循环体语句 执行判断条件语句,看其结果是true还是false,如果是false,循环结束;如果是true,继续执行。 回到a继续 三种循环语句的区别do…while循环至少会执行一次循环体 for循环和while循环只有在条件成立的时候才会去执行循环体
注意:写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环
格式 修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2 ….){ 方法体 ; return 返回值 ; } 注意事项 A. 方法不调用不执行 B. 方法与方法是平级关系,不能嵌套定义 C. 方法定义的时候参数之间用逗号隔开 D. 方法调用的时候不用在传递数据类型 E. 如果方法有明确的返回值,一定要有return带回一个值
类中的成员需要私有的时候使用private关键字 特点: 是一个权限修饰符。 可以修饰成员(成员变量和成员方法) 被private修饰的成员只在本类中才能访问
this用来解决成员变量与局部变量重名问题 this关键字代表的是本类对象引用;谁调用我,this就代表谁.
final最终的意思。
可修饰
类 成员变量 成员方法特点
final修饰类,此类不能被继承。 final修饰变量,变量就成了常量,只能被赋值一次 final修饰方法,方法不能被重写
形式参数是基本类型要的是一个基本类型的变量或者具体的常量值
类名时 要的是一个该类的对象 抽象类名时 要的是一个继承自该类的一个子类对象 接口时 要的是一个实现了该接口的子类对象
返回值是基本数据类型的时候返回的是一个具体的值
类名时 本质上返回的是一个该类对应的子类对象 抽象类名时 返回的应该是一个继承自该类的子类对象 接口名的时 返回的是一个实现了该接口的子类对象
package,包的意思,其实就是文件夹,它可以对类进行分类管理
在不同包下的类之间相互访问的时候,发现,每次使用不同包下的类的时候,都需要加包的全路径。比较麻烦,这个时候,java就提供了( import )导包的功能。 使用import可以将包中的类导入进来,以后使用类的时候,不需导包,直接使用,简化了书写。
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同;
代码示例:
String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true
代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。
首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:
class Cat { public Cat(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } Cat c1 = new Cat("mbb"); Cat c2 = new Cat("mbb"); System.out.println(c1.equals(c2)); // false
输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:
public boolean equals(Object obj) { return (this == obj); }
原来 equals 本质上就是 ==。
那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:
String s1 = new String("mbb"); String s2 = new String("mbb"); System.out.println(s1.equals(s2)); // true
同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。
总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
泛型是什么? 泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型,可以把类型当做参数一样传递过来,在传递过来之前我不明确,但是在使用的时候就就明确了。 泛型的好处提高了程序的安全性 将运行期遇到的问题转移到了编译期 省去了类型强转的麻烦 泛型的常见应用泛型类 泛型方法 泛型接口
泛型方法,指把泛型定义在方法上,使用泛型类型来替代原始类型
public static T[] sort(T[] t){ Arrays.sort(t); return t; }
泛型类,指把泛型定义在类上,使用泛型类型来替代原始类型
class GenericClass { private T t; public void setT(T t) { this.t = t; } public T getT() { return t; } }
FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名,并返回合格的文件。
所谓递归,是指程序调用自身。 注意,递归不会无休止地调用下去,它必然有一个出口,当满足条件时程序也就结束了,不然的话,那就是死循环了。
不对,两个对象的 hashCode() 相同,equals() 不一定 true。
代码示例:
String str1 = "通话"; String str2 = "重地"; System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode())); System. out. println(str1. equals(str2));
执行的结果:
str1:1179395 | str2:1179395 false
代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。
包 全部小写 单层包 小写,举例:itcast,com 多层包 小写,并用 . 隔开,举例:cn.itcast, com.baidu 类或者接口:一个单词 首字母大写,举例:Student,Demo 多个单词 每个单词首字母大写,举例:HelloWorld,StudentName 方法或者变量:一个单词 首字母小写,举例:name,main 多个单词 从第二个单词开始,每个单词首字母大写,举例:studentAge,showStudentNames() 常量 全部大写一个单词 大写,举例:PI 多个单词 大写,并用 _ 隔开,举例:STUDENT_MAX_AGE
变量,在程序运行时,值可以被修改的量。
数据类型 变量名 = 变量值
在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上
在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存
生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不同 成员变量:有默认初始化值 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
所属不同 静态变量属于类,所以也称为为类变量 成员变量属于对象,所以也称为实例变量(对象变量)
内存中位置不同 静态变量存储于方法区的静态区 成员变量存储于堆内存
内存出现时间不同 静态变量随着类的加载而加载,随着类的消失而消失 成员变量随着对象的创建而存在,随着对象的消失而消失
调用不同 静态变量可以通过类名调用,也可以通过对象调用 成员变量只能通过对象名调用
5个对象a b c ab abc
因为字符串的特点是一旦被创建就不能被改变,所有在使用常量进行相加的时候,都是在创建新的字符串对象,最后在把字符串"abc"这个常量值赋值给引用变量s
通过String类的构造方法 通过StringBuffer类中的toString()方法 通过StringBuffer类中的substring()方法 (注:不常用) String 转换到 StringBuffer的方式: 通过StringBuffer类的构造方法 通过StringBuffer类的append()、insert()方法
String – Integer – int通过Integer类的intValue()方法 通过Integer类的parseInt(String s)方法 Int 转换到 String的方式: Int – Integer – String Integer的toSting() 通过String类的valueOf()方法 通过Integer类的toSting(int i)方法 通过与字符串""相连接
通过包装类的构造方法 通过包装类的静态方法valueOf() 包装类 转换到 基本数据类型的方式: 通过包装类的方法xxxValue()
String类表示内容不可以改变的字符串 StringBuffer类表示内容可以被修改的字符串
StringBilder 是线程不安全的,运行效率高
如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。
StringBuffer 是线程安全的,运行要低于StringBilder
如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则达表示通常被用来检索、替换那些符合某个模式的文本。
Date 转 long 通过Date类的getTime()方法 long 转 Date 通过Date类的构造方法
Date 转 String
Date类的toString()方法 DateFormat类的format()方法String 转 Date
Date类的构造方法
已过时,被DateFormat类的parse(String s)方法取代
DateFormat类的parse()方法
String 不属于基础类型 基础类型有 8 种:
byte boolean char short int float long double
而 String 属于对象
不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
示例代码:
// StringBuffer reverse StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("abcdefg"); System.out.println(stringBuffer.reverse()); // gfedcba // StringBuilder reverse StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("abcdefg"); System. out. println(stringBuilder.reverse()); // gfedcba
indexOf():返回指定字符的索引。 charAt():返回指定索引处的字符。 replace():字符串替换。 trim():去除字符串两端空白。 split():分割字符串,返回一个分割后的字符串数组。 getBytes():返回字符串的 byte 类型数组。 length():返回字符串长度。 toLowerCase():将字符串转成小写字母。 toUpperCase():将字符串转成大写字符。 substring():截取字符串。 equals():字符串比较。
是一组相关属性和行为的集合是一个抽象的东西,对象则是该类的一个具体的体现。
举例: 学生就是一个类,然后每一个学生都是学生的一个个具体的体现,所以每一个学生就是一个学生。
类由成员变量和成员方法组成 成员变量对应的就是事物的属性(就是事物固有的信息,比如: 人的属性有身高 , 姓名 , 年龄 , 学历…) , 成员方法对应的是行为(行为: 就是该事物可以做的事情,比如:人的行为有: 吃饭,睡觉…)
匿名对象指:没有起名字的对象 使用匿名对象: a:调用方法,仅仅只调用一次的时候 b:匿名对象可以作为实际参数传递
构造方法的作用是用于给类的成员变量赋值,完成类的初始化工作
构造方法的特点: 构造方法的名称和类名相同 构造方法没有返回值类型,连void也没有 构造方法没有具体的返回值
构造方法的注意事项:
如果一个类没有给出构造方法,系统将会提供一个默认无参的构造方法
如果我们给出类构造方法,系统将不会提供默认无参的构造方法,这个时候如果我们还想使用无参的构造方法来创建对象,那么就需要我们给出无参的构造方法 可以写空的return语句.
一个类的缺省构造方法没有参数
Student s = new Student();
将Student.class 字节码文件加载到内存 在栈内存中,开辟一个空间存储 s变量,用来记录Student对象的引用 在堆内存中,开辟一个空间存储 new Student()对象的成员信息 加载类中静态成员 执行类中静态代码块 加载对象中普通成员 执行构造代码块 执行构造方法 将new Student()的地址赋值给 s 变量
子类有所有的构造方法默认都会访问父类中空参数的构造方法。 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。 每一个构造方法的第一条语句默认都是:super() 如果父类中没有空参数的构造方法,通过下列方式解决子类通过super去显示调用父类其他的带参的构造方法 子类通过this去调用本类的其他构造方法(本类其他构造也必须首先可以访问了父类构造)
注意:super(…)或者this(…)必须出现在第一条语句上,否则,就会有父类数据的多次初始化
先执行所有的静态代码块,再执行所有的构造代码块,最后执行构造方法 静态代码块只执行一次, 构造代码块和构造方法,每创建一次对象就执行一次
抽象类的定义 使用了关键字abstract声明的类叫做“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。
抽象类的特点:
抽象类的定义格式: abstract class 类名{}
抽象方法的定义格式: public abstract 返回值类型 方法名();
抽象类中可以存在抽象方法,也可以存在非抽象方法
抽象类不能直接进行实例化,我们可以使用多态的形式进行进行间接实例化
抽象类的子类
可以是抽象类
如果子类还是抽象类,那么我们还是不能进行实例化,还需要一个子类去继承
也可以是非抽象类
子类必须重写父类的抽象方法
抽象类虽然不能进行实例化,但是抽象类中是存在构造方法,该构造方法的作用是用于子类访问父类数据时的初始化.
接口中的成员变量都是常量,存在默认的访问修饰符:
public static final
接口中的成员方法都是抽象方法,存在默认的访问修饰符:
public abstract
类与类 是继承的关系,只支持单继承,可以是多层继承。 类与接口 是实现的关系,可以是多实现 特点一个类可以继承一个类的同时,还可以实现多个接口 接口与接口是继承的关系,可以是单继承也可以是多继承
抽象类成员变量 可以是变量,也可以是常量 构造方法 有 成员方法 可以抽象,也可以非抽象 接口:成员变量 只可以常量 成员方法 只可以抽象
类与类 继承,单继承 类与接口 实现,单实现,多实现 接口与接口 继承,单继承,多继承
抽象类 被继承体现的是:“is a”的关系。 抽象类中定义的是该继承体系的共性功能。 接口 被实现体现的是:“like a”的关系。 接口中定义的是该继承体系的扩展功能。
内部类可以直接访问外部类的成员,包括私有 外部类要访问内部类的成员,必须先创建内部类对象
匿名内部类的格式 new 类名或者接口名() { 方法重写 ; } ; 本质 匿名内部类本质是一个继承了某一个类或者实现了某一个接口的子类对象
不需要,抽象类不一定非要有抽象方法。
示例代码:
abstract class Cat { public static void sayHi() { System.out.println("hi~"); } }
上面代码,抽象类并没有抽象方法但完全可以正常运行。
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类
方法重载指在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
方法重载特点: a) 与返回值类型无关,只看方法名和参数列表 b) 在调用时,虚拟机通过参数列表的不同来区分同名方法
隐藏实现细节,提供公共的访问方式; 提高了代码的复用性; 提高安全性。
继承的特点: 在java语言中类的继承只支持单继承,不支持多继承.但是可以多层继承。
继承的注意事项:
子类只能继承父类非私有的成员 子类不能继承父类的构造方法,但是可以通过super去访问父类的构造方法 不要为了某个功能去使用继承
提高了代码的维护型 提供了代码的复用性 让类与类之间产生了关系, 是多态的前提
this 代表的是本类对象的引用 , 谁调用我这个方法,这个方法里边的this就代表谁。一般的使用场景是,当局部变量隐藏了成员变量的时候,我们可以使用this去明确指定要访问的是成员变量
super 代表的是父类存储空间的一个标志(可以理解为父类对象的引用),我们可以使用super来访问父类的成员
方法重写:指子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写
需要注意的问题:
1. 父类中私有方法不能被重写 2. 子类重写父类方法时,访问权限不能更低 3. 父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此)
重载Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同),与返回值类型无关。 重写Override 发生在子父类中的一个现象, 子类中出现了和父类中一模一样的方法,与返回值有关.
一种事物在不同时刻表现出来的状态就是多态
多态的前提:
需要有继承 需要有方法重写(其实没有也是可以的,但是没有意义),不同状态的表现就是就是靠方法重写体现的 需要有父类的引用指向子类对象:Fu f = new 子类()
访问成员变量 编译看左边 , 运行看左边
因为成员变量其实就是属性,属性就是只该事物的描述信息,所以使用父类在访问的时候,访问的就是父类的成员变量
成员方法 编译看左边,运行看右边
这个是多态的本质,存在动态绑定的机制
静态成员方法 编译看左边,运行看左边
所以说静态算不上重写
提供了代码的维护性(通过继承保证) 提供了代码的扩展性(通过多态保证),这个特点也体现了多态的最常见的应用,作为参数传递.
多态的弊端,不能访问子类中特有的功能 如果我们还想使用子类中特有的功能,我们需要使用向下转型
向下转型: 就是将父类的引用强制转换成子类的引用,在向下转型的过程中需要注意一个异常: ClassCastException
2种。动态创建和静态创建。
可以存储不同类型的元素(通常使用存储一种类型元素) 集合的长度可以改变
必须存储相同一类型的元素 数组的长度固定
Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。
Iterator 使用代码如下:
List list = new ArrayList(); Iterator it = list.iterator(); while(it.hasNext()){ String obj = it.next(); System.out.println(obj); }
Iterator的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
线性表 链表 栈 队列 树 哈希表
底层数组结构
特点线程不同步 效率高 元素查找快 增删慢;
底层数组结构
特点线程同步 安全 元素查找快 增删慢
底层链表结构
特点线程不同步 效率高 元素增删快 查找慢
Vector
查找多 ArrayList 增删多 LinkedList
ConcurrentModificationException
在迭代器迭代的过程中,集合中的元素个数发生了改变,此时导致并发修改异常。
通过列表迭代器自带的方法完成元素增删操作。 通过for循环遍历集合,使用集合中的方法完成元素增删操作。
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14