







配置PATH和JAVAHOME

上面是单一用户有效,下面是所有用户有效,粘贴路径招贴到bin



IDEA安装
IDEA学习

导入模块
最好是新建模块把模块复制过来,删除remove知识在页面上删除,实际的删除需要到磁盘里直接删除,或者下图真正删除但是删不干净,新建没法新建

如果再没删干净就去idea文件夹下打开然后删除这一行
然后再重启IDEA
打开工程也是直接在黑点打开
JAVA基础语法学习
注释不影响程序执行的原因是因为编译之后的class文件没有注释了就
音视频图片都是二进制形式存储





new出来的都放在堆内存


对象的赋值是地址的传递






左手shift然后G




一个放在常量池一个放在堆内存
只要不是双引号来的值都是放在堆内存
一个在运行阶段才知道s2的值一个在编译阶段就自动转化
双等号比较的是地址,比较字符串内容的API是equals



static是所属于类的,最好用类名访问,用对象访问也可以只不过不推荐,是共享的,public的。
如果没有static那就是属于每个对象的,只能对象来访问,也叫作实例成员变量。
static变量存储在静态变量区
在同一个类中,静态成员方法的使用可以直接使用。


因为this是指当前对象
一些工具类就是静态的可以直接用类名调用,如果每个人创建对象才能调用方法就太占用内存了,工具类不用创建对象,所以就把构造器藏起来,把构造器设成private


懒汉单例啥时候用啥时候做饭


this访问子类空间,super访问父类空间




防止出现歧义,虽然不支持多继承但是支持多层继承,如何多个同名方法,那就按最近的方法调用
访问的话就近原则,先自己在爸爸在爷爷


必须过继过来的才能重写,静态方法没过继过来,用super访问
调用父类的有参构造器是为了初始化继承父类的数据











编译之后常量就消失了,而常量的内容也就全部替换到文本中了





一个void一个int这时候不能多继承




乌龟不能转狗










匿名内部类就是没有类名




字符串的equals已经被重写了,是访问内容是否相等

更加安全如果比较的双方有为空的也不会报错,会先判断是否为null
a.equals需要先判断a是否为Null
需要tostring转化成string类型


只占用一个内存内容可变





string类提供的API




arrays类

Lambda简化匿名内部类



数组和集合
集合存储对象,不支持基本类型,如果存储请用包装类
集合的功能更强大,提供很多的增删改查API,元素只有索引啥的













通配符,泛型的上下限
新的开始 set map

哈希set

object类的就是什么都可以调用,int,string都可以调用

默认长度是16,当到了16*0.72=12是就自动扩容到原来的两倍

想要去除重复的值就必须吧equal和hashcode重写
哈希LINKset加了一个双链表记录存储的顺序
Treeset的整数,字符串都可以排序,对象需要自己制定规则,方式一



默认先用二
可变参数
接收时用的就是数组,只要是数组直接打印得到的都是地址,如果想输出数组的值就是Arrays.tostring(array)
化简成为Lamada

Map集合,非常适合做购物业务




所有数组都是打地址,所有集合都是打内容

map.entrySet()+ctrl+alt+v自动补全




总结一下HashMap底层是哈希表,Set底层是Map
集合嵌套
Collect里面嵌套list,Map里面嵌套list,遍历就是for。。。。。,get()
不可变集合对象



Stream流
先过滤然后再遍历一个个保存或者打印输出


Stream的获取

Arrays是数组的工具类,Collection是集合的工具类
有各种API


问:哪个类可以解决精度问题,Bigdecimal
需要把数据都封装成大数据对象

流的收集用collect(Collectors.toList()/toSet)都可以,但是要记住一个流只能收集一回,就消失了。也可以直接toArray收集成为数组,toList,没有toSet,但是这样生成的List不可变
Lamada表达式还可以变成String::new(方法引用类型)
异常处理



面试常问写出几个运行时异常
1ArrayIndexOutofBoundsException数组索引异常(超过数组大小)
2NUllpointException空指针异常(null的length)
3ClassCastException类型转换异常(int转string)
4ArithemeticException数字操作异常(除0)
5NumberformatException数字转换异常(字符串转int)
善意的提醒你看一看,如果没问题就抛出异常,运行时异常的错误不容易犯,没必要提醒
默认的异常处理方式是层层往上抛结束运行
自我干预异常处理:

快捷键直接alt+回车
如果多行就cirl+alt+t
打印异常栈信息


运行时异常的处理方式:
运行时异常自动抛出,在外层捕获处理就行
自定义异常

注意throw和throws的区别

日志框架










文件的操作

字节流音视频文件,字符流文本文件
file创建对象支持绝对路径也支持相对路径

mkdir创建一级,mkdirs创建多级


递归

字符集



每个国家的字符都有自己特色的首字节,如首字节负数就说明是中文,那读三个字节

IO流





String =new String(byte[],几开始,读取长度);



写字节的时候写完一定要刷新,然后释放流,直接释放流就自动刷新了
每次学数据都会把之前的数据清空,因为管道一创建就会清空,可以再定义留的时候加个参数true就变成了追加数据


总结:字节流适合做文件的拷贝,不适合中文的输入输出
资源释放的两种方式
try catch finally


在trycatch之外也能用,但是trycatch之外已经关闭了,所以没意义,更多的还是trycatchfinally
字符流的读取













转换流



对象序列化
把对象存文件

继承的字节输出流
对象要序列化必须实现Serializable接口


对象反序列化


修饰的对象不再序列化,比如密码,反序列化出来也是null
可以定义一个序列版本号
打印流



打印流的重定向,更改,从控制台改成别的文件
Propertise属性文件




IO框架
多线程


多线程实现方法一


多线程实现方法二






第三种方式





对于多个子线程无法区分的情况下可以定义名称,然后在子线程中用currentThread获取哪个子线程在跑
获取主线程的话可以用currentThread

通过构造器取名字
实际开发时不会为线程取名字,就用默认的名字
线程同步
同步代码块



静态方法属于所有线程共同访问的所以用一个字节码对象就可以
同步方法

把核心方法加上就行比如取钱

LOCK锁
功能更强,API更多,最好定义为final
同时在上锁后放在try catch里,finally放解锁操作,也就是就算出异常也必须解锁

线程通信



用当前同步锁对象调用
线程池









线程池处理Callable任务

工具类里面的方法绝大多数都是静态方法直接调用就完事了。



弊端是参数不可控,容易堆积大量的任务以及创建大量的线程
定时器


以后用ScheduleEecutorsService定时器

并发与并行




sleep的时候并不会释放锁对象,等到了时间继续执行,wait就会把锁让出去,对应的是唤醒操作notify
新建之后就是就绪状态
网络编程

BS一站式开发,兼容性强







也可以ping域名,本机的域名就是localhost



不同设备上的同种程序的端口号一样



UDP传输
实现了一发一收



多发多收


用子类加入组播组
TCP通信




上面是用while循环实现的,是个单线程
下面用多线程让和多个客户端通信
