关于一些java基础的知识点,网上一搜一大把,只是稍微整理了一下,后面慢慢补充,后续我会把工作中用到的微信支付,支付宝支付,学习过的集合,多线程,线程池,以及框架我会整理出来的,加油奋斗吧,同学。
一.关于equals与==的区别与理解
==如果比较的是基本数据类型的变量,就是对比他们的值是否相同。
如果比较的是引用类型的变量,比较的就是所指向对象的地址。
equals不能用于基本数据类型的比较
如果没有对equals进行重写的话,就相当于==,进行重写的话,比较的是对象的内容
(对象的地址)简单说明:就是系统自动为你定义的变量或者常量开辟的一段内存空间地址。对系统来说是有固定的值。
(基本数据类型)简单说明:如下
基本数据类型分为了整数类型,浮点类型,字符型和布尔型
整数类型有byte,short,int,long
浮点类型有float与double
字符型有char
布尔型有boolean
用取值范围进行排序大小double > float > long > int > short > byte
二。String,StingBuffer,StringBuilder
String:他是不可变的字符序列,线程安全的。不可变的原因是因为被final关键字所修饰的
(关于final关键字后续会说明)
StringBuffer:他是可变字符序列,效率比较低,是线程安全的(因为里面的方法都被synchronized加锁了)
效率比较低且是安全的可以这样理解,因为每个方法都进行synchronized加锁,它能够保证同一时刻最多一个执行,这样保证数据不会出现问题(安全),你可以理解为串行运行(就是依次执行完)所以效率教慢
StringBuffer():默认初始容量为16
StringBuffer(int size):构造指定容量的字符串缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容
StringBuilder:跟StringBuffer大致相同,他也是可变字符序列,但效率最高,是线程不安全的
使用场景:
1、如果字符串中存在大量的修改操作而且在单线程的情况下,使用StringBuilder。
2、如果字符串中存在大量的修改操作而且在多线程的情况下,使用StringBuffer。
3、如果字符串修改很少、被多个对象引用,使用String。这个在配置信息的时候应用广泛。
三。关于final关键字的含义及用法
final关键字表示最终的,不可变的
final还可以修饰变量,方法,还有类
final修饰的类无法被继承,无法被重写
一般用于修饰的变量称为“常量”,常量名建议大写,每个单词间用下划线衔接。
四。String常用的方法
1.常见String类的获取功能
a.length:获取字符串长度
b.split:通过符号对字符串的剪切
c.subString(int start):从指定位置开始截取字符串,默认到末尾
d.subString(int start,int end)从指定位置开始截取到指定为值结束
2.常见String类的判断功能
equals(Object obj):比较字符串的内容是否相同,区分大小写
contains(String str):判断字符串中是否包含传递进来的字符串
startsWith(String str):判断字符串是否以传递进来的字符串开头
endsWith(String str):判断字符串是否以传递进来的字符串结尾
isEmpty();判断字符串是否为空串“”
3.常见String类的转换功能
a.getBytes():把字符串转换为字节数组
b.toCharArray():把字符串转换为字符数组
c.valueOf():把字符数组转为字符串
d.toLowerCase(): 把字符串转成小写
e.toUpperCase(): 把字符串转成大写;
五。关于普通类,接口,抽象类的区别
我大致总结了一点
普通类可以实例化,接口都不能被实例化(没有构造方法),抽象类如果要实例化,直接重写自己的抽象方法
抽象类要被子类继承,接口要被子类实现
抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类的抽象方法,那么该子类只能是抽象类。子类实现接口的时候,如果不能全部实现接口方法,那么该类只能是抽象类。
抽象类里可以没有抽象方法。
接口可以继承接口,并可多继承接口,但类只能单继承。
抽象类是通过abstract修饰的,接口是通过interface修饰的
六。java的IO流
1、按流划分,可以分为输入流和输出流;
2、按单位划分,可以分为字节流和字符流;
字节流:inputStream、outputStream;
字符流:reader、writer;
七。java反射的理解
程序运行中,可以构造任意一个类的对象,可以知道一个类的成员变量和方法,可以调用任意一个对象的属性和方法
实现反射的三种方式有
调用某个对象的getClass方法以获取该类的Class对象
调用某个类的Class属性以获取该类对应的Class对象
调用Class类中的forName静态方法获取该类对象,这是最安全也是性能最好的方法
八。为什么要使用克隆?深拷贝与浅拷贝的区别?
为什么使用克隆?
想对一个对象进行复制,又想保留原有的对象进行接下来的操作,这个时候就需要克隆了。
深拷贝与浅拷贝的区别?
浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;
深克隆:既克隆基本类型变量,又克隆引用类型变量;
九throw与throws的区别
throw作用在方法内,表示抛出具体异常,由方法体内的语句处理,一定抛出异常。由技术人员进行封装和捕获。
throws作用在方法的声明上,表示抛出异常,由调用者来进行异常处理,可能会出现异常,也可能不会
十。final,finally,finalize有什么区别
final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写
finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭以及lock锁的手动释放
finalize方法用于垃圾回收。
十一java中的引用类型的理解
强引用
java中默认声明的就是强引用,如
只要强引用存在(o=null),垃圾回收器将永远不会回收被引用的对象
软引用
在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常
弱引用
无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收
虚引用
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,虚引用必须要和 ReferenceQueue 引用队列一起使用.
十二关于static关键字
静态变量:声明变量的时候使用了static关键字,静态变量只在类加载的时候获取一次内存空间
静态方法:在一个方法上加上static关键。
静态方法属于这个类而不是这个类的对象;
调用静态方法的时候不需要创建这个类的对象;
静态方法可以访问静态变量。静态方法不能访问非静态变量和调用非静态方法
为什么不允许从静态方法中访问非静态变量?
静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例去访问;
静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用。
十三java的重写与重载?什么时候用重写和重载?
重载是多态的集中体现,同类中要有相同的方法名,参数个数不一致。返回类型不一定要相同。
重载的使用(在类中,要以统一的方式处理不同类型数据的时候,可以用重载。)
重写是建立在继承关系上,重写的返回类型,方法名和参数列表相同,
重写的使用(增加新的功能,可以用重写)
十四实例化对象的方式
用 new的方式
通过反射的方式获取Class.forName("类的路径")
通过clone();
序列化与反序列化
十五关于工作中的理解break,return
switch中return和break的作用是不一样的。
break是直接退出switch语句,如果循环里面有switch语句,这时候break只是跳出switch语句,作用不到循环体,return是退出该函数,也就是switch连后面的语句也不执行了。
使用break和return结束循环
break用于结束一个循环,即跳出循环体,执行循环体之后的代码。但是只能结束最靠近的那一层循环。
return关键字不是专门用于结束循环,return的功能是结束一个方法。当一个方法遇到return语句时,这个方法将被结束。方法结束 ,执行权回到方法调用处。