本帖最后由 tanmingming2019 于 2019-8-25 16:58 编辑
学习笔记
序列化流
把对象持久化到硬盘或者在网络上进行传输
该类必须实现Serializable接口 这个接口是标记接口
ObjectInputStream
ObjectInputStream(new FileInputStream())
readObject() -> Object
ObjectOutputStream
ObjectOutputStream(new FileOutputStream))
writeObject()
添加序列化版本号ID 自动生成 添加plugin
1:打开setting -> plugins -> GenerateSerialVersionUID -> install 需要联网
2:打开setting -> Editor -> Inspections -> Serialization issues -> Serializable class with SerialVersionID 打钩
private static final long ID = 98798789L;
如果不想让某个属性参与序列化操作 可以使用关键字transient修饰
Properties
双列集合 使用key_value方式存储数据
只能存储String类型的数据 因为创建该集合对象的时候不需要指定泛型
setProperty(key,value)
getProperty(key) -> value
stringPropertyNames() -> Set<String> 获取所有键的集合
Properties和IO流结合使用 从指定的文件中读取配置信息
load(InputStream)
load(Reader)
store(Writer,String)
Properties p = new Properties();
p.load(new FileInputStream("C://db.properties"));
String val1 = p.getProperty("key1")
String val2 = p.getProperty("key2")
多线程
进程:就是计算机中正在运行的程序 多进程提高CPU的使用率
线程:就是进程中的一个最基本的执行单元 如果一个进程只有一个线程 那么他就是单线程程序 否则就是多线程程序
多线程可以提高应用程序的使用效率 百度服务器
java中实现多线程的两方式:
继承:
1:定义类继承Thread
2:重写run方法
3:创建子类对象
4:调用该对象的start方法
实现:
1:定义子实现类实现Runnable接口
2:重写run方法
3:创建子实现类对象 将其作为参数放入Thread的带参构造方法中
4:调用该对象的start方法
调用run和start方法的区别
调用run只是普通的方法调用 并没有启动新的线程
调用start方法是先启动线程 线程对象去调用run方法
线程调度:
分时调度模型 平均分配CPU的执行权
抢占式调度模型 根据线程的优先级高低分配时间片 优先级高的线程抢到CPU执行权的概率更大
若干优先级相同 那么就随机抽取
默认优先级5
获取优先级值 getPriority();
设置优先级值 setPriority(int i); 1 - 10
线程控制:
static sleep(long millis) 让当前线程进入休眠状态
join() 当前调用join的线程执行结束之后其他线程才能去抢占执行CPU执行权
setDaemon(boolean flag) 设置当前线程对后台守护线程 守护主线程
static currentThread() -> Thread 获取当前正在执行的线程对象的引用
设置线程的名字 setName(String name)
获取线程的名字 getName() -> String name
线程安全:
卖票:线程的访问和执行都是随机的 因此会出现同票和负票
1:多线程环境
2:有共享的数据
3:有多条语句操作共享的数据
解决方案:
1:使用同步代码块
synchronized(任意锁){
需要被加锁的代码
}
2:使用同步方法
public synchronized void m(){
锁对象是this 谁调用这个方法 锁就是谁
}
3:使用同步静态方法
public static synchronized void m(){
锁对象是当前类的字节码文件对象 类名.class
}
4:Lock -> ReentrantLock
lock();
unlock();
为了防止代码执行过程中出现异常导致不能释放锁
建议将unlock方法放在finally{}
生产者和消费者模式
生产者生产数据 -> 将数据放入数据缓冲区中 <- 消费者从数据缓冲区中取出数据并消费
1:生产者要生产数据 生产完毕之后通知消费者来消费数据notifyAll() 如果缓冲区中由数据 生产者就等待wait()
2:消费者要消费数据 消费完毕之后通知生产者来生产数据notifyAll() 如果缓冲区没有数据 消费者就等待wait()
优点:
1:解耦合 降低和生产者和消费者之间的耦合度
2:支持并发
3:解决忙闲不均的问题
个人学习经验分享:
1.关于程序员:首先要正视自己的职业,不要把自己定义为外人眼中取笑或者谈资的码农,程序员是一个高大上的职业,我们是在用各种不同的技术做产品和系统,用关键技术去解决现实生活中的一些问题,为人类生活提供便利,时时刻刻在为社会进步做贡献,所以我们的职业值得高薪,更值得别人去尊敬。另外,我们要给自己未来的职业做出规划,选择大数据,未来就要争取做engineer和manager,而不是普通的programmer;
2.关于学习方法
大家都经历过这么多年的教育,肯定都有自己的学习方法或者学习习惯,学习方法本身无好坏之分,只有适不适合自己。
个人学习方法分享:
(1)多思考总结
现在每天学习的内容很多,我们要对学习的知识点进行梳理和总结,总结各个技术的实现流程和步骤,比如tcp客户端,jdbc实现流程等,另外总结那些具有相似功能的知识点之间的差异性,比如list和set 集合,thread和runnable接口实现多线程等等,要争取做到学完一门技术后能够对该技术整个知识架构有清晰的了解,这样在编程的时候,一看到需求就能想到用哪些知识点来解决问题。
(2)多记录笔记
主要是对自己没掌握的知识点或者难以理解的知识点进行记录。做笔记可以加深我们的记忆和理解,同时锻炼我们的手写代码能力,对于这些记录的知识点可以适当多花些时间去个个击破。面试有不少面试官喜欢让人手写代码,考察应聘者的基本功,比如导包语句记不记得加分号,创建list对象引用时能否记得加数据类型,考察更深一点,会让你写java中一些封装方法的底层实现代码,比如排序算法,String 反转等等;
(3)编程练习
课堂上的演示案例和练习题最好能够自己全部用代码正确实现,这样有助于加深理解。编程练习时个人不建议对着视频教程去敲代码,那样效果不理想,即便你正确实现了程序,也不一定代表你对该知识点真掌握了,这跟临摹练字是一个道理,我认为正确的做法是先捋清实现逻辑,脱离视频或者笔记文档去尝试编写代码(像老师课堂编程那样,先罗列实现逻辑和步骤),如果中途写不出来就可以去看看视频,找到出问题的环节,记录没掌握的知识点,练习时尽可能多的暴露自己的问题,编程遇到bug,先自己定位问题,解决不了的情况下可以立马去问同学或者老师,因为这个时候自己很可能陷入了思维定式,短时间内难以找出bug,学习阶段,要不耻下问,节约时间成本,提高学习效率;
另外补充一下,关于编程,如果有精力的话要注意培养编程规范问题,比如添加合适代码注释,入参检查,变量规范命名等,编程规范是工作中比较关注的基本素养,好的代码并不是你写的代码有多炫,而是你写的代码足够健壮,可维护性高,逻辑清晰。以后工作你会发现走查别人写的逻辑混乱代码远比自己编程痛苦,基础好,学习能力强的同学可以多看看底层源码,学习里面的编程逻辑和实现方法;
(4)其他
尽量不要在自己疲累的时候学习,那样学习效率很低,平时学习要注意劳逸结合,不要刻意追求每天学了多少小时,状态好的话,休息时间也可以充分利用去学习,此外要学会自己缓解疲劳和释放压力,比如运动,看电影,听听歌,玩玩小游戏等,提高语言表达能力和沟通能力,未来工作都是以团队合作为主,此外还会和其他不同的部门打交道,多锻炼身体,it工程师必须保证身体耐操。it工作很累很压抑,但是我们既然选择了这行,就应该撸起袖子昂首前行! |
|