Java——笔记

面向对象六大原则

  1. 单一职责:一个类应该只做一件事;
  2. 开放封闭:尽量是拓展原来的代码,而不是修改原来的代码;
  3. 里氏替换:子类可以拓展父类的功能,但不能改变父类的功能;
  4. 依赖倒置:指模块间的依赖是通过抽象来发生的,实现类之间不直接发生依赖关系,其依赖关系是通过接口来实现的,面向接口编程;
  5. 接口分离:客户端不应该依赖它不需要的接口;没用的接口应该分离出去;
  6. 迪米特:只与直接的朋友通信;

总结:每当需求变化的时候,我们利用这些原则来使我们的代码改动量最小,而且所造成的影响也是最小的。

内部类

成员内部类:类里边没有修饰符修饰的类,可访问所有变量和方法,外部类对象.new 内部类();

局部内部类:方法内定义的类,非静态方法的局部类可访问外部类的所有变量和方法,静态方法的局部类之可以访问外部类的静态变量和静态方法;

静态内部类:在类里边用static修饰的类,可访问外部类的静态变量,不可访问非静态变量;

匿名内部类:必须实现接口或者继承抽象类,不能在类里边定义静态的变量或者方法,所在方法的形参要被使用的时候必须加上final,因为局部变量存储在栈中,用完非final的局部变量就会被销毁,但是局部类中局部变量的引用还存在,调用时候会出异常,加了final就可以是局部内部类使用的变量和外部的局部变量区分开。

好处:

  • 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据;
  • 内部类不为同一包的其他类所见,具有很好的封装性;
  • 内部类有效实现了“多重继承”,优化 java 单继承的缺陷;
  • 匿名内部类可以很方便的定义回调;

==与equals的区别

==比较的是地址,equals在没有重写的情况下也是比较地址,有重写的情况下根据重写的逻辑来。

重写equals必须重写hashCode()方法,如果不重写,那么每个对象的hashcode都不相同,在进行集合操作的时候,或出错。

java和javax

没什么区别。

包:

lang,io,nio,net,util,sql

IO

Reader

Writer

InputStream

OuputStream

  • 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
  • 字节流默认不使用缓冲区;字符流使用缓冲区。
  • 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

BIO

NIO

AIO(NIO2)

反射

概念:运行时创建对象,并能调用所有方法和属性

优点:提高代码灵活度;

缺点:性能相比运行编译好的代码比较慢;

应用: jdbc连接的时候;spring中Bean的装载;

获取方式:类名.class;Class.forName();Obj.getClass();通过类加载器.loadClass();

常用API

String

Date

集合

List

ArrayList:底层是Object[],默认容量是10,每次扩容为原来的1.5倍,每次add的时候校验扩容;

LinkedArrayList:底层是双向链表,默认容量0;

CopyOnWriteArrayList:底层是Object[],默认0,每次扩容加1,里边一个可重入锁;

Vector:底层是Object[],默认容量10,每次扩容为原来的2倍,每次add是校验扩容,方法加锁;

Stack:继承Vector;

Map

HashMap:底层是个数组+链表+红黑树,默认容量是16,扩容因子为0.75倍,链表大于等于8时变为红黑树,小于等于6时又变回链表;

LinkedHashMap:

HashTable:

TreeMap:

ConcurrentHashMap:

ConcurrentSkipListMap:

Set

HashSet:

LinkedHashSet:

TreeSet:

CopyOnWriteArraySet:

ConcurrentSkipListSet:

可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

快速失败机制:遍历集合的同时集合的大小发生了变化,多线程环境下;

迭代器:使用可以进行遍历删除;

遍历:for(在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止),iterator,foreach(内部采用iterator);支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator 或 foreach 遍历。

ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。List<String> synchronizedList = Collections.synchronizedList(list); synchronizedList.add("aaa"); synchronizedList.add("bbb");

异常

JVM 是如何处理异常的?

并发

死锁的条件

  • 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放
  • 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
  • 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环),造成永久阻塞

Linux查看资源使用情况:

为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里

为什么 Thread 类的 sleep()和 yield ()方法是静态的

jvm

jvm各大区域的作用

垃圾回收算法

类加载过程

调优工具

mybatis

分页插件

执行原理

一二级缓存

Redis

删除策略:定时删除,主动删除,惰性删除

持久化方式:rdb,aof

集群搭建:

KafKa

Mysql

Spring

SpringMVC

Spring Boot

Spring Cloud

Dubbo

Mycat

es

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值