Java基本语法
1、一个Java源文件中是否可以包括多个类?有什么限制
是,只能有一个类声明为public,且声明public的类类名与源文件相同
2、Java的优势
跨平台、安全性高、简单性、高性能、健壮性、面向对象、社区繁荣
3、如何看待Java是半编译、半解释型语言
Java源代码经过Java编译器编译生成字节码文件,字节码文件执行时可能会通过解释器解释执行(逐行执行),也可能通过JIT即时编译执行(热点代码先编译好)。
4、 高效计算2*8
<<移位运算
5、&和&& 的区别
都表示且,两边同时true执行
false&运算 右边执行
false&&运算 右边不执行
6、Java基本数据类型
byte、short、int、long、float、double、char、boolean
7、 Java计算金额使用什么数据类型
不能使用float或者double,精度不高
使用BigDecimal类替换,可以实现任意精度数据运算
8、char能不能存储一个中文汉字
可以,char使用unicode字符集,包含了世界范围所有字符
9、隐式类型转换
short s=1;
s=s+1; //错误 1默认是int类型,s+1就为int,将int不能赋给short
short s=1;
s+=1; //正确 相当于s=(short)(s+1)
10、int i=0;i=i++执行后i值为
0
先赋值后++
11、boolean占几个字节
编译时不谈占字节
但是jvm在给boolean类型分配内存空间时,boolean类型变量占据一个槽位(slot,等于4个字节)。
在内存中,byte/short/char/boolean/int/float:占1slot
double/long占两个slot
12、break和continue作用
break:结束当前循环
continue:结束当次循环
13、switch分支语句忘加break会发生什么
case穿透
14、while和do while循环的区别
do while至少执行一次
15、数组中有没有length()方法,String中有没有length()方法
数组中没有length方法,只有length属性
String中有length()方法
16、为什么数组从0开始编号,而不是1
数组的索引,表示数组元素距离首地址的偏移量。因为第一个元素地址与首地址相同,所以偏移量是0
Java面向对象、异常、线程
1、面向对象与面向过程的区别
不管是面向对象还是面向过程,都是程序设计的思路
面向过程:以函数为单位
面向对象:以类为单位
2、Java中引用类型
类、数组 、接口、枚举、注解、记录
3、 类和对象的区别
类:抽象的概念上的定义
对象:类的实例
4、 构造器能不能重载
可以,不能重写
5、父类哪些成员可以被继承
属性、方法
构造器可以被子类调用
6、异常的体系结构
java.lang.Throwable:异常体系根父类
java.lang.Error:错误。Java虚拟机无法解决的严重问题。如jvm系统内部错误等
StackOverflowError、OutofMemoryError
java.lang.Exception:异常
编译时异常:(受检异常)在执行Javac.exe命令时,出现的异常
ClassNotFoundException
FileNotFoundException
IOException
运行时异常:(非受检异常)在执行java.exe命令时,出现的异常
ArrayIndexOutOfBoundsException
NullPointerException
ClassCastException
NumberFormatException
InputMismatchException
AruthmeticException 1/0算术异常
7、运行时异常与一般异常有何异同
运行时异常:RuntimeException
编译可以通过,在运行时可能抛出,出现概率高,一般针对于运行时异常,都不处理
一般异常:
编译不能通过
8、try-catch捕获的什么异常
Exception
9、在try语句中有return,最后写了finally语句,哪个先执行
return后面的语句--finally--将return翻译成字节码指令执行
10、stop()和suspend()为什么不推荐使用
stop():一旦执行,线程就结束了,导致run()方法中有未执行结束的代码。stop()会释放同步监视器,导致线程安全问题
suspend():与resume()搭配使用,否则导致死锁
11、Java线程优先级
1到10之间,10最高优先级
12、Java如何保证线程安全
同步机制:同步代码块和同步方法
Lock接口
13、 synchronized加在静态方法和普通方法区别
同步监视器不同。静态:当前类本身 非静态:this
14、 线程同步与阻塞的关系
同步一定阻塞
阻塞不一定同步,比如sleep
15、 为什么wait()和notify()方法要放在同步块中调用
因为调用者必须是同步监视器
集合、泛型、IO
1、String中的+怎么实现
常量+常量:和写在一起一样,在常量池中
变量+常量、变量+变量:创建StringBuilder实例,通过append()添加字符串,最后调用toSstring()返回一个字符串(toString内部new了一个String实例)
2、subString()底层做了什么
String str="hello"
String sub=str.subString(1,3);//底层是new的方式返回一个subStr,实体内容是"el"
3、 排序
自然排序:对应接口是Comparable,对应抽象方法compareTo(Object obj)
定制排序:对应接口Comparator,对应抽象方法compare(Object obj1,Object obj2)
4、final修饰Map可以继续添加数据吗
可以,只是地址不能变,可以添加数据
5、Set和Map的比较
HashSet的底层就是HashMap
LinkedHashSet底层是LinkedHashMap
TreeSet底层是TreeMap
6、HashMap里面实际装的是什么
jdk7:HashMap内部声明了Entry,实现了Map中的Entry接口,key和value作为Entry的两个属性出现
jdk8:HashMap内部声明了Node,实现了Map中的Entry接口,key和value作为Node的两个属性出现
7、泛型的理解
泛型,是程序中出现的不确定的类型,对于集合来讲,把集合中的内容限制为特定的数据类型,就是泛型的核心思想。
使用引用数据类型来赋值
8、 在ArrayList中remove后面几个元素该怎么做
前移
9、 数组和ArrayList的区别
ArrayList看作是对数组常见操作的封装
10、 HashMap为什么长度达到一定长度要转为红黑树
红黑树检索的时间复杂度是O(logn),比单向链表O(n)效率高
11、HashMap什么时候扩充为红黑树,什么时候返回到链表
索引i的位置的链表长度超过8且数组长度达到64,需要索引i位置变成红黑树
索引i位置元素个数低于6,将红黑树转为单向链表,为了节省空间
12、 Set如何实现元素的唯一性
底层使用HashMap,equals和hashCode
13、用哪种方式实现集合排序
自然排序和定制排序
14、File类的使用
File类的一个实例对应着磁盘上的一个文件或文件目录
File类中只有新建、删除、获取路径等方法,不包含读写文件的方法,此时需要使用IO流
15、IO流的概述
分类:
流向:输入流、输出流
处理数据单位:字节流、字符流
流的角色:节点流、处理流
IO的4个抽象基类:InputStream、OutputStream、Reader、Writer
16、节点流
文件流
FileInputStream、FileOutputStream、FileReader、FileWiter
数据读写的过程
创建File类对象,作为读取或写出数据的端点
创建相关流的对象
读取、写出数据的过程
关闭流资源
17、处理流
缓冲流
BufferInputStream、BufferOutputStream、BufferReader、BufferWiter
更高效的读写操作
转换流
InputStreamReader:输入字节流-->输入字符流
OutputStreamWriter:输出字符流-->输出字节流
转换流应用:字符的编码和解码的过程
对象流
ObjectInputStream:反序列化
ObjectOuputStream:序列化
18、其他流
标准输入流、标准输出流:System.in、System.out
打印流:PrintStream、PrintWriter
19、创建对象的方法
1、new的方式
普通new的方式
Xxx的静态方法,比如LocalDateTime.now
XxxBuilder/XxxFactory的静态方法
2、反射
Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public
Constructor的newInstance():反射的方式,可以调用空参、带参的构造器,权限没有要求
3、使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
4、使用反序列化,从文件中、网络中获取一个对象二进制流
20、如何利用反射机制访问一个方法
1、通过Class的实例调用getDeclaredMethod(String methodName,Class ...args)获取指定方法
2、setAccesssible(true)确保此方法可访问
3、通过Method实例调用invoke(Object obj,Object...args),方法返回值就是Method对应方法返回值,没有null
访问属性:get(Object obj)获取的操作、set(Object obj,Object value)设置的操作
新特性
1、jdk8新特性
lambda表达式、Stream API
2、lambda表达式
什么情况下使用:
在给函数式接口提供实例时,可以使用(只有一个抽象方法对应的接口)
比如:Comparator、Runnable、java.util,function包下的很多
kang mu pai rui te
3、Stream API
Stream API关注于内存中多个数据的运算,集合关注于存储
排序、查找、过滤filter、映射、遍历
4、1.8数据结构上发生哪些变化
使用元空间替代永久代(方法区:jvm规范中提到的结构)
Hotpot来讲:
jdk7:方法区的落地体现:永久代
jdk8:方法区的落地体现:元空间
HashMap底层结构