一.java基础
1.面向对象的特点
1.继承:让某个对象拥有其他对象的属性,其实就是让子类拥有父类的行为和特征
2.封装:隐藏对象的属性和实现细节,只对外暴露方法名,通过方法名进行访问给对象
3.多态:对于同一个行为,不同的子类有不同的表现形式。
多态的三要素:继承重写,父类引用指向子类对象
2.jdk和jre的区别
区别的详情:https://www.php.cn/java/guide/449867.html
1.jre(java runtime environment) java文件的运行环境,实际就是java运行环境的集合包括:jvm java的核心类库,支持文件等等,
2.jdk:java的开发工具包,包括开发环境(编译器javac工具包将java文件编译成class文件)和运行环境(jvm去解析class文件,并运行)
3.如何编译和运行java文件
1.安装jdk环境
2.在命令窗口,输入javac random.java
(random为文件名)让编译器javac变异成class文件(这个时候会java文件所在的文件夹中生成一个class文件)
3.在命令窗口,输入java random
即可运行命令
4.java中常用的关键字有哪些(可做补充)
1.访问修饰符:public private protect default
2.非访问修饰符:synchronized final static abstract
5.访问修饰符的作用范围
注意,protected不能修饰类
6.java标识符的命名规则
1.标识符由字母(包括大小写),数字,下划线和美元符号($)组成
2.标识符不能以数字开头
3.标识符不能以关键字命名
4.要区分大小写
7.java方法,类和常量命名规范
类名:驼峰命名法 类的首字母大写,后面单词的首字母也大写
常量:全部大写,多个单词之间使用下划线连接
方法名:第一个单词首字母小写,后面的单词首字母大写
8.常量和变量的区别
1.在命名规则上,常量大写,变量小写
2.常量只能赋值一次,而变量可以赋值多次
3.在程序运行中,常量是不变的,而变量是变化的
9.如何定义一个常量以及常量的类型
1.如何定义:使用final修饰
2.类型:
10.二进制,八进制,十六进制,十进制之间的转化:详情:详情
11.equals和==的区别
1.equals:基本类型;值是否相等
引用类型;实际上比较的还是两个引用是否指向同一个对象,String 和Integer重写了equals方法,所以最终比较的还是 两个值是否相等
2.== :基本类型;值是否相等
引用类型:引用是否指向同一个对象
12.this和super的区别
1.this代表对象本身:可以访问对象本身的构造方法,成员变量,成员方法
2.super代表该对象的父类,可以访问父类的构造方法,成员变量,成员方法
13.关于数据和对象之间的转化
14.关于数据之间的运算细节
1.short i=1; i+=1有错吗?
所有小于或等于int最大值的整形都默认为int类型,int转化为short,是高精度想低精度转型,需要强转
2.float同理:3.0.2+0.3==0.5?:
不等于,因为浮点运算会存在精度丢失等于0.5000…
4.i++和++i的区别:i++是先赋值后加,++i是先加后赋值
15.while和do while的区别
while先做判断在决定是否执行循环体
dowhile 先执行一次循环体,在做判断
16如何跳处java中的循环
1.break:结束循环体
break跳处外层循环
2.continue:结束本次循环,开始下一次循环
3.return:直接结束该方法体,不管有多少层循环
17.&和&&,||和|的区别
&&:只要第一个条件不成立,就不会在去判断第二个
&:两个条件都必须判断
||和|同理
18运算符的详情:详情
19.数组中有没有length方法?String呢?
20.怎么理解值传递和引用传递(以及形参实参的区别):详情
21.final,finally,finalize
22.变量的分类和区别
22.java的单继承和实现多个接口
原因:不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。
23.重载和重写的区别
重载:在同一个类中,方法名一样,参数列表必须不一样,返回值类型可以不一样,
重写:子类和父类的关系,方法名,参数列表必须一样,返回值类型可以不一样,但是必须是父类返回值的派生类,修饰权限必须是大于被重写的方法
24.构造器、main、私有方法、静态方法能被重载和重写吗?
1.构造器
不能重写,因为子类和父类的类名不一样,而构造器和类名一样,所以构造器不一样
能重载2.main能重载,不能重写
3.私有方法:不能重写,应为prvaite默认为fianl是不能被继承的
但是能够被重载4.静态方法不能重写,是可以重载的
25.静态方法可以被继承吗?
静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。
通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法不在存在多态的性质。
26.java异常有哪些分类以及编译和运行时的区别)
1.分类:throwable是Exception 和 Error 的顶级父类
error是指程序不能够处理的异常
Exception是程序可以处理的异常
27.java常见的异常
28.常见的运行时异常和编译时异常
29.避免空指针的方法
1.在使用equals是常量放在前面
2.在初始化对象的时候,给他一个默认值
3.在返回一个集合的时候,使用三元运算符进行判断,如果为空,返回一个新的list
4.使用断言判断
30.throw和throws的区别
疑问:throw后还会抛出异常吗
动力节点高频面试题:详情
31.try-catch-finally中那部分可以省略
都可以省略,但是不能同时省略
32.java可以一次catch多个异常吗?
33.int和Integer有什么区别:延伸
四点
34.自动拆箱和装箱
35.如何理解java中的强制类型转化
36.如何理解java中的多态机制
37.如何获取用户的输入
38.Switch能否用在long上
String类型好像可以支持
39.String常用的方法
40.String的底层是如何实现的
41.String是可变的吗?
1.不可变,因为就在源码中声明了一个final类型的字符数组
42.String可以别继承吗?
String类是被final修饰的,所以不能被继承‘
43.String真的不可变吗?
String字符串是不可变的
但是String的应用是可以指向其他字符串的
44.字符串是如何进行反转的
45.字符串如何时限编码转换
46.String有没有长度限制?是多少?
String 的长度是有限制的。
编译期的限制:字符串的UTF8编码值的字节数不能超过65535,字符串的长度不能超过65534;
运行时限制:字符串的长度不能超过2^31-1,占用的内存数不能超过虚拟机能够提供的最大值。
47.String和byte[]之间如何转化?
48.字符串分割有哪些方式
1.Tonkenizer
2.split
3.subString
49.字符串拼接+ 和concat的区别:详情
50.String,StringBuffer和StringBuilder的区别:详情
51.StringBuilder。StringBuffer默认容量大小?
*******十道关于main方法的面试题 :详情
52.java中的main方法有什么用?
1.main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,
2.必须是public static void 修饰的,接收字符串数组
53.main方法能同步吗?
main方法可以在Java中同步,synchronized修饰符允许用于main方法的声明中,这样就可以在Java中同步main方法了。
54.main方法为什么是静态的?
我的理解:
因为如果是非静态的 ,这样就可以重载,到时候就不知道调用那个了
55.怎么向main方法传递参数
56.不用main方法如何运行一个类?
不行,没有main方法不能运行一个类
57.java所有类的祖先类
Object
58.普通类和抽象类有什么区别?
59.静态内部类和普通内部类有什么区别?:详情
60.静态方法可以直接调用非静态方法吗?
静态方法可以直接调用同类中的静态成员:,但是不能直接调用非静态成员,如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
非静态可以直接调用静态:在普通成员方法中,可以直接访问同类的静态变量和非静态变量。
61.内部内可以访问其外部类的成员吗?
内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方法。
62.接口和抽象类有什么区别?详情
63.接口是否 可以继承接口
可以继承,并且可以多继承
64.接口的默认方法和静态方法是什么?
65.抽象类能否继承其他类
66.抽象类是否可以实现其他的接口?
67.如何判断一个对象是某类。接口的实例?
使用instancof 判断
68.Java如何生成随机数
第一种方法
第二种方法
69.什么是hash冲突
**哈希函数:**像一般的线性表、树等等,储存的位置都是随机的,所以在查找的的时候是通过挨个比较来查询,所以效率比较低 。而哈希函数是根据哈希表中的元素的关键值映射为哈希的储存位置,
**哈希冲突:**当两个不同的元素的关键值映射到同一个储存位置的时候
70,equals和hashcode的区别:详情
补充一点:如果重写equals方法的话,最好也重写一下hashcode的方法,以保证当equals相等时,能够返回相同的hashcode的值
71.为什么重写equals就要重写hashcode?:详情
72.动态代理(后续补充)
73.关于反射的高频面试题(11道):详情
74.字符串和数字之间的转化
数字转字符串:String.valueOf(i)
字符串转数字:Integer.parseInt(str)
二.集合容器
1.collection接口
1.1List接口
1.1.1三个实现类的异同
1.区别
ArrayList;底层数据结构为数组,线程不安全,优点是:查询效率高(有索引值)
LinkedList:底层数据结构为双向列表,线程不安全,优点是:频繁的插入、删除时效率高(有索引值)
Vector:线程安全的古老类,底层数据结构为数组、但效率低
2.共同点:
都实现了List接口,都是有序,可重复的集合
1.1.2常用方法
增:add(obj)
改:add(index,obj)
查:get(index)
删:两种情况:
(1)remove(index)根据索引去做删除
(2)remove(obj)根据内容去做删除(只有对象格式的时候才是根据内容删除)
注意:凡是存入到list集合中元素都是对象的格式(int类型的数据会自动被装箱为Integer)
eg:
1.1.2iterator迭代器
遍历arrayslist的方式:
1.for循环
2.增加for循环
3.迭代器
关于迭代器的注意事项:
1.2.Set接口
1.2.1.HashSet:博客1 博客2
1.底层的数据结构:底层其实是一个hashMap,而hashMap的底层在jdk1.8之前使用“数组+链表”,1.8之后采用“数组+链表+红黑树”(当链表中阈值大于8时,就会变成红黑树)
1.2.1.LinkedHashSet:
底层数据结构: 数组+链表+红黑树(内部使用了列表来维持数据的有序性)