目录
String
关键字
面向对象的3大特性
面向对象的5大基本原则
为什么要类中加一个无参构造方法
String
1 string为什么是不变的?
因为:string的内部使用char数组存储数据,同时被声明为了final
2 string为什么要设计成不可变的呢?
第一点:string类型作为hashmap键值对中的key的时候,因为其不变性,可以帮助其hash值不变
第二点:string在建立对象后,会将值保存在字符串常量池中,下次再次创建一个相同的值的string的时候,直接退回该值的引用。优化了常量池。
第三点:string的不可变性使得他具备线程安全性。
3 什么是字符串常量池
字符串常量池位于堆内存中,jvm为了提高性能和减少内存开销,在一个新的字符串常量建立时,首先会检查字符串常量池,如果字符串已经存在,则退回该字符串的引用;如果字符串不存在,则将其实例化,并且保存在池中。
4 string,stringbuilder,stingbuffer之间的区别。
| Sring | StringBuilder | StringBuffer | |
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 安全性 | 安全 | 不安全 | 安全 |
| 性能 | 低 | 高 | 较高 |
关键字
1 final
作用于类,该类不能被继承
作用于方法,该方法不能被重写
作用于变量,该变量的值不能被修改
2 static
可以标记静态方法,静态方法可以在没有实例化对象的情况下,通过类名调用。
可以标记静态变量,也就是类变量,类变量被所有所有的对象共享。
可以标记静态代码块,它只会在类加载的时候加载一次。
3 this和super的区别
相同点:
都表示对象,super()和this()都必须在构造方法的第一行使用,并且不能在static环境下使用。
不同点:
一个表示父类,一个表示当前类,super()在子类中使用,this()在同一类中使用。
4 contiue,break,return的区别
contiue 结束当前循环,进入下一循环;
break结束当前循环体;
return 结束方面,同时退回一个类型的值;
面向对象的3大特性
封装:隐藏对象的属性和实现细节,仅对外暴露接口
继承:子类继承父类的特征和行为
多态:一个行为具有多个不同的形式或形态的能力,实现多态的3个必要条件继承,重写,向上转型(子类的引用赋给父类对象)
面向对象的5大基本原则
1 第一职责原则:一个类最好只做一件事,只有一个能引起他的变化
2 开放封闭原则:对扩张开发对修改封闭
3 里式替换原则:子类必须能够替换基类
4 依赖倒置原则:抽象不依赖于具体,具体依赖于抽象
5 接口隔离原则:使用多个小的接口,不使用一个大的总接口
为什么要类中加一个无参构造方法
因为子类的构造方法,一定会调用父类的构造方法。在没使用super的情况下,子类会默认调用父类的无构造方法,如果父类没有无参构造方法,则会报错。
为什么重写了equals方法后,hashcode也要重写两个对象相等,code值一定相等;code值相等,两个对象不一样相等;
因为在哈希表中,先比较的hashcode方法得到hash值,然后才使用equals进行值的比较。不重写hashcode方法会导致两个相同的对象,hash值不同。总结如下:
第一:不重写hashcode方法会影响Hashmap等集合的功能,降低集合效率。
第二:可以提高集合的效率。
bio,nio,aio的区别bio:服务器实现模式为一个连接一个线程;
nio:服务器实现模式为一个请求一个线程;
aio:服务器实现模式为一个有效请求一个线程;
java序列化序列化:将对象写入io流中
反序列化:将io流中的对象恢复
意义:将java对象变成了字节序列,有利于网络传输和磁盘存储
实现方式:实现Serializable或Externalizable接口
深拷贝和浅拷贝| 基本数据类型 | 引用数据类型 | |
| 深拷贝 | 复制值 | 建立一个新的对象,但是对象内容与拷贝对象相同 |
| 浅拷贝 | 复制值 | 复制地址 |
1 反射是什么
反射就运行状态对于任意一个类都可以知道他的使用属性和方法;对应任意一个对象,都可以调用它的任意属性和方法;对于可以动态获取信息和动态调用对象的方法的功能,就是java的反射机。
2 反射的优点和缺点
优点:可以再运行时获取类的实例,提高代码的灵活性;
缺点:反射的性能要求较高,需要解析字节码,对内存中的对象进行解析;提高反射性能可以使用setaccessible(true)来关闭jdk的安全检查。
3 getMethod和getDeclaredMethod的区别
getMethod():获取当前类及所有继承的父类的public修饰的方法。仅包括public
getDeclaredMethod():获取当前类的所有方法,包括public/private/protected/default修饰的方法。
method.getName:打印方法的名称
method.toString:打印方法的完整签名



