面试题
第一天
1.请分别说明修饰符default,public,protected,private的访问权限
default:一般来说不写就是默认权限,范围在本包下
public:公共的,在任何包下都能访问
protected:受保护的,范围包括本包以及其他包中的子类
private:私有化,别的类不能访问,只能在本类中访问
2.请写出String中分割,截取,替换,查找索引的方法
分割:String split("分隔符") 写在split里面的字符不再是字符,而是分割的标准
截取:String substring(int begin,int end)从指定开始截取到最后
String substring(int begin)从指定开始截取到最后
替换:String replace(char old,char new)在该字符串中,将给定的旧字符串用字符串替换
String replace(String old,String new)在该字段中 ,将给定的旧字符串,用新字符串替换
查找索引:int indecOf("字符串")第一次出现的位置,返回索引
int lastIndexOf("字符串");最后一次出现位置,返回索引
3.请写出代码获取当前时间并生成字符串,格式为"年月日分秒",如:20220101091010
A.SimpleleDateFormat(String pattern)//给定的模板
B.日期和字符串的转换
a.Date ---- String //日期对象转换成字符串
b.String ---- Date //字符串转换成日期对象
String time1 = "20220101091010";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = sdf1.parse(time);//字符转转换成date对象
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String time2 = sdf2.format(date);//日期转换成字符串对象
面试中的答案
SimpleDateFormat sdf = new SimplDateFormat("yyyyMMddHHmmss");
String time = sdf.format(new Date());
4.读取文件和写入文件的io类分别是?
读文件:InputStream --- FileInputStream
写文件:OutputStream --FileOutputStream
字符流=字节流+编码表 真正写入读取的时字节流
5.请说明ArrayList,LinkedList,HashSet,HashMap的区别
ArrayList:数组结构,查询快,(索引是连续的),增删慢(都要重构数组结构,定长)
LinkedList:链表结构,查询慢,增删快
两个效率都高,线程不安全
HashSet:单列集合,存储的元素是唯一的,不保证顺序,他的底层是HashMap
HashMap:双列集合,存储的键是唯一的,不保证顺序,他的存储依靠的是哈希表结构
保证唯一性的方法是:hashcode,equals方法
6.请说明一个线程完整的生命周期
7.equal和==的区别是什么?
假设Integer a =1;Integer b = 1return a==b;返回的结果是什么
1.==是运算符,equals是方法
==可以比较基本类型和引用类型,equals只能进行对象的比较
==基本数据类型比较的是数值,引用类型比较的是地址值
equals只能进行对象之间进行“内容”比较,没有重写的话是Object定义的,比较地址值
2.Integer类型 Integer a = 1;Integer b = 1;reture a==b;结果a==b比较地址值,一样,原因是什么
因为Integer有一个整数缓冲区,就是程序启动的时候,会把常用的-128~127之间的Integer对象创建出来,只要你需要的范围是该范围,就不会new了。1在这个里面,a,b都是从这个区域取出来的,所以地址是一样的
8.NullPointException代表什么意思?什么情况下才会出现在这个异常
即空指针异常。最常见的原因就是没有初始化,调用了未经过初始化的对象。
例如字符串变量未初始化、接口类型的对象没有初始化、当一个对象的值为空,没有判断为空的情况等
第二天
1:final关键字特点
修饰类,变量,方法
final修饰的类不能被继承
final修饰方法:不能被重写
final修饰变量:不能被修改,初始化后只能被赋值一次.变量的值不能变,基本类型数值不能变,引用类型地址值不能变
2:Http响应状态码有哪些,分类描述。并列举常见的状态码及其含义。
常用响应状态码:
200:成功
客户端请求成功,处理成功
302:重定向
指示所请求的资源已移动到由Localtion响应头给定的URL,浏览器会自动重新访问这个页面
304:走缓存
告诉客户端,你请求的资源至上次取得后,服务端并未改变,直接用本地缓存
400:请求参数有问题 交互规则
客户端请求语法有错误,不能被服务器所理解,传递参数或者返回的JSON有问题
404:资源找不到
请求资源不存在,一般是URL输入错误,或者网站资源被删除了
405:请求方式不匹配
请求方式有误,比如应该用GET请求方式的资源,用了POST
500:服务器有异常
服务器发生了不可预期的错误。服务器出现异常,可以看日志
3:重写(Override)和重载(Overload)指的是什么?
重写(Override):指的是 子类中出现了父类中方法声明(名字 参数 返回值)一模一样的方法
且子类重写后的方法权限修饰符大于或等于父类的权限修饰符
重写也叫覆盖,子类对象调用的时候,用的是重写的
重载(Overload):在同一个类中,出现了同名的方法,只需参数列表不同,实现功能的多样性
4:wait()和 sleep()的区别?
a.所属不同:
wait()是Object的普通方法
sleep()是Thread的静态方法
b.使用语法不同:
sleep()可以用在任意代码位置,(不管是否在加锁的代码中)当前线程都会休眠
wait()只能用于同步中,(加锁状态下)表示线程不参与...进入无限等待...等待唤醒
c.唤醒方式不同:
sleep不需要唤醒,进入计时等待,特点:如果有锁,不会释放锁,与锁无关
wait()先释放锁,进入无限等待时间,如果不唤醒不会自动醒
5:接口和抽象类的区别是什么?
抽象类:对类的抽象,接口:对功能的抽象
1.成员不同
抽象类包含类中所包含的成员变量,成员方法,静态变量,构造。。。。方法还可以是抽象的
接口中的成员变量只能是public static final类型,只能是常量,因为没有构造
2.抽象类定义的目的是被子类继承的,接口定义的目的是被子类发现的
3.类与类之间的继承只能是单继承,类和接口之间存在多实现
6:mysql limit语句 传一个参数 limin n 和传两个参数limit n m 之间有什么区别?
limit有两个参数
limit n 取前n个
limit m n 从m开始取n个
第一个参数表示:取前n个数据
第二个参数表示:从m开始取n个数据
7: 在 mybatis中,${}和#{}的区别是什么?
mybatis底层是jdbc
1.${}:预编译处理的占位符;#{}:拼接符
2.Mybatis在处理#{}的时候,在编译sql语句的时候把#{}位置变成?来处理,运行的时候,就会把#{里面的内容}赋值给?的位置
Mybatis在处理${}的时候,不会提前进行编译,只是在执行的时候,把$里面的内容拼接出来
3.#{}的底层是预处理对象,可以有效防止sql注入风险(让参数是参数)
4.能#不$,#在代表字符串数据的时候会自动添加引号,而$不会.$只能原样拼接
#{}用于参数位置name=#{..} ${}做原样拼接,适合表达字段名
8:cookie和session的区别?
这两个技术都可以实现会话跟踪
a.存储位置不同
cookie:存储在浏览器端;session:存储在服务器端
b.两者的安全性不同
cookie相对不安全;session相对安全
c.数据大小不同,存储类型不同
单个cookie在客户端的限制是3k,只能是键值对,值只能是字符串;session理论上没有大小限制,可以存储任意类型
d.存储时间不同
cookie默认会话级别,可以长期存储;session默认30分钟,可以主动销毁
e.服务器压力不同
cookie不会影响服务器性能,因为在浏览器端;session过多会影响服务器性能
第三天
1.Object类有哪些方法
浅拷贝:基本类型拷贝数值 引用拷贝地址值
深拷贝:基本类型拷贝数值 引用拷贝新的地址 内容拷贝
2.静态变量与实例变量区别?
静态变量:静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。方法区
实例变量:每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。堆内存
3.String类的常用方法有哪些?
indexOf():返回指定字符的索引
charAt():返回指定索引处的字符
replace():字符串的替换
trim():去除字符串两端的空格
split():字符串分割,返回分割后的字符串数组
getBytes():返回字符串byte类型数组
length():返回字符串长度
toLowerCase():将字符串转换为小写字母
toUpperCase():将字符串转换为大写字母
substring():字符串截取
equals():比较字符串是否相等
4.数组有没有length()方法?Sring有没有length()方法?
数组没有length()方法,有length属性。String有length()方法。JavaScript中,获得字符串的长度通过length属性得到的
5.String,StringBuffer,StringBuilder的区别?
第一:可变和适用范围
String对象是不可变的,而StringBuffer和StringBuilder是可变字符序列
“abc”字面值常量就是字符串对象,每次对String的操作相当于生成一个新的String对象,而对StringBuilder和StringBuilder的操作是对对象本身的操作,而不会生成新的对象。所以对于频繁改变内容的字符串避免使用String,因为频繁的生成对象将会对系统性能产生印象。
第二:线程安全
String由于有final修饰,是不改变的,安全性是简单而纯粹的。StringBuilder和StringBuffer的区别在于StringBuilder不保证同步,也就是说如果线程安全需要使用StringBuffer,不需要同步的StringBuilder效率更高
总结:操作少量数据==String
单线程操作字符串缓冲区下操作大量数据==StringBuilder
多线程操作字符串缓冲区下操作大量数据==StringBuffer
6.String str ="i"和String str = new String("1")一样吗
不一样呢,因为他们的内存分配方式不一样
String str ="i"的方式JVMhi将分配到常量地址池中,仅产生一个字符串对象
String str = new String("i"),JVM会现在堆内存中分配一个String对象,然后该对象指向常量池的字符串常量对象,如果字符串之前不存在,相当于创建了2个对象
7.String s= new String("we")创建了几个字符串对象
两个对象,一个是静态存储区常量池的“we",一个是用new创建在堆上的对象
8.基本数据类型,int初始值,Integer初始值
int初始值为0.Integer初始值是null
9.字符串操作:如何实现字符串的反转和替换?
可用字符串构造StringBuffer对象,然后调用StringBuffer中的reverse方法即可实现字符串的反转,调用relace即可实现字符串的替换
String s = "abcd";
//1.逆序遍历拼接
//2.转换成StringBuffer对象
String s = new StringBuffer(s).reverse().toString();
//replace实现替换
10.float f = 3.4;是否正确
不正确
3.4是双精度数,将双精度(double)赋值给浮点型(float)属于下转型(downcasting,也称为窄化)会造成精度损失
11.a = a+b与a+=b有什么区别
+=隐式的将加操作的结果类型强制转换为持有结果的类型。如果这两个整型相加,如byte,short,或者int,首先会将它们提升到int类型,然后再执行加法操作
byte a = 1;
byte b = 1;
b = a + b;//错误
b += a;正确
(因为a+b操作会将a,b提升为int类型,所以将int类型赋值给byte就会编译出错)