浑浑噩噩,一个月又过去了……
浑浑噩噩,一个月又过去了……算上放假,已经实习50多天了。
工作日时间过的很快,8点多起床,刷牙洗脸挤公交,接近10点到公司,晚上早的话7点多下班,晚的话9点多下班,到家后刷刷手机,十二点、一点多入睡。一天就这样过去了。
周六日时间过得很慢,一天无所事事,刷刷手机,听听音乐,一遍又一遍地打开聊天软件,总在盼望,总在失望。一天就这样过去了。
实习就像一个分水岭。在实习前我虽然会放纵,但总的来说是处于学习的状态,并且有动力来学习充实自己。在实习后,我就彻底放飞自我,停止了学习。我会一遍一遍又一遍地自我安慰说上班时间少,工作很累了没时间学习,但我知道这是借口罢了。我知道这样下去很危险,但又懒惰地不想做出改变,我知道这样下去很危险……
下周一就要开学了,因为没有考研的准备,我选择继续实习。就在我整天浑浑噩噩的同时,醒着的人正在为实现自己的目标而努力。还有几个月就要秋招了,现在还不是做梦的时候。醒醒吧,别再沉浸在实习的美梦中了,也许,这本就是场噩梦。
2022年终总结
时间过得真快啊,今天就是大年三十了,一年又这样过去了。
没什么可写的,但又想写点什么,毕竟好久没写记录自己的日常了,连”个站商店“也把我网站删除了。
《个站商店》给你发了单独的邮件,
hi 胖虎同学 :
很抱歉,你的网站《胖虎同学》未能通过『个站商店』的审核,主要原因是内容非原创,多是技术类或者转载类,这类网站一般比较少人看。等你整改后,欢迎再来哦!
———— 祝生活愉快! 邮件来自《个站商店》 2023-01-18 12:51:59
今年也和往年一样,疫情,开学,放假……
2月28日,开学,开学没几天,疫情严重,在校上网课。5月25日,请假离校,提前过上暑假生活……
9月5号开始返校,已经是大三的老家伙了,因家里疫情被延期返校,13日回校。开学没几天,疫情严重,在校上网课。11月26日,请假离校,提前过上寒假生活……
除了开学放假外,今年有两件事可以说说。一件好事,一件坏事。
实习
一件好事就是找到了实习。12月,我开始准备找实习的事,很幸运在12月30日拿到了实习offer。
1月5号,去公司报到,开始实习生活。1月21也就是今天,回家过年。实习找的比较晚,只工作了11天,而这 ...
MySQL数据库:事务
事务的概念
事务是逻辑上的一组操作,能够将各SQL语句打包执行,要么全都执行,要么全都不执行。
想象我们在操作数据库时,数据库突然挂了,或者多个线程写入数据库时覆盖了彼此的更改……一系列操作都会导致数据库数据的不一致性,基于这些问题,数据库有了事务这一机制。
拿转账举例,A想要向B转账500元,该操作分为两步:
A的账户减少500元
B的账户增加500元
事务会将这两步打包在一起执行,要么全都执行,要么全都不执行。不会出现A的账户少了500,而B账户没有增加500的情况。
如何使用事务
①开启事务
1start transaction;
②执行多条SQL语句
1234-- A账户减少500update accout set money=money-500 where name = 'A';-- B账户增加500update accout set money=money+500 where name = 'B';
③回滚或提交:rollback/commit;
1commit;
说明:rollback即是全部失败,commit即是全部成功。
事 ...
MySQL数据库:索引
索引是一种用于快速查找和检索数据的数据结构,类似于图书的目录,通过索引可以更快地找到对应的数据。
索引的优缺点
优点:
提高了查找的效率
通过创建唯一性索引,确保了每一行数据的唯一性。
缺点:
索引使用物理文件存储,带来了空间的消耗。
创建和维护索引需要耗费时间。当数据发生更改时,索引也会动态修改,降低SQL执行效率。
索引SQL
查看索引
1show 索引名 from 表名(列名);
创建索引
1create index 索引名 on 表名(列名);
删除索引
1drop index 索引名 on 表名
索引底层的数据结构
索引是一种查找更快的数据结果。
数组和链表的查找都需要遍历,最先淘汰。
二叉搜索树最坏情况下会变成单支树,查找的时间复杂度变为O(N),淘汰。
AVL树和红黑树使得左右子树高度相对平衡,但数据量太大时,树的高度过高,比较次数过多,即磁盘IO过多,淘汰。
哈希表查找的时间复杂度是O(1),是不是可以作为索引的数据结构了呢?NO!哈希表不支持顺序和范围查找,而SQL要经常进行排序和
范围查询,淘汰。
目前大多数数据库采用B树或B+树作为索引结构,在MyS ...
socket套接字网络编程
网络编程使计算机不再是一个孤立的个体,而是一个互联的整体,通过网络编程,可实现主机各进程间的数据传输。网络编程的核心就是套接字socket。socket是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。
socket主要分为三类:流套接字、数据报套接字、原始套接字。我们这里主要介绍前两种:
流套接字:使用传输层TCP协议,提供面向连接、可靠的数据传输,面向字节流,有接收缓冲区和发送缓冲区,传输数据大小无限制。
数据报套接字:使用传输层UDP协议,提供无连接、不可靠传输,面向数据报,只有接收缓冲区,传输大小受限,一次最多传输64K。
下面我们来看下Java中是如何使用socket来进行网络编程的。
数据报套接字
Java数据报套接字编程有两个核心的类,DatagramSocket和DatagramPacket。
两个核心类
DatagramSocket用于创建一个数据报套接字,用于发送和接收数据报。主要的构造方法如下:
方法名
说明
DatagramSocket()
创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口 (一般用 ...
Java文件和IO流
文件基础操作
1234567891011121314151617181920public static void main(String[] args) throws IOException { //创建一个hello的目录 File dir = new File("hello"); if(!dir.exists()){ dir.mkdirs(); } //在hello目录下创建一个hello.txt文件 File file = new File(dir+"/hello.txt"); if(!file.exists()){ file.createNewFile(); } //得到文件名 System.out.println(file.getName()); //得到文件的绝对路径 System.out.println(file.getAbsolutePath()); //得到文件的规范路径,当 ...
多线程实例:线程池
顾名思义,线程池就是存放线程的池子。直接用线程不就好了吗,为什么还需要线程池呢?
相比进程,线程已经轻量很多了,创建和销毁线程消耗的资源会少很多,但终究还是有消耗的。为了进一步降低消耗,我们需要用到线程池。需要用到线程时不用申请,直接从线程池中取,用完之后也不用销毁,再放进线程池。
标准库中的线程池(简化版本):
123456789public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(10); pool.submit(new Runnable() { @Override public void run() { System.out.println("hello"); } });}
模拟实现一个简化版本的线程池:
描述任务:直接用Runnable接口即可
组织任务:用到阻塞队列
描述工作线程:创建 ...
多线程实例:定时器
定时器是实际开发中常用的组件,例如文章的定时发布,双11的准点抢购活动等。
下面我们来看一下Java标准库中的定时器。
123456789public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("hello"); } }, 3000);}
该定时器会在3秒之后输出“hello”。创建一个定时器需要用到Timer类中的核心方法schedule,该方法内有两个参数,一个表示要执行的任务,一个表示任务在多长时间后执行。
认识了标准库中的定时器后,我们可以自己来模拟实现一个定时器。
首先,描述一个任务。创建一个MyTask类,类中有两个属性:一个是执行的任务,一个是任务执行时间。这两个属性类似于 ...
多线程实例:阻塞队列
阻塞队列是一种具有阻塞功能的队列,满足队列“先进先出”的特点,是一种线性安全的数据结构。当队列为空时,执行出队操作会进行阻塞,直到队列中有元素为止;当队列已经满了,执行入堆操作会进行阻塞,知道队列有空间为止。
阻塞队列的一个典型应用常见就是“生产者消费者”模型。毫无疑问,该模型有两个主体:生产者和消费者。生产者线程负责生产产品,将生产好的产品放进阻塞队列。消费者线程负责消费产品,直接从阻塞队列取产品。
生产者消费者模型具有解耦、平衡速度差异的特点。
解耦:生产者无需关注是谁在消费产品,消费了多少产品,只需关注生产操作即可;消费者无需关注是谁在生产产品,生产了多少产品,只需关注消费操作即可。
平衡速度差异:设想11.11,大量用户向服务器发送了大量的支付请求,一次性将这些请求交给服务器处理,服务器可能会hole不住,因此将这些请求都放进阻塞队列,消费者线程从阻塞队列一个一个地来处理请求就好了。这样就起到了“削峰填谷”的作用,平衡了生产者和消费者之间的速度差异。
标准库中的阻塞队列:
123456public static void main(String[] args) throws I ...
Java线程的创建及状态
什么是线程
在计算机中,一个任务就是一个进程。打开任务管理器,我们可以看见多个进程。如浏览器,QQ。线程是进程的再划分,是进程的一部分。一个进程可以只有一个线程(主线程),也可以有多个线程。拿浏览器举例,打开浏览器的多个网页,一个网页在播放音乐,一个网页在播放视频,一个网页在浏览博客。每个网页有不同的分工,这些浏览器的每个子任务就是一个线程。
线程是更轻量的进程,创建一个线程的消耗要低于创建一个进程,且同一进程的不同线程之间可以共享资源,效率更高。通过多线程可以更好地实现并发编程。
进程vs线程
进程包含线程,进程是线程的一部分,一个进程中至少包含一个线程。
进程与进程之间不能共享资源,同一个进程的线程之间可以共享资源。
进程是系统分配资源的最小单位,线程是系统调度执行的最小单位。
多进程稳定性高于多线程,一个进程的崩溃不会影响其他线程;多线程下一个线程的崩溃可能影响该进程。
创建线程
一个线程至少包含一个进程,main()就是一个线程,我们还可以在里面创建多个线程。
1.继承Thread类,重写run()方法
12345678910111213public class Main ...