1.API

1.1.Object

概念:
所有对象的顶级父类
存在于java.lang包中,不需要我们进行导包
所有对象都默认继承了Object类(默认添加了extends关键字)

1.2.String字符串

特点:
底层为char数组
被final修饰,字符串不可变
任何在字符串的”+”操作都是创建了一个新的字符串并将变量名指向新的地址(堆里的新字符串)
在特殊情况下(需要性能优化的前提下)”+”行为并不可取
虚拟机在方法区中有特殊的池,叫做常量池,当创建一个新字符串时,会将这个字 符串创建实例的同时还会创建一份放入常量池中,当再次创建字符串时,会先比较常量池中是否有这个值(哈希值比较),如果有会将这个引用地址赋值给新的字符串变量

常用方法:
length() 字符串长度
charAt()获取指定下标的字符
lastIndexOf()输入的字符在最后往前的那个位置
substring()截取给定下标以往后的字符串
…..
拓展方法:
StringBuilder和StringBuffer
两者区别一个为线程安全,一个为不安全
底层是可变数组,提供了字符串修改的方法
默认为16容量,大于16会尝扩容,编程2倍+2
可择情况选择,在需要性能优化的情况,使用StringBuilder和StringBuffer作为字符串修改更优

1.3.包装类

特点:在很多情况下,基本类型并不能满足业务需求
所有在8大基本类型中有了8大包装类,除了Integer(int包装类)和Character(char包装类)其余的包装类都是类型前面字母大写
Byte,Short,Character,Integer,Long,Float,Double,Boolean,
JDK1.5实现了自动拆装箱

1.3.1.Number

Number是所有数字包装类的父类,主要目的为了各个数字类型之间的强转(多态)

1.4.Data日期类

存在有java.util.Data包
封装从毫秒值表示的准确时间

注:getMonth();返回的值为0-11

2.IO

概念:
IO是in/out简称,这是指对于程序之间输入和输出的过程。
在Java中,根据数据处理的单位不同,分为字节流和字符流
流:
在java中输出和输入叫做输出流和输入流
输入流为读取即为int
输出流为写出即为out
数据只能从头到尾顺序读写一次

2.1.BigDecimal/BigInteger

概述:之前提过在基本类型,浮点数类型运算并不准确(电脑二进制导致),这个类是专门符合十进制算术规则,可以准确运算浮点数的值
add(BigDecimal bd): 做加法运算
substract(BigDecimal bd) : 做减法运算
multiply(BigDecimal bd) : 做乘法运算
divide(BigDecimal bd) : 做除法运算
divide(BigDecimal bd,保留位数,舍入方式):除不尽时使用
setScale(保留位数,舍入方式):同上
pow(int n):求数据的几次幂

2.2.字节流和字符流

字节流是由字节组成的,字符流是由字符组成的,Java里字符由两个字节组成,字节流是最基本的,任何类型传输大多数都是字节流为主,字符流主要负责传输文本文件
例如:
字节流:InputStream->FileInputStream->BufferedInputStream
字符流: Reader->InputStreamReader

2.3.序列化/反序列化

概念:
序列化是将对象的状态信息转换为可以存储或传输的形式的过程
在序列化期间,对象将其当前状态写入到临时或持久性存储区(硬盘)。以后在通过磁盘中的文件反序列化将文件转为对象,目的为了对象的存储
通过ObjectOutputStream和ObjectIntStream
应用场景:
需要序列化的文件必须实现Serializable接口以启动序列化功能
常用于服务器之间的数据传输,序列化成文件和反序列读取数据
序列化会自动生成一个唯一的id,当进行反序列化时id版本不对,无法完成反序列化读取数据

3.泛型

概念:
<?>叫泛型,常用来和集合对象一同使用,是JDK1.5提供的新功能,其主要目的是为了提高约束,提升可读性的一种手段,但是并不会进入运行期(运行期并不知道泛型这个东西),还可以用在类旁,用来约束达到某种业务

4.Collection

概念:
用来存储对象的数据接口,是所有集合的父类,其底层提供了各种集合类,分别提供了各种不同的业务需求

List接口:
特点: 数据有序,允许存在重复元素,元素都有索引
子类:ArrayList,底层使用数组存储数据,封装了数组的操作,每个对象都有下标,初始容量为10,超过每次增加1.5倍 特点为查询快,增删慢
LinkedList,底层为双向链表结构,两端效率极高,底层为数组和链表结构实现 特点为下标遍历性能低,迭代器遍历效率高

Set接口:
特点: 不包含重复元素,数据无序(没有下标),由于不能重复,故可以拥有集合去重
子类:HashSet:底层是哈希表,包装了HashMap,单存数据K,K不可以重复,可以存储null,但只可以存储一个
TreeSet:底层为TreeMap红黑树的形式,便于数据查找,并且没有重复

5.Map

概述:
可以根据键 提取对应的值
键不允许重复,如果重复会被覆盖
存放的都是无序数据
初始容量是16,默认加载因子为0.75
其子类:HashMap(最为常用) 允许使用 null 值和 null 键。
底层是一个Entry数组,当存储数据时根据Hash算法存储位置,当存储的位置已存过数据则会根据链表结构添加为链头

6.进程

概念:
正在运行的程序,也是代表了程序所占用的内存区域
特点:
独立性:
进程是系统中独立存在的实体,它可以拥有自己的独立的资源,每一个进 程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个 用户进程不可以直接访问其他进程的地址空间。
动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念,进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。
并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响

