- 博客(110)
- 收藏
- 关注
原创 Session与Cookie
比如用户A在浏览器注册界面点击验证码刷新,服务器端会传回验证码值,如果后端使用的技术不是Session而是直接采用的是web应用域(全局域),假设此时同时有个用户B也在刷新验证码,A请求返回的验证码值就会被B的请求值覆盖;session一般在内存中存放,内存空间本身大小就有一定的局限性,因此session需要采用一种过期删除的机制来确保session信息不会一直累积,来防止内存溢出的发生。属性名为 "name",值是"zs",接收的时候是设定接收对象的属性名,因为返回类型是Object,所以需要强转。
2024-01-12 09:00:00
940
原创 javaweb基础----JDBC、servlet(二)
在执行可变参数的一条SQL时,PreparedStatement要比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率高。执行SQL语句是可以带参数的,并支持批量执行SQL。类似List的扩容操作,如果容量一满就开辟一个新的空间,这样会造成系统资源的浪费,我们可以初始时开辟一定大小的空间,每次要扩容时再开辟一定大小,避免频繁扩容。这里也是一样,为了避免频繁开关连接,初始时建立一个连接池,给其中分配一定数量的连接,当连接池中连接都用完再扩充连接池,避免多次扩充造成浪费。
2024-01-10 18:03:44
954
1
原创 javaweb基础----JDBC(一)
JDBC在应用程序与数据库之间起到了一个桥梁作用,当应用程序使用JDBC访问特定的数据库时,需要通过不同数据库驱动(所谓数据库驱动就是数据库厂商提供链接数据库的jar包)与不同数据库进行连接,连接后即可对该数据库进行相应的操作。用驱动管理程序创建获取链接,getConnection方法有3个重载方法,上文的这个是包含3个string类型的方法,url:数据库地址,后面是 "协议 : 子协议 :// IP:端口号 / 数据库名称 "如上所述,连接数据库绕不开三要素,这里只需要一个参数url,实际上是用?
2024-01-09 14:40:17
1098
原创 面向对象编程————接口案例
本题的关键在于有两种实现方案并要求灵活切换,那么可以定义一个学生操作接口,定义两个实现类,分别实现两种方案。————在ClassManager类Print方法中,分别用实现类创建对象。我们知道:一个接口可以被多个实现类实现,这样实现出的接口可以很方便地切换实现类,因为不同实现类中有不同的重写方法对接口中的抽象方法进行了重写,所以这样就可以调用不同的方法完成切换业务。切换方法————只需要将实现类printAll 换成 printSelect就可以了,其他不用改,是不是很方便。
2023-12-21 21:15:49
423
原创 Java实战案例————ATM
首先ATM银行系统包括两个基础大功能:开户和登陆账户(当然在系统中没有一个账户时不能登录,需要先开户)。在登录账户后又有7项功能:查询账户信息、存款、取款、转账、修改密码、退出、注销账户。一名用户有6项基本信息描述:姓名、性别、银行卡号、银行卡密码、账户余额、取款限额。3、登录账户,但是登录密码错误。a. 查询打印账户信息。以上就是所有基本功能!(二)密码输入不一致。
2023-12-02 19:17:33
618
原创 Arraylist案例
首先多个菜品信息可以用Arraylist 来存储,那我们需要再创建一个菜品类Food,为了实现菜品上架等等功能,再创建一个FoodOperator类进行操作。Arraylist是使用最频繁的一个集合,它与数组类似,不同之处在于它可以动态改变长度,不够了可以扩容。
2023-11-27 09:30:00
411
原创 两个String案例
用户名和密码可以分别用一个字符串保存,再与输入的字符串分别比较,先比较用户名,成功后再比较密码,注意比较字符串不能直接用 ' = ' ,而是要用String类的方法实现。上面的代码过于冗余了,增添了很多不必要的东西,像系统保存的字符串根本不需要单独创建一个类描述,直接用 " "表示即可。还有循环内部也太过复杂,完全不需要计数器count,直接for循环3次,中途达成条件退出就行了。
2023-11-08 18:52:34
106
原创 Vue小案例(一)
那么就需要v-if 来进行条件渲染,注意这里不用v-show,因为v-show只是控制元素的显示隐藏,而不会真正控制元素节点的创建删除。创建图示这么个成绩表,包含三个科目及其编号成绩,显示总分和平均分,并可以进行添加成绩和删除成绩的操作(删除所有数据后显示暂无数据)。删除就是将bookList对应的数组元素删除,那么del方法需要接收参数来确定删除哪一项。现在有5张图片,我想通过点击上一张 / 下一张的按钮来进行图片切换。当上一张到第1张位置时,再点上一张会出错,同样的下一张也是。6、计算总分、平均分。
2023-10-18 10:00:00
714
原创 API基础————包
Java也有20年历史了,这么多年有这么多程序员写了无数行代码,其中有大量重复的,为了更加便捷省时地进行开发,Java提供给程序一个专用的大型程序集合——API。4、调用多个不同包中的相同程序,默认只能导入一个包,想访问另一个包中的相同程序必须包名+类名+方法。API中有很多Java代码的模板,程序员可以通过导入包来使用这些代码,而不必自己每次重新再写一遍。3、在自己的程序中调用Java API 提供的程序,也需要导入对应的包(java.lang除外)2、访问其他包下的程序,必须要导入该包。
2023-10-06 08:00:00
973
原创 Java自学(三)面向对象编程
比如一个学生对象,他的属性有姓名、学号、成绩......他的行为有上课、吃饭、睡觉.......将一个对象及其行为封装起来便于描述表达,这就是面向对象的思想。构造器就类似于C++的构造函数,你不显示的写的话编译器会自动生成一个默认的无参构造器,要是你显示写了一个带参构造器,就不会自动生成,这时最好再自己加一个无参构造器。先在右边创建一个学生类,其成员变量有name, ID, grade,成员方法有分别获取3个属性的3种方法。在成员变量初始化时可以赋初始值,当然这么做没有意义,默认一开始成员变量是有初值的。
2023-09-30 08:54:35
192
1
原创 Java自学(二)
引用类型(这里的数组),传参传的是数组名,也就是首元素地址,Change函数接收到的就是首元素地址,在函数内部改变数组元素的值时,当然也是改变此处地址所存元素的值,外部实参也会随之改变。形参是实参的一份数据拷贝,改变形参对外部实参没有任何影响。基本类型传参,形参一般不会改变实参。引用类型传参形参的改变对实参有影响。
2023-09-28 19:13:54
170
原创 Java实验案例(一)
首先输入的是字符串,在字符串中改变每一位数字并不方便,于是我设置了一个字符数组接收字符串,对每一位的数字进行算术运算字符并不好处理,于是我设置了一个整型临时变量,循环地处理每一位的算术运算,再将算好的整型数字转化成字符放到字符数组中去。可以将初始红包的顺序打乱,也就是将数组中的数据顺序打乱,然后根据先来后到分配给抢红包的用户,这样有多少个红包就是分发多少次,不会出现重复查找效率低下的情况。这种方案就是先建立一个判断是否为素数的方法,来一个数就放到该方法中判断,更加方便,也更贴近工作中编程的思想。
2023-09-23 16:56:51
462
原创 Mosh Java课程自学(一)
很多人第一门语言接触的是C,相比于Java来说有明显的不同,毕竟C是面向过程的编程语言,而Java是面向对象的编程语言。已经存储在内存的字符串是无法改变的,比如用.toUpperCase /.toLowerCase取得字符串的大/小写子串,改变的不是原始字符串,而是返回了一个新的串。类是一个抽象的概念,它是一个宏观的概念,而对象是它的实例,也就是具象化,比如说水果和苹果,家具和桌椅之间的关系。基本类型开辟的空间在栈上,而引用类型开辟的空间在堆上,实际上是将对象的地址赋值过去了,这也是很大的一个差异。
2023-09-18 14:38:55
159
原创 初学python(一)
尤其是在多人开发中更是如此,当一个大型项目使用动态类型,而他又可以随时改变类型,会造成很多麻烦,所以一般刚创业的小公司会多使用python开发,因为简单好上手开发快,但大中型企业就不会用python做底层框架了。而在Java、C++中,int类型范围是 -21亿~ +21亿,要想表示更大的范围,就需要用到long, longlong等类型,相对的,,和Java中的double类型一样大,也就是说,python中的float就等于Java中的双精度浮点数double,这种思想降低了我们的学习成本,做了简化。
2023-09-08 13:25:07
3328
2
原创 万里长征——基础IO
stdout属于父进程,发生写时拷贝会将3条在缓冲区的信息拷贝刷新到显示器,另一个进程随后退出再次刷新缓冲区,将3条信息以及write打印信息一同刷新到显示器,这就是为什么会出现两次打印7条语句的原因,也证明了上面缓冲区位置的问题。所以关闭某个表中的文件,其实是将指针的指向改变,不再指向原来的位置。fprintf(stdout),系统找的是fd为1的对应的文件,一开始fd为1的stdout对应的是显示器,fd本身没有改变,改变的是指向,现在指向的是新文件,系统还是去找fd:1,所以写入的是新文件。
2023-03-10 08:00:00
440
原创 C语言与Linux系统文件操作函数大全
第一个参数fd:文件描述符,代表要写入的文件;第二个参数buf,要写入的数据缓冲区,注意void*,按字节写入;第一个是指针ptr,指向缓冲区,第二个是要读取的数据的基本单元大小;off_t :指示文件偏移量,32位下为long类型,默认为32位整数,64位下为long long,64位整数。读取成功返回读取到的基本单元个数,若失败或者读到文件末尾返回0,个数
2023-02-23 08:30:00
1220
1
原创 Linux下的进程控制
当子进程要改变对应的数据时,操作系统会进行写时拷贝,将对应数据拷贝给另一块空间,让子进程页表指向新的空间,再更改数据,同理代码也是一样,可以写时拷贝,于是这样就保证了进程的独立性,不会互相影响。我们fork进程,子进程执行cd命令,子进程有自己的工作目录,cd更改的是子进程的目录,而子进程执行完了就被回收了,shell(父进程)继续运行下去,所以工作目录不会变。一个子进程退出的时候变成僵尸状态,它的代码和数据是不会被操作系统保留的,但是它的PCB及退出信息会被保留下来,等待被父进程接收。
2023-02-18 18:30:17
777
原创 进程地址空间
当修改a的值,物理内存存储的值也被改变。————因为进程具有独立性,当一个进程对被共享的数据进行修改时会破坏独立性,影响其他共享数据的进程,所以为了让进程改变数据的同时不破坏独立性,操作系统将该进程的页表映射更改,所以产生了虚拟地址相同,但对应值不同的现象。磁盘上的可执行程序里面有一个main函数,其内部调用了fun函数,并且fun函数的地址是0x1122,main函数的地址是0xFEE0, 程序也有全局数据区,代码区等,32位平台下和上面讲的虚拟地址空间编址方式一样是以32位编址的。
2023-02-13 13:44:28
426
原创 进程的概念、状态、优先级、切换
当进程标识阻塞状态后,可能会很长时间都在等待,不仅要等硬件资源,还要再进runqueue排队,这时它加载到内存的数据就会一直卡在那,对于内存来说是个负担,操作系统要不断给内存腾空间,万一内存不够了就会无法响应卡住。当一个进程想要使用外设资源,但是其前面已经有其他进程占用外设时,它就会进入等待队列,操作系统看它暂时使用不了外设资源,就不会让它留在runqueue,当然操作系统很忙速度很快不会陪它一起等外设空闲,就把它塞到等待队列,当前面进程完事后再把它拉入runqueue。这时进程状态变为了T,暂停。
2023-02-07 08:00:00
441
原创 Linux环境变量和命令行参数
是命令行解释器bash的,bash是一个系统进程。环境变量具有全局属性,会被子进程继承下去,也就是说本来环境变量是定义给系统的,随着bash继承给子进程,子进程也具有了环境变量,所以说具有全局性。for循环中结束条件是env[i] ,因为env没有argc那样记录个数的参数,而env数组的最后一个是NULL,当数组获取环境变量到最后一个是NULL也就结束了。getenv函数的参数是环境变量的名字,返回值是环境变量的内容,环境变量用了语言上变量的概念,USER=bc有等号,左边是环境变量名右边是内容。
2023-02-07 08:00:00
566
原创 操作系统、计算机体系结构
先调用库函数,访问操作系统接口,找到对应显示器驱动,再访问到硬件显示器,然后返回信息最终打印到屏幕,实际上工作都是操作系统给我们完成的。现在就可以解答以前的一个问题了,我们编写代码,调用函数是如何显示到屏幕的,是如何访问写入磁盘的,以及我们的操作是在整个计算机系统的那个位置?先创建一个员工类,将每个员工的数据描述保存到链表中,每个员工就是一个节点,再以链表形式串联起来,这就是管理方法。操作系统也是一个道理,在提供服务的同时要保证安全,所以它不会让用户随便访问下层软件和硬件,会将用户挡在外面。
2023-02-06 08:00:00
471
原创 冯·诺依曼体系结构
看上去CPU好像很智能,其实它很“笨”,它只能被动地接收别人给它的指令和数据,然后将这些全部存储起来计算,比如给CPU 1+1让它计算,它先一一获取‘1’ ‘+’ ‘1’ 存储起来,然后再计算。内存会提前把外存的数据加载进来,方便CPU读取,CPU的数据也会写给内存,内存再定期将要永久存储的数据刷新到外存上。如图所示,你在电脑上用键盘输入信息,加载到内存,经过CPU将信息加密,再输入给网卡,由网卡输出发送到网络(网络中间过程不赘述),然后由张三电脑的网卡接收,再加载到内存,由CPU解密信息,打印到显示器。
2023-02-05 08:00:00
458
原创 gdb工具的使用
Linux和windows同为操作系统,前者是命令行形式,后者使用图形化界面形式,两者虽然形式不同但操作确实对应的。Windows下的调试方法大家应该都很熟悉了,今天就来介绍一下gdb,作为Linux下的调试工具,它的功能也很强大。在Windows下调试,以VS为例,F5是调试运行,如果碰到断点就停下来,没断点就运行到结尾。如果既不想在函数内逐语句调试,也不想跳到下一个断点,只想跑完当前这个函数,用。进入循环后,p +变量就可以打印该变量的值,但是下一次循环则不会继续显示。
2023-02-04 08:00:00
634
原创 浅析git
兹,想必大家对这个名字并不陌生,他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。兹开发了Linux之后,因为Linux是开源项目,他每天会收到大量来自世界各地的由高级程序员发来的关于Linux的改进代码,而他需要对这些意见进行整合,将大量代码筛选合并,对Linux版本升级维护。git commit -m '日志' : 提交,将刚刚add到临时区域的文件提交到本地仓库的.git目录下,也就是将新文件合并到本地仓库。
2023-02-03 08:00:00
229
1
原创 Linux下的动静态库及链接
我们只是调用了库里的函数,并没有实现该函数,在链接的过程中,我们的代码和库中的结合起来(调用+实现)才生成可执行程序。使用静态库的时候,链接过程不是我们写的代码与库产生关联,而是将我们的代码需要的库函数实现拷贝一份拿过来,这样就完成了静态链接,所以库不能用了不影响静态库。如果我们现在安装的所有软件突然变大了100倍,比如下的10G游戏,变成了1000G,那还怎么运行,尤其是还要加载到内存,届时内存加载2、3个文件就扛不住了。用动态库的程序很多,但是库只有一个,所有C语言写的程序,都不会出现重复的库代码。
2023-02-02 08:00:00
643
原创 Linux下的安装环境
———既然是Linux社区写出的操作系统,服务器也是自己的,软件还是自家提供的,所以在Linux中,内置服务器和应用对应的下载链接即可。2、有些软件没有被纳入centos、Ubtntu、kail等相关生态平台的官方软件集合中,所谓官方软件集合就是CentOS-Base这个路径下能下载到的软件,官方的软件一般都是成熟的、安全的、稳定的,还有一些软件是非官方的,像sl,这些软件需要经过时间的检验确定可靠才能被纳入官方软件集合,所以说非官方软件集合是官方的储备池。二是存在防火墙的问题,可能会拦截信号。
2023-02-01 08:00:00
399
原创 浅谈操作系统
举个例子,在计算机公司中,底下的每个码农就相当于硬件,接受着来自上级管理者(设备驱动)的任务,因为公司老总(操作系统)不会直接下达命令给每个码农,一个一个和他们说今天你要完成什么任务,而是会先交代给下面的管理者,再让他们分配任务给码农(硬件)。通俗来讲,操作系统就是一个软件,只是这个软件与我们平时说的软件有所不同,平时讲的QQ、微信等软件是应用软件,也就是用户使用的上层软件,而操作系统是管理软件、硬件的一种系统软件。的结构,信息存储在文件中,文件主要存储在计算机的内部硬盘里,在目录的分层结构中组织文件。
2023-01-26 10:36:56
670
原创 list底层实现
list是非常常用的一个容器,数据结构是链表,数据空间是以链式结构存储的,物理空间上不一定是连续的,不像vector物理空间是连续的,可通过下标访问,在list中有可能排在后面的数据物理地址比在排在前面的数据小,所以它不方便通过下标访问,但它也具有它才有的特性,让我们来学习一下list的底层实现吧。&st是实参的别名,是迭代器对象,const list& st 作为const对象只能调用const迭代器,而我们此时还没有实现const迭代器,所以先把const去掉保证编译通过。
2023-01-12 08:00:00
911
原创 迭代器深入理解
可以看到刚进函数 it 的地址是00 79 f8 50(小端存储,高位存高地址),对应list对象st的头结点的地址也是00 79 f8 50,下面 it++,st头结点要指向下一个节点的位置,也就是_head->_next->_next,地址是。begin()返回的是头结点的下一个位置,也就是第一个有效数据的位置。复杂的容器底层访问数据的时候是比较复杂的,像set访问数据实际就是搜索树,而我们在外部使用迭代器访问的时候根本不会察觉底层这些麻烦的访问,因为外部都是很统一的形式,仅仅调用迭代器就可以实现。
2023-01-11 08:00:00
277
原创 leetcode刷题精讲————17.电话号码的字母组合
之前说了,给的数字字符串和对应字母是有映射关系的,我们创建一个string,在里面存好各个数字对应的字母字符串,设定变量 i 对其访问,i 映射数字--->数字映射字母字符串,这样就可以通过digits访问字符串了。先从节点a走,到节点d,再往下走到g,碰到结束条件返回上一层回到d,再走另一条路到h,同样碰到结束条件返回到d,再走下一条路到 i,碰到结束条件返回d,此时最下层遍历完毕再返回上一层到a,a再走另一条路e.......就是这么个遍历过程,如此就可以得到所有组合结果。
2023-01-10 08:00:00
637
原创 vector底层实现及深层次拷贝问题
对于vector模型要有一定理解,外部的大类型是vector,< >里面的类型是vector,所以先从内部开始创建,vector v(4,1) 构造一个{1,1,1,1}的一维数组,里面构建好了,在外面通过push_back插入,相当于插入一个一个这样的一维数组,这样就构建了二维数组,push_back多少次就相当于有多少行,里面4相当于列。首先是vector定义的模板参数T和Alloc,这是空间配置器是一种底层实现机制,使用角度不用管。
2023-01-08 09:49:52
1623
原创 vector迭代器失效问题
———对于越界编译器是抽查,并不是一定能检查出来的,临近位置可能检查的出来,但大概率还是检查不出来。————这是由于VS和Linux两者使用的库不一样,VS是PJ版,检查比较严格,它的迭代器实现不是纯指针实现,而是将迭代器封装成一个类,并做了很多处理(包括很多操作符重载);实际上这里是不可以再使用 it 的,此时 it 其实已经越界了,是个野指针,和上面问题一样,迭代器已经失效。在扩容的时候,_start旧空间被释放了,而pos迭代器是指向_start的,所以释放完后pos就变成了野指针。
2023-01-07 15:29:45
1224
原创 vector使用指南
因此两者之间是有差异的,不能代替。————因为这个接口在每个容器中实现的方式都是一样的,都是遍历迭代器,找到了就返回对应的迭代器位置,所以不会特地在每个容器中都写一个find,而是将它拉出来写个模板,使得每个容器都能直接使用。第三个差异在于接口上,它们之间的接口也有很大区别,功能的不同,实现上的不同等等。string是早期设计的,与后面容器的实现有时代的隔阂,string的接口庞杂繁复,数量是vector的一倍,其实有很多接口是没有什么意义的或者基本不会使用的,但由于向前兼容的特性这些接口都保留了下来。
2023-01-07 08:00:00
2318
原创 string(四)————底层实现
注意成员变量声明的顺序,为了尽可能减少strlen函数的调用,先对_capacity初始化,再对_size和_str初始化,因为成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后 次序无关,所以要先声明_capacity,再声明其他的。因为字符串涉及到 '\0' 问题,要多给一个空间储存 '\0',所以在开辟空间时给_str 多开一个字节空间,capacity不包含 '\0' 的大小,表示有效数据的容量。同样的,有查找单个字符的功能,还有查找字符串的功能。
2023-01-01 08:00:00
651
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人