java笔试面试(一)

jvm : java虚拟机
jre : java运行环境
jvm+装载到jvm中的基础类库
jdk : java开发工具集
jre+必要的开发工具

环境变量:
1. JAVA_HOME : 方便切换jdk版本 D:\java\jdk1.8.0_131
2.path : path路径下的.exe文件可以在系统中任何环境被执行 %JAVA_HOME%\bin
3.classpath : classpath路径下的所有的.class文件会被加载到jvm(java虚拟机) %JAVA_HOME%\jre\lib

程序运行过程:
1.编辑代码
2.编译 java代码-->.class (javac cs1902.java)
3.加载 把.class文件 装载到jvm中(一个类只有加载到jvm中才能被使用)
4.运行 运行java代码 (java cs1902)

标识符命名习惯:
类名: 单词开头字母大写,多个单词组成则每个单词首写字母大写,大驼峰
方法名,变量名,参数名:首字母小写,多个单词组成则第二个开始每个单词首写字母大写,小驼峰

保留字:goto、const

基本数据类型:四类八种
整型类:byte 8 -128~127(默认0)
short 16(默认0)
int 32(默认0)
long 64(默认0)
浮点型:double 64(默认0.0)
long 32(默认0.0)
字符型: char 16 (默认空格 )
布尔型: boolean (默认false)

数据类型转换:自动(小-->大)
强制(大-->小)可能造成精度降低或者数据溢出

变量要先被赋值才能使用

局部变量和全局变量的区别:
1.声明位置不同
2.全局变量拥有默认值,局部变量没有默认值

在逻辑与(&&)和逻辑或(||)中会存在短路现象
逻辑与(&&):表达式1 && 表达式2 如果表达式1为false 就不会验证表达式2 则出现短路
逻辑或(||):表达式1 || 表达式2 如果表达式1为true 就不会验证表达式2 则出现短路

a++ 和 ++a 的区别,a--和--a的区别

位运算符:1.按位左移运算符 a<<1 即 a2(a乘以2的1次方) a<<3 即 a222(a乘以2的3次方)

经典面试题:最有效率的方法算出2乘以8等于几
2<<3 (即2乘以2的三次方)

swtich(key) : key的值可以是 byte short int char enum (jdk 1.7之后可以是String),不能用boolean long float double

case穿透: 某个case语句中缺少break ,则直到出现break才能结束

循环的步骤:

  1. 循环变量初始化
    2.判断循环变量
    3.执行循环体逻辑
    4.修改循环变量

while 和 do-while 的区别:
当第一次不满足条件的情况下 ,while循环不能执行循环体,do-while可以执行一次

break 跳出整个循环
continue 结束本次循环
return 结束整个方法

方法的作用:提高代码可读性,提高代码可维护性

方法的重载 :1. 同一个类中
2. 方法名相同
3. 参数列表不同(参数类型、个数、顺序(类型的顺序))

递归: 特征:方法自己调用自己
注意:找到程序的出口

递归经典笔试题:
1.输出三角形
2.斐波拉契数列

  1. 2+22+222+2222+。。。。
    4.百元百鸡

使用数组遇到的问题
1.数组下标越界
int[] a = new int[4] a[6]=1
2.赋值 还是赋地址 传值 还是传地址
int[] a = {1,2,3} 假如数组a在堆中的地址是@1111
int[] b = a 则数组b在堆中的地址也是@1111
赋的是地址 不论 数组a 还是数组b 任意一个数组改变 另一个也会改变
3.空指针异常
基本数据类型以外的数据类型都叫做引用数据类型
引用数据类型的默认值是 null(空对象)
如果调用null对象的方法或者属性 会抛出空指针异常

数组传值 还是 传地址
int[] a = {1,2,3,4,5};
int[] b = a;
数组a 和数组b 地址相同
改变了一个数组的值 另一个也会改变

基本数据类型 赋值 赋的是值
引用数据类型 赋值 赋的是地址
基本数据类型的值存在 栈内
引用数据类型的值存在 堆内

== 和equals的区别
如果是基本数据类型 比较是否相等 用==
如果是引用数据类型 用==比较地址是否相等 用equals比较值是否相等

冒泡排序
二分法查找

怎样优化虚拟机
1.扩大内存
2.垃圾回收
3.oom--Out of Memory

什么是面向对象?面向对象和面向过程的区别是什么
面向对象是一种思维方式
区别:面向对象是把事情委托给别人做
面向过程是亲力亲为

构造方法与普通方法之间的区别
1.构造方法没有返回值类型
2.构造方法的方法名与类名相同
public Person(){}

this关键字的作用以及使用
this代表所在类的当前对象的引用(地址值),即对象自己的引用
this.成员变量名
this.成员方法名

区分方法的重载 和 重写
重载 : 发生在 同一个类中 方法名相同 参数列表不同
重写 : 发生在 继承中 子类继承父类的方法 也许不太适合子类的需求 子类重写父类的方法

访问权限: public protected 默认 private (笔试题中常出现)
权限 本类中 同包中类或同包子类 不同包子类 不同包中
public ✔ ✔ ✔ ✔
protected ✔ ✔ ✔ ✘
默认 ✔ ✔ ✘ ✘
private ✔ ✘ ✘ ✘

静态的变量 和 方法 是否能够被继承?
不会被继承 但是 可以被子类使用
静态的属性和方法 是这一类事物拥有的共同的属性

我们不能创建一个类 来继承 String类 因为String类 是用final 修饰的

两个String怎么比较大小?
用 a CompareTo(b)
因为String类 实现了 Comparable接口

单例模式

单例模式的饿汉式和饱汉式有什么区别
1.对象初始化的时机不同
饿汉式:在类一被加载到jvm方法区的时候 对象就已经创建 而且一直在占用内存
饱汉式:第一次使用的时候 才生成对象 (没那么消耗内存)
2.单例模式的类的对象,一般来讲都是被并发访问最大的对象
线程
高并发的时候使用,线程安全

工厂模式

比较器:Comparable 和 Compatator 的区别
Comparable接口 : 是让对象本身具备比较的能力
Comparator接口:是一个外部比较器

JDK 1.8 之后变化最大的是?
lambda表达式(JDK 1.8 才有)

五种常见异常
1.空指针异常
2.数组下标越界异常
3.不符合数学原则异常
4.输入类型不匹配的异常
5.类型转变异常

Object:在java.lang包下

Object的方法

Object的equals 和 hashCode方法

java中创建一个对象:(两种方式)
new ****
对象.Clone

new 出来的对象 和clone出来的区别:
性能

关于深clone 和 浅克隆
深克隆步骤
浅克隆步骤

final 、finally、finalize 的区别
没有关系 只是长得像
final:常量 finally:异常中使用 finalize:垃圾回收前最后一次调用这个方法

把字符串中指定的字符串出现的位置全部找出来(递归)

现有如下字符串: zoukx is a good man;
把每个单词首字母变成大写 Zoukx Is A Good Man;

String、StringBuffer 和 StringBuilder的区别

  1. String的值在常量池
    拼接的时候 实际上是开辟新的空间 然后再赋值
    所以不适合 用在循环中的拼接(内存使用太大)
    2.StringBuffer 和 StringBuilder
    专业做循环中的字符串拼接,拼接的时候,实际上是在原来的对象后面追加
    3.StringBuffer 线程安全
    StringBuilder 线程不安全 效率高

猜你喜欢

转载自www.cnblogs.com/shumengjiao/p/11331578.html