Joshua Chen Personal Blog

Back

📝 Note ✅ Ready · java

Javese笔记-基础篇

学习黑马javase时的笔记,内含javase的基础知识

views | comments

[隐式转换] 小的自动转为大的范围 byte < short <int < long < float < double

[逻辑运算符] & 并且,俩边都为真结果才是真 | 或者 俩边都为假,结果才是假 ^ 相同为false 不同为true ! 取反

[原码反码补码]待学习

[查表法] 1.获取字符串索引对应的字符 public char charAT(int index)

2.截取字符串中的一部分 String substring(int beginindex, int endindex) 包头不包尾 String substring(int beginindex) 截取到末尾

3.替换字符串 String replace(旧值,新值)

[Stringbuilder]开辟一个容器,存放可以改变的字符串

[StringJoiner]指定拼接时的间隔符号、开始符号和结束符号 eg: public StringJoiner(间隔、开始、结束)

[链式编程]在调用一个方法的时候,不需要用变量接受它的结果,可以继续调用其他方法

[集合]长度可变,只能存引用数据类型,基本数据类型要包装类 而数组只能固定长度,但是可以存基本数据类型和引用数据类型

[静态]<\E>: 限定集合中存储数据的类型 eg:

[静态]static 工具类用静态类 可以防止外界调用 给一个类里的变量加static修饰,可以表示这个类的所有对象都共享这个变量的数据

[继承] java只能单继承,一个类只能继承一个直接父类,但是可以多层继承 pubilc class A extends B

@Override可以重写父类的方法 super.是调用父类的方法

[多态] 方法中,使用父类型作为参数,接受所有子类对象 但是不能使用子类独有功能 可以对数据类型进行转换 eg: person p = new Student(); Student s = (Student)p; 转换时候也可以用instanceof进行判断

[final] 1.表示该方法是最终方法,不能被重写 2.表示该类是最终类,不能被继承 3.修饰变量为常量 如果被修饰的变量是引用变量,则变量地址固定,内容还可以改变

[权限修饰符]常用private和public修饰

[static代码块]只能加载一次,随着类加载而加载,可以用于初始化

[抽象类]强制让子类按某种格式重写 抽象方法所在的类必须是抽象类

[接口] 接口用关键词interface来定义 eg:

接口不能实例化 [实例化]是指给对象在内存中开出一个新空间或者直接用new 构造方法名建立临时对象

[接口] jdk8以后可以用default的默认方式,不强制重写,直接继承使用

[内部类]内部类可以直接访问外部类的成员,包括私有 外部类要访问内部类的成员,必须创建对象 (作用是可以更为方便的隐藏类的方法) [静态内部类]只能访问外部类中的静态变量和静态方法 如果想要访问非静态的需要创建对象 创建格式: 静态内部类的意义在于: 有时候有些类是依赖外部类而存在的,这些类单独出现没有意义,而且又是一个单独的个体,所以用静态内部类 [匿名接口类] new + 类名或者接口(){ 方法 }; 这样可以直接重写父类的方法,省去创建子类继承父类的过程和创建子类对象的过程.

集合内的特殊遍历方法 1.增强for 2.迭代器 3.lambda表达式

**数据结构

[栈] 后进先出,先进后出

[队列] 先进先出,后进后出

[数组] 内存连续区域,查询快,增删慢

