面试题
面试题基础语法Q1:简单说说Java有哪些数据类型答:①分为基本数据类型和引用数据类型。②基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他数据类型都属于引用类型,包括类、接口、数组等。
Q2:float number=3.4;有没有问题?为什么?答:有问题,因为3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是float number =(float)3.4;/ float number =3.4F;。
Q3:字符串拼接的方式以及效率?答:①使用+直接拼接,String 是final对象,不会被修改,每次使用 +进行拼接都会创建新的对象,而不是改变原来的对象,效率低,是线程安全的。②使用StringBuffer可变字符串,效率较高,是线程安全的(StringBuffer的方法使用了synchronized关键字进行修饰)。③使用StringB ...
javaSE-多线程
多线程什么是线程?
线程(thread)是一个程序内部的一条执行路径
main方法的执行其实就是一条单独的执行路径
程序中如果只有一条执行路径,那么这个程序就是单线程的程序
多线程是什么?
多线程是指从软硬件上实现多条执行流程的技术
多线程的创建Thread类
java是通过java.lang.Thread类来代表线程的
按照面向对象的思想,Thread类应该提供了多线程实现的方法
多线程的实现方案一:继承Thread类
定义一个子类MyThread继承线程类java.lang.Thread,重写run方法
创建MyThread类的对象
调用线程类对象的start()方法启动线程(启动后还是执行run方法的)/MyThread1234567891011//1. 定义一个子类MyThread继承线程类java.lang.Threadpublic class MyThread extends Thread {// 重写run方法 @Override public void run() { for (int i = 0; i < ...
javaSE-IO流
IO流IO流也被称为输入、输出流,就是用来读写数据的
IO流的分类
按流的方向划分
按流中的最小数据单位划分
总结流的四大类:
字节输入流:以内存为基准,来自磁盘文件、网络中的数据以字节的形式流入到内存中去的流称为字节输入流
字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或网络中去的流称为字节输出流
字符输入流:以内存为基准,来自磁盘文件、网络中的数据以字符的形式流入到内存中去的流称为字符输入流
字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或网络中去的流称为字符输出流
文件字节输入流:FileInoutStream…………
javaSE-方法递归
方法递归什么是方法递归?
方法直接调用自己自己或者间接调用自己的形式称为方法递归
递归做为一种算法在程序设计语言中广泛应用
递归的形式
直接递归:方法自己调用自己
间接递归:方法调用其他方法,其他方法又回调方法自己
递归解决问题的思路:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归算法三大要素大体可以总结为:
递归公式:f(n)=f(n-1)*n
递归的终结点:f(1)
递归的方法必须走向终结点
递归经典问题-猴子吃桃
javaSE-异常
异常什么是异常
异常是程序在“编译”或“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中
比如:数组索引越界、空指针异常、日期格式化异常,等等
为什么要学习异常?
异常一旦出现,如果没有提前处理,程序就会退出jvm虚拟机而终止
研究异常并且避免异常,然后提前处理异常,体现的是程序的安全,健壮性
异常体系
Error
系统级别问题、JVM退出等,代码无法控制Exception:java.lang包下,称为异常类,他表示程序本身可以处理的问题
RuntimeException及其子类:运行时异常,编译阶段不会报错。(空指针异常、索引越界异常)
除RuntimeException之外的所有异常:编译时异常,编译器必须处理的,否则程序不能通过编译。(日期格式化异常)
编译时异常的处理形式有三种:
编译时直接跑出去给调用者,调用者也继续抛出去
出现异常捕获处理
前两者结合,出现异常直接抛出给调用者,调用者捕获异常
异常处理方式1 —-throws
throws:用在方法上,可以将方法内部出现的异常跑出去给本方法的调用者
这种方法并不好,发生异常的方法自己不处理异常,如果异常最 ...
javaSE-Stream流
Stream流Stream流是什么,结合了什么技术?
简化集合、数组操作的API。结合了Lambda表达式
Stream流思想Stream流思想的核心:
先得到集合或数组的Stream流(一根传送带)
把元素放上去
然后就用这个Stream流简化API来方便操作元素
Stream流的三类方法
获取Stream流
创建一条流水线,并把数据放到流水线上准备进行操作
中间方法
流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
终结方法
一个Stream流只能由一个终结方法,是流水线上的最后一个操作
集合获取Stream流的方式
可以使用Collection接口种的默认方法stream()生成流
数组获取Stream流的方式
Stream流的常用API(中间操作方法)
注意:
中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程
在Stream流中无法直接修改集合、数组中的数据
Stream流的常见终结操作方法
注意:终结操作方法,调用完成后流就无法继续使用啦,原因是不会返回Stream了Stream流的收集操作
收集Stream流 ...
javaSE-集合
集合
集合和数组都是容器
数组的特点
数组定义完成并启动后,类型确定,长度固定
在进行增删数据的时候,数组是不太合适的,增删数据都需要放弃原有数组或者移位集合是java种存储对象数据的一种容器
集合的特点
集合的大小不固定,启动后可以动态变化,类型也可以选择不固定
集合非常适合做元素的增删操作。
注意:集合种只能存储引用数据类型,如果要存储基本数据类型也可以选用包装类
集合的体系结构
Collection单列集合,每个元素只包含一个值
Map双列集合,每个元素包含两个值(键值对)
Collection集合体系
集合对于泛型的支持
集合都支持泛型,可以在编译阶段约束集合只能操作某种数据类型注意:集合和泛型都只支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象
Collection集合的遍历方法迭代器
遍历就是一个一个的把容器种的元素访问一遍
迭代器在java种代表的是Iterator,迭代器是集合专用的遍历方式
Collection集合获取迭代器
Iterator的常用方法
增强for循环(foreach)格式
Lambda表达式遍历集合
Colle ...
javaSE-Arrays
Arrays
数组操作工具类,专门用来操作数组
Arrays类常用API
自定义比较器
javaSE-包装类
包装类
8种基本数据类型对用的引用类型
为什么要提供包装类
java为了实现一切皆对象,为8种基本类型提供了对应的引用类型
集合和泛型也只能支持包装类型,不支持基本数据类型
自动装箱:基本数据类型的变量可以直接赋值给包装类型的变量自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量
##包装类的特有功能
包装类的默认值可以是null,容错率更高
可以把字符串类型的数值转换成真实的数据类型
javaSE-常用api
常用APIObjecttoString
默认打印当前对象的地址
让子类重写,以便返回子类对象的内容
equals
默认是与另一个对象比较地址是否一致
让子类重写,以便比较两个子类对象的内容是否相同
Objects官方在进行字符串比较的时候,没有用对象自己的equals方法,而是选择了Objects的equals方法来比较两个对象
Objects的equals方法做了非空校验,更加安全
StringBuilder
StringBuilder是一个可变的字符串类,我们可以把他看成是一个对象容器
作用:提高字符串的操作效率,如拼接,修改等
String类拼接字符串原理图
StringBuilder提高效率原理图
总结为什么拼接反转字符串建议使用StringBuilder?
String:内容是不可变的,拼接字符串性能差
StringBuilder:内容是可变的,拼接字符串性能好,代码优雅
MathMath类的常见方法