自从Java发布以来,基本数据类型就是Java语言的一部分,分别是byte, short, int, long, char, float, double, boolean。
boolean —> Boolean
char —> Character
byte—> Byte
short—> Short
long—> Long
int —> Integer
float—> Float
double—> Double
包装类主要以下作用:
(1)类型转换时,如果不能强制转换,则需要使用包装类的相关方法来实现类型转换。
(2)在有些情况下,能够被处理的数据类型只能是引用类型,如Java集合中不能存放基本类型数据,如果要存放数字,应该通过包装类将基本类型数据包装起来,从而间接处理基本类型数据。
(3)每个包装类都包含一组实用方法,其中很多是静态的。这些方法为处理某种基本类型数据提供了丰富的手段。比如Integer类的静态方法parseInt(String s)能将字符串转换为整数,静态方法toBinaryString(int i)返回包含整数i的二进制形式字符串。
(4)包装类默认值为null,一些不需要默认值的场景。
包装类和基本数据类型之间的转换。
装箱:把基本数据类型转换成包装类。
拆箱:把包装类转换成基本数据类型。
封装
解释:是指隐藏对象的属性和实现的细节,仅对外提供公共访问方式。
目的:
(1)隐藏实现细节,代码安全。
(2)简化代码,增强了代码的复用性。
(3)减少耦合,分工明确。
继承
解释:子类继承父类的特征和行为。
目的:实现代码的复用。
多态
解释:同一个行为的多个不同表现形式。
目的:使程序更灵活,扩展性更强。(以不变应万变,usb接口)
必要条件:
(1)继承或实现接口
(2)父类引用指向子类
(3)重写
(1)==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。(比较地址值即是指是否为同一个对象的引用)
(2)equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。
(1)hashCode() 的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
(2)hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有 hashCode() 函数。
(3)通过对象的内部地址(也就是物理地址)转换(计算)成一个整数,然后该整数通过hash函数的算法就得到了hashcode。
(1)ArrayList的底层结构是一个数组。默认长度是10。
(2)当数组被存储占满时触发扩容,新数组长度为原长度的1.5倍。
(3)当数组扩容时,会创建一个原数组长度1.5倍的新数组,然后再把数据从原数组中拷贝到新数组中。
(1)底层数据存储结构是数组+链表+红黑树
(2)数组的默认长度为16
(3)负载因子为0.75,也就是说当使用容量达到总长度的四分之三时,触发扩容,新的数组长度为原数组长度的2倍。
(4)当key发生hash碰撞时,产生链表。当链表的长度大于8并且数组长度大于64时,产生红黑树。
(5)容量小于64,链表长度大于等于8也会触发一次扩容。
(1)单例模式
(2)工厂模式
(3)代理模式:动态代理和静态代理。其中动态代理包括JDK代理和CGLIB代理
饿汉式
(1)在程序启动时创建对象
(2)优点:线程安全的
(3)缺点:影响启动速度。如果这个对象从来被使用过,会导致占用多一点内存
懒汉式
(1)在使用对象的时候才创建对象
(2)优点:不会占用更多内存
(3)缺点:不是线程安全的,因此一般会在创建对象时加锁
(1)判断两个对象是否为同一个对象时,优先判断hashcode是否相同。
(2)如果hashcode相同,会再次调用equals来判断是否为同一个对象。
(3)一般重载equals时,需要先重载hashcode,否则在判断对象的值是否相同时,可能不会被调用。
(4)hashcode的作用是加快查找和比较对象。
(1)接口中的默认方法
(2)函数式接口
(3)Lambda表达式
(4)Stream API
(1)集合(Collect)主要侧重的是数据和存储。
(2)流(Stream)主要侧重的是计算。
(1)通过new关键字创建对象:调用了构造函数
(2)通过class类的newInstance()方法:调用了构造函数
EmpObj empObj = EmpObj.class.newInstance();
(3)使用构造器类的newInstance()方法:调用了构造函数
Constructor constructor = EmpObj.class.getConstructor();
EmpObj emp = constructor.newInstance();
System.out.println(emp);
(4)使用clone()的方法:没有调用构造函数
(5)通过反序列化方法:没有调用构造函数
(1)字节流,是读取/写入一个字节(byte)。
(2)字符流,是读取/写入一个字符(char),可以直接接受字符串,它内部将字符串转换成字节。
(3)所有文件的存储都是以字节为单位,所以字节流适用于任何文件。
(4)字符流只能操作纯文本文件。
面向对象实际上是针对面向过程而提出来的概念。面向过程是一切是函数,面向对象是一切皆对象。
面向对象思想简单概括起来就是三个:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
(1)封装:保留有限的外部接口(interface),隐藏具体实施细节。
(2)继承:顾名思义,继承就是儿子对父亲的继承,子类不但可以有父类,他也可以有自己的子类。
(3)多态:继承、方法重写、父类引用子类对象
父类类型 对象 = new 子类类型();
对象.方法名();
子类也并不是完全继承父类的所有方法。
(1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
(2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
(3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
(1)JVM,全称Java Virtual Machine(Java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机,引入JVM后,Java语言在不同平台上运行时不需要重新编译。JVM是Java跨平台的核心。
(2)JRE,全称Java Runtime Environment,是指Java的运行环境,是可以在其上运行、测试和传输应用程序的Java平台。
(3)JDK,全称Java Development Kit,是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。
(4)三者关系如下:
JDK = JRE + 开发工具集(例如Javac编译工具等)
JRE = JVM + Java SE标准类库
String | StringBuffer | StringBuilder |
---|---|---|
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,速度更快 |
不可变 | 可变 | 可变 |
线程安全 | 线程安全 | 线程不安全 |
多线程操作字符串 | 单线程操作字符串 |