关联: [[Mysql/Mysql进阶#索引结构|MySQL B+树索引]] —— 数据库索引底层也是有序的数据结构,通过B+树实现快速查找

[链表] 元素游离,增删快,查询慢,首尾操作快

关联: [[Mysql/Mysql进阶#索引结构|MySQL B+树]] —— B+树的叶子节点通过双向链表连接,支持高效的范围查询 1.单向链表

2.双向链表

[泛型] 作用:统一数据类型 把运行时期的问题提前到编译器 java中的泛型是伪泛型,只在编译时期是泛型 泛型不能写基本数据类型,因为基本数据类型没法被转化为object类型

如果没有给集合指定类型,默认认为所有的数据类型都是Object类型 此时可以往集合添加数据类型,会导致获取数据时无法使用它特有的行为

[ArrayList]基于数组 如果想要集合中元素可重,使用ArrayList

[LinkedList]基于链表 元素可重且增删操作明显多于查询

[HashSet] HashSet利用数组,链表和红黑树来存储 如果Hashset存储的是自定义对象,一定要重写HashCode方法和equals方法 HashSet是利用这俩个方法保证数据去重的 String Integer等数据类型,java已默认写好,不需要重写

[LinkedHashSet] 有序,不重复,无索引,是HashSet的子类 基于哈希表,使用双链表记录添加顺序 如果要求去重而且存取有序,才使用LinkedHashSet

[TreeSet] 底层为红黑树 利用红黑树来存储元素

关联: [[数据结构#红黑树|红黑树详细规则]]、[[Mysql/Mysql进阶#索引结构|MySQL B+树索引]] —— 红黑树和B+树都是自平衡树结构,理解树形结构有助于理解数据库索引原理

TreeSet集合自定义排序规则有俩种 1.javabean类实现compareable接口,指定比较规则 2.创建集合时,自定义compareable比较器对象,指定比较规则

如果俩个都存在的时候优先第二种

[HashMap] 底层是数组+链表+红黑树

关联: [[数据结构#红黑树|红黑树原理]]、[[Mysql/Mysql进阶#索引结构|MySQL索引结构]] —— HashMap靠哈希散列定位,InnoDB用B+树组织数据,都是高效查找的数据结构

三种双列集合中,默认HashMap,效率最高 如果要保证存取有序,用LinkedHashMap 如果要进行排序,用TreeMap

[System流] Stream接口中静态方法of的细节 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组 但是数组必须是引用数据类型,如果传递基本数据类型,会把整个数组当做一个元素放到stream当中

System中可以用filter过滤数据,用collection或者Foreach结束输出

.map 对流中的每一个元素应用一个函数

split() :这个方法可以切割字符串切成不同的子字符串

[方法引用] ::就是方法引用符

1.需要有函数式接口 2.被引用方法必须已经存在 3.被引用方法的形参和返回值需要跟抽象方法保持一致 4.被引用方法的功能要满足当前的需求

[捕获异常] 用try { } catch{}来捕获 try写可能出现问题的代码,catch写对应的异常

1.如果try中没遇到问题,会把try里面的所有代码全部执行完毕,不会执行catch里面的代码 2.如果try中可能会遇到多个问题,则要写多个catch与之对应,父类异常要写在最下面,否则执行不到父类下面的catch 3.如果try中遇到的问题没有被捕获,则相当于try-catch白写了,当前的异常会交给虚拟机处理

4.如果try中遇到问题了,那么try下面的其他代码不会执行,只会跳到对应catch,如果没有对应catch匹配,则交给jvm虚拟机处理

[异常] 常用public void printStackTrace() 把异常的错误信息输出在控制台上,仅仅是打印信息,不会停止程序运行 System.err可以将打印的字体变为红色输出在控制台上,而且是随机

throws 抛出编译异常 throw 抛出运行时异常

[file] 1.length获取文件大小 File f1 = new file(文件绝对路径) long len = f1.length() 获取文件大小,单位是字节,想要知道M和G要不断除以1024

public boolean delete() delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站 有内容的文件夹则删除失败

createNewFile方法是创建一个新的空的文件 如果当前路径表示的文件不存在,返回true,如果存在,返回false 如果父级路径不存在,那么会抛出异常IOException 这个方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件

File[] listFile() 获取当前该路径下的所有内容
如果File的路径是一个空文件夹,返回长度0的数组
如果路径是文件或者路径不存在,返回null
	如果是有内容的文件,返回里面所有文件和文件夹的路径放在File数组中返回
	如果包含隐藏文件也会跟着返回
plaintext

[IO流] 1.创建字节输出流对象 2.写数据 3.释放资源 其中释放资源相当于解除了资源的占用,否则会提示java正在使用xx文件,无法操作

UTF-8是unciode字符集的一个编码形式 英文占1字节,汉字3字节

[字符流] 1.字符流创建字符输入流对象 底层:关联文件,并创建缓冲区(长度为8192的数组)

2.读取数组 底层会判断缓冲区是否有数据可以读取 如果没数据,则从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区,如果文件中也没有了就返回-1

如果有就从缓冲区中读取

[缓冲流] 缓冲字节流和缓冲字符流 字节流本身没有缓冲区,但是可以用高级类包装 加快字节流的效率

关联: [[Mysql/Mysql进阶#表空间|MySQL Buffer_Pool 缓冲池]] —— 都通过缓冲/缓存减少磁盘IO操作来提升性能 同时也可以让缓冲字符流使用字节流才有的方法

[序列化] 把对象以特殊形式存储在本地文档,例如游戏中的存档等 同时用反序列化读取出来 对象要继承Serializable接口来标记当前的类可以被序列化

[打印流] 有字节打印流和字符打印流两种 打印流不操作数据源,只能操作目的地,例如输入数字不会自动转换为ASCII码

字节打印流自动默认刷新,特有的println自动换行

System.out会获取打印流的对象,这个打印流的对象由虚拟机自动创建,默认指向控制台 是特殊的打印流,系统标准输出流,是不能关闭的,在系统中是唯一的 可以PrintStream ps = System.out 然后ps.println(“XXX”)输出

[解压缩流] 压缩包里面的文件本质都是zipentry对象 解压就需要操作压缩包里面的每一个zipentry对象

[多线程] 1.继承Thread类,扩展性差,语法简单,可以直接使用Thread类中的方法,因为java单继承,所以没法再继承其他类 2.Runnable接口,扩展性强,但是没法获取结果,而且不能直接使用Thread中的方法 3.Callable接口,可以获取多线程运行的结果

如果没有给线程设名字,线程有默认的名字 格式为Thread-X,X为序列号,从0开始

如果要给线程设置名字,可以用set方法或者构造方法设置

JVM虚拟机启动之后,会自动启动多条线程,其中有一条叫main线程,他的作用是调main方法然后执行里面代码

关联: [[Mysql/Mysql进阶#行级锁|MySQL行级锁]] —— 多线程并发场景下,MySQL通过行级锁来保证数据一致性

[同步代码块] 由于多线程抢夺cpu资源的过程具有随机性 所以可以用锁来锁住操作共享数据的代码,当一个线程进去后,不让其他线程进去

sysnchronized(锁){
代码
}
plaintext

锁默认打开,有一个线程进去则锁自动关闭 里面的代码全部执行完毕,线程会出来,锁自动打开

关联: [[Mysql/Mysql进阶#锁|MySQL锁机制]] —— Java和MySQL都通过锁来解决并发访问共享资源的问题

锁的对象可以是任意的,但是锁的对象一定要是唯一的,可以用static修饰一个objcet变量,表示这个类里面不管创建多少对象都是共享的 或者把类名加一个.class

sysnchronized要放在循环外面,否则只有一个线程执行完才循环内的东西会执行下一个线程

[lock锁] 可以手动用实现类创建一个对象然后调用Lock接口去使用它 如果不加static变量修饰这个对象的话,则会导致一次创建多个对象,锁失效

如果线程1执行完锁内的循环后直接break跳出循环,会导致unlock不执行,线程2和3一直不终止,程序不停止运行 可以在catch捕捉异常方法中加一个finally,然后在finally里写上unlock保证锁一定会被释放

[死锁] 尽量不要让锁嵌套锁,否则会卡死

关联: [[Mysql/Mysql进阶#锁|MySQL锁等待/死锁]] —— 数据库中的锁竞争也可能导致死锁,MySQL通过innodb_lock_wait_timeout等机制处理

[线程的状态] 线程分为六个状态,没有运行状态 阻塞队列里面已有锁的状态方法,不需要额外写锁

[线程池] 创建一个空的池子,有任务提交的时候,线程池会创建线程去执行任务,执行完毕归还线程 不断的提交任务,会有3个临界点 1.核心线程满的时候再提交会排队 2.核心线程满队伍满,创建临时线程处理多队伍外的任务 3.核心线程满队伍满临时线程满,触发任务拒绝策略

[常见软件架构] C/S: Client/Server 客户端/服务器 需要开发客户端和服务端,例如LOL游戏

B/S: Browser/Server 浏览器/服务器 不需要开发客户端,只需要服务端,例如4399

[网络编程三要输] ip 、端口号、 协议 其中协议有UDP、TCP、http、https、ftp等

[IP] ipv4 采用32位地址长度,分为四组 ipv5 还未发布就被淘汰 ipv6 采用128位地址长度,分为8组 InetAddress类可以获取主机名和IP地址对应数据

[协议]

1.UDP协议 面向无连接通信协议,速度快,有大小限制,数据不安全易丢失 例如:在线视频

2.TCP协议 面向连接 速度慢,无大小限制,数据安全 例如:下载软件、文件聊天、发邮件

[UDP通信协议] DatagramSocket类实现 三种通信方式 1.单播 2.组播 224.0.0.0~239.255.255.255 3.广播 255.255.255.255

[三次握手协议] 有一个反复确认的过程 先客户端向服务器发出连接请求,等服务器确认 再服务器向客户端返回响应,告诉客户端收到请求 客户端再向服务器再次发出确认信息,连接建立

[四次挥手协议] 客户端向服务器发取消连接请求,服务器向客户端返回响应,表示收到请求 服务器将最后的数据处理完毕,再向客户端发出确认取消信息 此时客户端再次发送确认信息,连接取消

[反射] 反射允许对封装类的字段、方法和构造函数的信息进行编程访问

作用: 1.获取一个类里面所有的信息,获取到之后再执行其他业务逻辑 例如idea的查找代码的功能

2.结合配置文件,动态的创建对象并调用方法

1.获取class对象的三种方式

1.全类名:包名+类名(常用) Class.forName(“全类名”);

2.当参数传递 类名.class 在锁中有使用到

3.对象.getClass(); .当已经有了这个类的对象的时候,才可以使用

Student s = new Student(); Class clazz3= s.getClass();

4.如何获取构造方法、成员方法、成员变量 get:获取set 设置 Constructor 构造方法Parameter 参数 Field 成员变量 Modifiers 修饰符 Method方法 Declared 私有的

[动态代理] 待学习 代理可以无侵入式的给对象增加其他功能

java通过接口保证对象和代理需要实现同一个接口,接口中就是被代理的所有方法

🗂️ This is a 📝 note in the knowledge base.

Content may be incomplete or work-in-progress.

← Back

Comment seems to stuck. Try to refresh?✨