赞
踩
1.性质不同
(1)final为关键字;
(2)finalize()为方法;
(3)finally为为区块标志,用于try语句中;
2. 作用
(1)final为用于标识常量的关键字,final标识的关键字存储在常量池中
被final修饰的类不能被继承;修饰的方法不能被重写;修饰的变量不能被改变
(2)finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象 进行垃圾回收;
(3)finally{}用于标识代码块,与try{ }进行配合,不论try中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行
1.继承不同
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
2.允不允许NULL值
HashMap不是线程安全的:HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许;
3.线程安全不一样
Hashtable 中的方法是同步的,而HashMap中的方法在默认情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
4.方法
HashMap有containsvalue和containsKey方法;HashTable有contains方法
5.效率
HashMap效率相对Hashtable高一点
参考:HashMap与HashTable的区别 - jack_ou - 博客园 (cnblogs.com)
同步
A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去
异步
A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍然请求的到,A线程无需等待
特点
显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个进程崩溃,但没有同步机制的存在,性能会有所提升
1、HashMap是基于哈希表实现的,而哈希表的底层是数组加上链表的形式。
2、数组内存连续查询效率高,链表内存分散增删改效率高,哈希表采用此种存储数据的形式极大的提高操作数据的效率。
3、哈希表的默认长度是16,编号从0开始。图中编号0-4的长方形代表了一个数组,箭头指向的代表了一个一个的链表。
线程:操作系统中能够进行最小调度的单位——并发、并行的概念
并发:在同一时刻,多个指令在单个CPU上交替进行
并行:在同一时刻,多个指令在多个CPU上同时进行
进程:程序执行的基本实体
Java中实现多进程:
Java中没有直接支持多进程的API,但可以通过Runtime类或ProcessBuilder类来创建和执行外部进程。
需要注意的是:在多线程和多进程实现的过程中,要注意死锁和竞争等问题
死锁:线程中多个锁之间嵌套容易引发死锁
如何保证线程安全
① 同步代码块:把操作共享的数据的代码锁起来【排队卫生间案例(关门上锁)】
② 同步方法:就是把synchronized关键字加到方法上
③ Lock锁机制, 通过创建Lock对象,采用lock()加锁,unlock()解锁,来保护指定的代码块
多态是面向对象三大特征【封装、继承、多态】。同一行为,通过不同的子类,可以体现出不同的形态。多态的前提:有继承关系,重写父类的方法
同一个方法调用时,由于对象不同可能会有不同的行为【例如:同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。】
举例:
例如Person类 子类有Student、teacher类
在实例化时可以这样写:
Person teacher = new Teacher(XXX);
定义和实现:
多继承:
构造方法:
成员变量:
接口中只能包含常量(被public static final
修饰)和抽象方法,不能包含实例变量。
抽象类可以包含实例变量,常量,抽象方法和具体方法。
目的:
接口用于定义一种规范或契约,它规定了类需要提供的方法,并且提供了一种多态性的机制。
抽象类用于表示一种抽象概念,它提供了一些通用的方法和成员变量,但是具体实现需要由子类提供
1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
2、Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。
个人理解:
方便管理内存,方便开发人员【c++中没有回收机制】
可达性分析算法:没有被GC roots引用的对象都是可以被回收的对象
哪些对象可以作为GC root?
Marking-Sweep(标记清除法):将没有被引用的对象西安标记出来,然后在清除【原因:没有进行对对象的移动】,会造成碎片,可能造成内存不足
Marking-Compat(标记整理法):先标记,将可用的对象移到一边,将剩余的删除,没有碎片,有大量的空间
复制算法: 将内存按一定的比例分为对象面和空闲面
分代原因:生命周期不一样,可以很好的进行内存管理
【注意区分python中 == 和 is 的区别】
1."=="运算符用于比较两个对象的引用是否指向内存中的同一个地址,也就是比较它们是否是同一个对象的实例。如果两个对象的引用指向相同的内存地址,则"=="返回true,否则返回false。
2."equals"方法是Object类中定义的一个方法,用于比较两个对象的内容是否相等。通常情况下,如果没有对该方法进行重写,它与"=="的作用是一样的,即比较两个对象的引用是否指向内存中的同一个地址。但是,可以通过在具体类中重写"equals"方法来改变对象相等的定义,使其比较对象的内容而不是引用。
在子类中重写父类的实例获取方法
构建一个父类,确保构造方法是私有的,以防止外部类直接实例化它
子类利用entends继承父类,重写父类的方法
以上可以实现单例继承
重写 (Override):【子类重写父类的方法】
重载 (Overload):【重载用于在同一个类中定义多个相同名称的方法】
数组(Array):
链表(Linked List):
总结:
面向对象编程中:程序的主要组织单位是对象,它们封装了数据和行为;先定义车辆类:具有自己的属性和方法、然后在创建对象即实例化类、再调用相关的方法
面向过程编程中:程序主要由一系列函数或过程组成,以解决问题;定义一系列函数来执行造车的过程,例如创建车辆,启动车辆,加速,刹车等
面向对象的方法更加模块化和灵活,因为它将数据和行为封装在对象中,并通过对象之间的交互来完成任务。而面向过程的方法则更加侧重于步骤和流程,将任务分解为一系列的函数或过程来执行。
引用计数器+一个循环垃圾收集器来工作
垃圾回收器是一段独立的代码,用来寻找引用计数为0的对象
- sys.getrefcount(XXX)
- # 使用上述方法查看引用计数
计数器增加情况:
1.对象被创建
2.或另外的别名被创建
3.被作为参数传递给函数
4.成为容器对象的第一个元素
计数器减少情况:
1.本地引用离开了作用范围
2.对象的别名被显式销毁
3.对象的一个别名被赋值给其他对象
4.对象被从一个窗口对象中移除
5.窗口对象本身被销毁
__del__语句:
析构方法,当对象内存被释放时,自动执行(开发人员无需关心内存分配和释放)
python中的数据结构有:列表 元组 集合 字典
不可变的数据结构:元组
==
运算符用于比较对象的值是否相等。当使用 ==
比较两个对象时,Python 会检查它们的值是否相同,即使它们可能是不同的对象类型。
is
运算符用于比较对象的身份是否相同,即比较对象是否是同一个对象。当使用 is
运算符比较两个对象时,Python 实际上是比较它们在内存中的地址是否相同,即它们是否指向同一个内存地址。
简而言之,==
比较对象的值,而 is
比较对象的身份。在大多数情况下,使用 ==
来检查对象的值是否相等更为常见,而使用 is
来检查对象是否是同一个实例通常用于检查对象的身份是否相同。
可变性:
语法表示:
[ ]
来表示,例如:[1, 2, 3]
。( )
来表示,例如:(1, 2, 3)
。注意,即使元组只有一个元素,也需要在元素后面加上逗号,例如:(1,)
。性能:
适用场景:
is
首先索引是提升查询速度的一种数据结构
索引失效的原因:
1.查询条件中有or: 创建一个user 表和一个job表,执行如下sql
explain SELECT name,age,address FROM user where name = '光头强' or age=9
上述SQL中name字段上有索引index_name,走的是全表扫描
2.like查询是以%开头,如果想让以‘%’开头仍然使用索引,则需要使用覆盖索引,即只查询带索引字段的列,如下所示:
explain SELECT name FROM user where name like '%头强'
3.对查询的列上有运算或者函数的
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- explain SELECT name,age,address FROM user where name = 10
-
- --等价于 mysql有个类型转换规则就是将“字符串转换为数字”
- explain SELECT name,age,address FROM user where cast(name as signed)= 10
5.左连接查询或者右连接查询查询关联的字段编码格式不一样
例如user 表的name字段编码是utf8mb4,而job表的name字段编码为gbk
6.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
7.如果查询中没有用到联合索引的第一个字段,则不会走索引
8.连接查询中,按照优化器顺序的第一张表不会走索引【不懂】
联合索引的应用场景:
联合索引涉及到多个列,创建时顺序很重要,因为数据库会基于索引中列的顺序来优化查询。其适用场景包括:
一颗有N个节点的红黑树的高度最多不超过2log(n+1),查找效率较高,稳定 ; 选择红黑树作为查找、删除、插入的存储结构
通常用于数据库和操作系统中的索引和文件系统
所有的值这都出现在叶子点解,而内部节点(非叶子结点)仅用于索引,不实际存储数据,这样的设计使得B+树特别适合于系统中需要大量范围查询的场景
1.磁盘I/O效率:数据库存储在磁盘上,而磁盘访问速度远低于内存。B+树是一种多级索引结构,其树比较矮,这意味着每次磁盘I/O可以加载大量的节点。
2.查询效率较高:B+树通过减少访问节点的数量来优化查询操作,所有的值查询都在叶子节点上进行,并且叶子节点之间是相互链接的,这使得范围查询(如查找在某个区间内的所有记录)非常高效。红黑树等平衡二叉树在进行范围查询时可能需要频繁地遍历树的不同层级,效率较低。
3.空间利用率:B+树的设计使得每个节点都几乎完全填满,这提高了空间利用率。而二叉树结构中,每个节点只包含一个元素和两个子节点链接,这在大规模数据存储中可能导致较低的空间效率。
4.顺序访问优化:B+树的叶子节点之间通过指针相连,这为顺序访问和范围访问提供了很大的便利。在实际应用中,顺序访问数据的需求远远高于随机访问,B+树在这方面的优化使其更适合数据库索引的需求。
5.写操作优化:B+树的结构允许在分裂和合并节点时局部化更新,减少了对整个树结构的影响,从而提高了写操作的效率。而在红黑树等平衡二叉树中,插入和删除操作可能需要通过旋转来维持树的平衡,这在某些情况下可能会涉及到多个节点的调整。
- 红黑树的插入和删除操作可能需要进行颜色变换和旋转操作,这增加了实现的复杂性。特别是在频繁的插入删除操作场景下,这些操作可能会造成性能的下降。
-
- 红黑树的每个节点都需要额外存储一个颜色信息,这增加了内存占用。相比之下,B树和B+树的节点结构相对简单,能够更有效地利用内存空间。
-
- 红黑树在范围查询操作中可能需要进行中序遍历,而且遍历过程中的节点访问顺序是不确定的,这导致了范围查询的效率较低。
在where语句中使用最频繁的字段,如User表中字段id
联接语句中的连接字段
字段具有唯一性,(例如没有重复的值)
有序的字段在插入数据库过程中,仍能保持B+树的索引结构,不需要频繁更新索引文件,性能更好
不在经常被修改的字段上创建索引
区分度比较低的字段不建议创建索引【例如:用户表中的性别区分度比较低,不如生日字段适合创建索引】
过长的字段不适合创建索引,过长的字段会占用更多的空间,不适合创建索引
事务是一组操作的集合,不可分割的单位,事务会把所有的操作作为一个整体其一向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败。
事务的特性(ACID):
原子性:不可分割
一致性:事务完成时,必须使所有的数据都保持一致状态【事务前后的数据完整性要保持一致】
隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
永久性:事务一旦提交或回滚,他对数据库中的数据的改变就是永久的【事务一旦提交则不可逆,被持久话到数据库中】
- selsect *
- from Employee
- where salary = {
- select distinct salary
- from employee
- order by salary DESC
- limit 1 offset 1
-
- };
- -- limit 每页显示一行内容
- -- offset 从第几条记录开始显示 计数是从0开始的
- -- SELECT DISTINCT语句在SQL中用于返回唯一不同的值。当使用SELECT DISTINCT时,如果有多个相同的值
- -- 则这些值只会被列出一次。
- select *
- from employee
- where inDate = {
- select inDate
- from employee
- order by inDate DECS
- limit 1 offset 1
- }
例如:员工表中添加薪水列
- alter table employee
- add colum salary varchar(20)
-
-
- -- 写法二
- ALTER TABLE Employees
- ADD COLUMN Salary DECIMAL(10, 2) DEFAULT 0.00;
- --DECIMAL(10, 2)意味着这个数最多可以有10位数字,其中小数点后面最多有2位,适用于表示薪水等金额
数据库需要考虑多个方面,包括订单、用户、商家、商品、支付和评价等。为了简化,我们将重点放在核心的几个表上:用户(Users)、商家(Merchants)、商品(Products)、订单(Orders)和订单详情(OrderDetails)
INT
类型存储ID,VARCHAR
存储字符串,DECIMAL
存储金额。OrderId
、UserId
、MerchantId
等)创建索引以提高查询效率。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。