7.线程

概念:
线程是操作系统能够进行运算调度的最小单位,它被包含在了线程中,多线程扩展了多进程的概念,一个进程里可以包含多个线程
一个程序运行后至少需要一个进程,一个进程可以包含多个线程
如果一个进程只有一个线程称为单线程
如果一个进程包含多个线程称为多线程

8.多线程

多线程的随机性:
在同一时刻只能有一个程序运行,而所谓的并发执行,其实只是系统处理器和分配的速度为纳秒级别,给人的感觉像是在并发运行一样,并且每次切换执行的时间分配对象是随机的。
线程的生命周期:
线程的生命周期主要分为5种状态
1.新建状态(new):
当线程对象创建后,即进入了新建状态(Thread t = new MyThread)
2.就绪状态(Runnable)
当调用线程对象的start()方法时,线程进入就绪状态。处于准备就绪状态
3.运行状态(Running)
当CPU开始调度处于就绪状态的线程时,此时线程才真正运行,进入运行状态直到再次进入就绪状态,才会重新进入运行状态
4.阻塞状态(Bocked)
阻塞状态可能出某些原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态
a)等待阻塞:运行状态中的线程执行wait()方法,使本线程进入阻塞状态
b)同步阻塞:线程在获取synchronized同步锁失败(被其他线程调用),这时进入同步阻塞状态
c)其他阻塞:通过调用线程的sleep()或join()方法或发出来I/O请求时,线程会进入阻塞状态
5.死亡状态(Dead)
线程执行完或因异常退出了run方法,该线程结束生命周期

9.同步锁

概念:
把有可能出现问题的代码包起来,一次只让一个线程执行通过sychronized关键字来实现同步。当多个对象操作共享数据时,可以使用同步锁解决线程安全问题。
特点:
使用synchronized使用前提是同步需要两个以上的线程,并且多个线程间必须使用有一个锁
使用同步的缺点是会降低程序的执行效率,为了保证线程安全必须牺牲性能,可以修饰的方法为同步方法,使用对象为this(代表当前对象引用使用同步锁),可以修饰代码块成为同步代码块,锁对象为任意
在需要性能优化的前提下,同步代码块最优,准确找的需要同步的精确位置,从而达到最优化。

10.注解

注解作用为增强代码,并利用反射技术来拓展更多功能,多用于各类框架之中,可以生成动态代码,从而减少代码量,使程序更易读
分类:
JDK自带注解
元注解
自定义注解
JDK注解:
关于JDK注解就为5个
Override 重写
Deprecated表示这个方法过时了
SupperessWarnings(“deprecation”)忽略警告
SafeVarargs JDK1.7出现,出现堆污染(不常用)
Repeatable可重复类型注解,在一个地方多次使用(不常用)
元注解:
Target在参数中指定应用类型
Retention 在参数中定义保留时间长短

11.反射

概念:
反射是java语言开发特征之一,它允许运行中的Java程序对自身的检查,可以直接操作类中的私有属性,可以在运行期间获取一个类中的所有信息,并且对所有内容进行操作
为什么需要:
在很多业务逻辑实现的时候,让类的创建交给第三方,我们做到拿来即用,减少开发时间,提高应用性
获取类对象的3种方式
Class clazz = 类.Class
Class clazz = Class.forName(“类的全路径”);
Class clazz = new 对象.getClass();

12.内部类

概念:
当类中包含另一个类时,这个被包含的类被称为内部类
特点:
内部类可以直接访问外部类中的成员,包括私有成员
外部类要访问内部类的成员,必须要建立内部类对象
在成员位置的内部类是成员内部类
在局部位置的内部类被称为局部内部类

成员内部类:
成员内部类是最为普通的类,它定义在另一个类的内部类
成员内部类可以无条件的访问外部类的所有方法和变量(包括私有)
当内部类拥有和外部类相同的变量名或方法名时,会发生隐藏现象,即默认为内部类成员(就近原则)可以 通过如下方式访问:
外部类.this.成员变量
外部类.this.成员方法
当外部类访问内部类时,需要创建内部类对象才可以进行操作
并且如果内部类被private修饰必须提供一个能创建实例的方法,否则不这个类将无法创建实例
局部内部类:
局部内部类定义在方法或者一个作用域的里面的类,它和成员变量一样不能被权限修饰符修饰的
匿名内部类:
此类最为常用,匿名内部类属于局部内部类,并且没有名字
匿名对象本身的接口不能new,使用匿名内部类时,相当于一个子类的实例对象,需要实现接口存在的抽象方法
静态内部类:
此类跟成员内部类原理相同,只不过加了static修饰符改为静态,出现了一些规则,并且静态内部类 不需要依赖外部类,和静态成员类似,并且不能使用外部类的非static成员和方法(静态属性不可以调用非静态属性),静态内部类并不常用,占用内存(随着类加载而加载)
拓展:为什么内部类可以无条件访问外部类?
当编译完成以后,会产生2个.class文件,我们点开会发现,内部类会有一个外部类的地址引用,通过这个地址引用可以对外部类的属性进行操作

13.Socket

概念:
也叫做套接字编程,是一种抽象层
应用程序可以通过它发送或接收数据,可对其向文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用进行通信。网络套接字是IP地址与接口与协议之间的组合
Socket接收为网络编程提供的一种机制/通信的两端都有Socket
网络通信其实就是Socket之间的通信,数据在两个Socket间通过IO传输