提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:java总结学习之路
一、java的八大基本数据类型
提示:(java要确定诶个基本类型所占用储存空间的大小,他们的大小并不像其他语言一样是随着机器的硬件架构而变化,java的数据类型长度是不可变的,这也是java比其他语言编写的更可移植性的原因)
整数类型
提示:(整型用于没有小数部分的数字,允许是负数)
- int:4字节 取值范围在 (-2的31次方到2的31次方-1)
- long:8 字节 取值范围在: (-2的63次方到2的63次方-1)
- short:2字节 取值范围在: (-2的15次方到2的15次方-1)
- byte:1字节 取值范围在: (-2的7次方到2的7次方-1)
浮点型
(浮点型用于表示有小数点的数值,所有的浮点型数值计算都要遵守(IEEE 754) 规范 三个特殊的浮点值,正无穷大,负无穷大,NaN(不是一个数字))
- float :1bit(符号位) 8bits(指数位) 23bits(尾数位) 精度为7~8位有效数字
- double:1bit(符号位) 11bits(指数位) 52bits(尾数位) 精度为16~17位有效数字
浮点型
(char类型的字面量值要使用单引号括起来
)
- char:char类型的值可以表示为16进制值,他的一个范围是\u0000到\uFFFF ,char中的取值范围是Unicode编码中进行规定的,而Unicode编码中规定的char的取值范围是0~655535
布尔类型
(boolean类型有两个值分别是 true 和false ,用来判断逻辑条件,整型和布尔类型之间不能相互转换)
- true
- false
二、引用数据类型
String字符串类型
String的特性
- String 是被final修饰过的不能被继承
- String:生命的变量是不可变的,因为String的底层是被char类型实现的并且是使用final进行修饰的,所以字符串的值创建之后就不可以被修改,具有不可变性
- String实现了Serializable和Comparable接口,表示String支持序列化和可以比较大小
理解 String 字符不可变性。
- 当字符串重新复制的时候不会再原先的地址进行复制,而是会在开辟一块空间存放值
- 每当字符串进行拼接的时候也不会在原来的内存地址进行修改,而是重新分配内存地址进行复制
- .当调用Strign的replace方法修改指定的字符或者字符串是,也不会再原来的地址进行存放,而是重新分配内存地址进行赋值
String实例化的方式
- 直接字面量化实例化
String str="hello word";
- 通过创建 构造器的方法进行实例化
String str = new String("hello word")
- 两种的区别 :通过量化为字符串赋值的变量会存放在 字符串的常量池中,通过new创建构造器的方法实例字符串时,字符串的对象会存储在堆中
StringBuffer和StringBuilder
StringBuffer和StringBuilder他们两个和String类似,底层都是由一个数组来存储字符串的值,并且数组的长度默认是16,即一个空的StringBuffer对象数组长度为16
StringBuilder
- StringBuilder类表示一个可变的字符序列,StringBuilder是非线程安全的容器,一般用于单线程操作
- StringBuilder 被final进行修饰的,不可被继承,StringBuilder类继承于 AbstractStringBuilder类。 AbstractStringBuilder 类具体实现了可变字符序列的一系列操作:append()、insert()、delete()、replace()、charAt() 方法等
- StringBuilder 实现了两个接口 Serializable 序列化接口 CharSequence 字符序列接口,CharSequence接口提供了进行只读访问的方法 如(length()、charAt()、subSequence(),toStrong())
- StringBuilder 使用了AbstractStringBuilder 中的 int count和 char[] value两个变量元素
StringBuffer
- StringBuffer也是继承于AbstractStringBuilder 使用value和count来表示存储的数据和字符串使用的计数。
- StringBuffer 属于线程安全 因为它的大部分内容都添加了锁 synchronized
- synchronized 基本上用于多线程的情况下使用,在单线程的情况下使用的比较低,因为有synchronized锁 的消耗
StringBuffer和StringBuilder的扩容问题
- 默认初始容量是16
- 扩容的问题逻辑就是创建一个新的char数组,将现有的容量大一倍在+2,如果还不够大则直接等于后边所需要的容量大小,扩容完之后将原数组的内容赋值到新数组,最后在将指针指向新的char数组
String、StringBuffer和StringBuilder的异同
相同点
- 底层都是通过char数组进行实现的
不同点:
- String对象一旦创建是不可变的,如果要修改会开辟新的空间进行存放修改之后的对象,而StringBuffer和StringBuilderd对象的值是可以修改的
- StringBuffer几乎所有的方法都是实现了同步锁(synchronized ) 线程比较安全,在多线程系统中可以保证数据的同步,但是效率比较低,而StringBuilder没有实现同步,线程属于不安全,在多线程系统中不建议使用StringBuilder 但是它的效率比较高
- 如果在实际开发过程中需要频繁的对字符串的值进行修改则不建议使用String类型 ,因为会造成内存空间的浪费,如果要保证线程安全的场景下使用StringBuffer,但是效率会减少一点,因为有锁的消耗,如果不需要考虑线程的安全则可以使用StringBuilder
java的自动拆箱与拆箱的实现原理
原始类型转换为对象类型就是装箱,反之就是拆箱,简单点来说就是 装箱就是自动将基本类型转换为包装器类型,拆箱就是自动将包装类型转换为基本数据类型
例子:
//自动装箱
Integer i = 99;
//自动拆箱
int il =i;
对象实体与对象引用有何不同
- 对象的相等:指的是两个对象在内存中存放的内容是否相等
- 对象的相等:指的是两个对象在内存中存放的内容是否相等
java中常用的运算符
- 赋值运算符:= 用于变量指定变量值
- 复合赋值运算符:+=、-=、*=、/=、%=
- 算数运算符:+、 -、 *、 /、 %、
- 后缀运算符:++、 –
- 关系比较运算符: ==、!=、>、<、>=、<=。
- 逻辑运算符:&(与)、|(或)、!(非)、^(异或)、&&(短路与)、||(短路或)
- 移位运算符:<<、>>、>>>
- 三元运算符: 语法结构:条件?表达式1:表达式2
列子:
int i=1;
int s=2
int mix= s>i ?s:i
- 运算符的优先级
后缀运算符 > 一元运算符 > 乘法运算符 > 加法运算符 > 移位运算符 > 关系比较运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符
局部变量和成员变量
- 局部变量:在方法中定义的或者是块作用域中定义的变量,作用域仅限它的代码中
- 成员变量:类的属性 也就是在类中定义的变量称为成员变量,它定义在方法的外部,成员变量也可以声明时赋初始值
- 成员变量跟局部变量的区别
- 作用域不同:
- 成员的作用域在整个类内部都是可见的,所有的成员方法都可以使用它,也还可以在类的外部使用成员变量
- 局部变量的作用域仅仅只能在该方法使用,在该方法外部无法访问
- 局部变量和成员变量可以同名,并且在使用时局部变量有更高的优先级
面向对象OOP(Object Oriented Programming)
- 面向对象(OOP)是什么:
- 他是一种设计思想,世界由万物组成,万物由每一个对象组成,发现类,发现类的方法,发现类的属性
- 面向对象的三大特性:封装 继承 多态
- 封装
- 封装是实现对象的第一步,他就是将数据或者是函数集合在一个类中,被封装的通常称为抽象数据类型,
- 具有隐藏的能力,能够有效的把类的内部数据隐藏起来,使外部只能通过公用的函数进行访问类的内部数据,并且控制它的访问级别
- 封装使当前类称为一个功能醒的独立软件
- 继承
- 继承主要是可以实现代码的服用,可以节约开发时间
- 继承就是在父类的基础上创建子类。子类继承父类
- 一个父类可以多次被继承,一个子类 也可以被继承
- 通俗来讲就是:子类继承父类的特征和行为,是子对象具有父类的实例域和方法或者是子类继承父类的方法,使子类具有父类相同的行为,如果在父类中设置private私有的 则子类是不能被继承的
- 多态
- 多态是什么:指不同对象接受到同一个消息会产生不同的行为(一个接口,多种方法),使用同名的函数实现不同的功能
- 多态的特点:
- 实现低耦合,消除类型之间的耦合关系
- 灵活性:多态在程序中体现了灵活多样的操作,使用了 重写函数,重载函数 提高了使用的效率
- 可扩展性:多态对代码具有可扩展性,新生的子类不会影响已存在类的各种性质
- 可替代性:多态对于已经存在的代码具有可替代性
- 实现多态的方式:
- 接口多态性,继承多态性,通过抽象类实现多态性
- 封装
重写 (Overriding)和重载(Overloading)
重写(Overriding):
- 子类对于父类的允许访问的方法的实现过程进行重写编写,返回值形参不可改变,内部逻辑可以实现改变,它的好处就是可以根据新的需求重新定义这个方法的行为
- 面向对象的原则里边,重写意味着可以重写任何的现有方法
重载 (Overloading)
- 重载在一个类中 名字可以相同 其返回类型/参数 不相同
- 每个重载的方法都有一个独一无二的参数类型列表,最多的就构造方法的重载
重写(Overriding)-重载(Overloading)的区别
- 重载:名称相同 参数 返回值不相同
- 重写:子类重写父类的方法 名称相同 参数返回值相同
- 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现
接口类跟抽象类
a.抽象
- 抽象的概括:一个没有方法体的方法是抽象方法,如果 类中有抽象方法,那么这个类肯定是抽象类
- 抽象方法的特点:抽象类跟抽象方法必须是 abstract 修饰的
- 抽象类的成员特点: 成员变量 构造方法 成员方法
接口
- 接口的概括:接口是一种公共的规范标准, 更多体现的是行为的抽象
- 接口的特点:接口是由关键字 interface修饰的
- 接口的子类:要么重写接口中所有的抽象方法,要么子类也是抽象类
- 成员变量只能是常量
- 默认的修饰符:public static final
- 接口是没有构造方法的,因为接口只要是扩展功能,没有具体存在成员方法,所以只能是抽象方法
c.抽象类和接口的区别
- 成员区别:
- 抽象类:变量,常量,有构造方法,有抽象方法也有非抽象方法
- 接口:常量,抽象方法
- 设计理念
- 抽象类:对象抽象,包括属性,方法,行为
- 接口:对行为进行抽象,主要的就是行为抽
java中的 static关键字
- static可以用来修饰 方法 代码块 成员变量
- 被static修饰的可以为:静态方法 静态代码块 静态变量
final finally和finalize的区别
final:
- final: 是一个修饰词 也是一个关键字
- 被final修饰的类属于最终类 是不可被继承的
- 被final修饰的方法无法被重写 但是可以重载
- 对于一个final变量,如果是基本数据类型变量,则其数值一旦被初始化就不可修改,如果是引用类型的变量,则初始化之后便不能让其指向另一个对象,但是他指向对象里边的内容是可变的
finally
- finally:finally是一个关键字
- finally在处理异常机制的提供的finally方法来执行一切操作,不管有没有捕捉到异常或者是抛出异常,finally都是会执行的,通常用于释放资源,关闭资源的操作
- finally正常下都会执行,但是也有两个极端的情况下不会执行
- 如果对应的try方法快没有执行,则这个try方法快中的finally不会被执行
- 如果try方法执行中jvm关机,列入system.exit(n) finally也不会执行(电源都拔了如何在执行?)
- finally中如果有return关键字,则会覆盖try和cath中的return关键字,会导致return覆盖无法return 所以不推荐在finally中编写return
finalize
- finalize:是object中的protected方法,子类可以覆盖方法 可以实现资源的清理工作
- GC在回收对象的时候都会调用该方法
- finalize()方法还是存在许多问题的
- java语言规范并不保证finalize方法会被及时的执行,更不会保证他们一定会执行
- finalize()方法可能会带来性能问题 因为JVM通常在单独的时候低优先级线程中完成finalize的执行
- finalize()方法中,可将待回收对象复制给GC Roots 可达到对象引用,从而达到对象再生的目的
- finalize 方法 最多由GC执行一次(但是可以手动的调对象的finalize方法)
- 总结
- finalize:常量用于声明属性 方法和类 分别表示属性不可变 方法不可被覆盖 不可被继承
- finally:异常处理机构,异常处理语句结构的一部分,表示总是执行
- finalize:是Object 类的一个方法,供垃圾收集时的其他资源回收等造作