JS中this的指向问题
在 Java 中,this 关键字指向的是当前对象的引用,对于熟悉 Java 的人来说是再简单不过的东西,因此我一度以为 JavaScript 也是如此,直到有个前辈对我讲起 JavaScript 中 this 的引用问题,他问了几个 this 的问题,我一个也没回答对,显然我对 JS 的了解还只停留在皮毛。
1. this 与我以往接触的 Java 和 C++ 相比,this 关键字在 JavaScript 稍有不同,并且严格模式与非严格模式也存在一定差异,在ES6的箭头函数中,this 的指向又会有一定差异,导致一些菜鸟接触 JavaScript 的 this 关键字时很容易搞混 this 绑定的对象。
this 指向什么,并不单纯取决于在哪个对象中被调用,而是完全取决于在什么地方以什么方式调用
2. this 绑定规则通过参考网上的资料,this的绑定规则大致分为 4 种:
默认绑定
隐形绑定
显性绑定
new 绑定
优先级从低到高。
先看看在全局环境下 this 的指向:
1console.log(this) //Window
结果显示在不进行 ...
wait()方法为什么要放在同步块中
下面是一段简单的wait()方法调用的代码(并无实际意义):
123synchronized(obj){ obj.wait();}
当一个线程调用了Object对象的wait()方法时,该线程会释放当前的锁对象,同时进入等待对象资源的状态,只有调用了notify()方法或者notifyAll()方法才能唤醒(随机唤醒,未必被唤醒)。
wait()方法应该只在获取了锁的对象之后才去调用,即wait()方法应该放在同步块中。如果不放在同步块中会怎样呢?
12345678910public class Test { @org.junit.Test public void test() { try { new Object().wait(); } catch (InterruptedException e) { e.printStackTrace(); } }}
...
Java数值类型提升
今天遇到一个很有意思的问题:
12Object i = 1 == 1 ? new Integer(3) : new Float(1);System.out.println(i);
显然1==1是成立的,所以应该执行new Integer(3),按我自己的想法,最后的结果应该是3,但是显然这个问题没有这么简单(我好菜啊,无能狂怒中……)。
我运行了这段代码,惊讶的发现结果既不是3,更不是1.0,而是3.0,显然是Integer类型向Float类型发生了转换。之后我又做了一个实验:
12Object i = 1 == 1 ? new Float(3) : new Double(1);System.out.println(i.getClass());
最后输出的是一个Double类型。
之后我上网查阅了一些资料,发现这是一个数值类型提升的机制,数值提升用于将算术运算中的操作数转换为一个相同的类型以便于运算。
自动类型转换的前提是两种类型是彼此兼容的,并且转换的目的类型占的空间范围一定要大于转化的原类型。
正向转换:由低字节向高字节自动转换
...
B+树总结
B+ 树是一种常用的经典数据结构。InnoDB 和 MyISAM的的数据结构就是基于B+树,因此这里对 B+ 树进行一次总结。
B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
定义B+ 树允许每个节点有M-1个子节点(M为树的阶层)。
根节点至少有两个子节点
每个节点有M-1个key,并且以升序排列
位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
其它节点至少有M/2个子节点
下图为B+树的插入
B+ 树与 B 树的区别
B树的每个节点都存储了数据,并且叶子节点为null
B+树只有叶子节点存储数据,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。
B+树增加了顺序访问的指针,每个叶子节点增加一个指向相邻叶子节点的指针。
B树是一个二叉结构的树,而B+树则是一个多叉树结构,使得这棵树相对来说更加“矮胖”。这样的优势是在查找时减少磁盘I/O的次数。相对于内存存取,磁盘I/O的消耗更高。
MyISAM 与B+树MyISAM 引擎 ...
Http状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
一下是常见的状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
状态码分类HTTP状态码由3个十进制数组成,其中第一个十进制数定义了状态码的类型。HTTP状态码共分为五种类型:
分类
分类描述
1**
信息,服务器收到请求,需要请求者继续执行操作
2**
成功,操作被成功接收并处理
3**
重定向,需要进一步操作以完成请求
4**
客户端错误,请求包含语法错误或无法完成请求
5**
服务端错误,服务器在请求过程中发生了错误
HTTP状态码列表
状态码
状态码英文
中文描述
100
Continue
继续。客户端应继续请求
101
Switching Protocols
切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换 ...
面经--神策数据电话一面
面试之前,我又特地去了解一下这家公司,据说这家公司18年秋招的 hc 就非常少,春招我估计只有个位数的 hc,但是我还是抱着面经++的心态来面对这次面试。
本来说好的是4:30开始面试,35分来电话的时候我心里一惊,然后告诉我我要拖到五点,难道这家公司多出几个面试官的钱都出不起吗。很快五点就到了,早就听闻面试官是个女的,果不其然,虽然我对程序媛并没什么感觉。
一开始,并没有让我自我介绍,面试官似乎并不怎么看我的简历。下面开始说问到的问题:
HashMap 的数据结构
这个稍微看过源码的人都应该知道是 数组+链表,Java8开始引入了红黑树,因此1.8之后是数组+链表+红黑树
让我实现HashMap
我就大概说了一下数据结构,put方法大概说了一下,然后面试官就没有让我往下说了,感觉自己表达可能的并不是很清楚。
到这里开始问了JVM,首先问的是内存模型
内存模型我就答了虚拟机栈,本地方法栈,Java堆和方法区,面试官并没有问的特别深。
Java new出来的对象存放在哪里
这题已经是很基础了,我答的是存在堆里面
垃圾收集算法
标记清除
复制
标 ...
数据库设计的五大范式
第一范式(1NF) 对于一张二维表,最基本的要求就是:每一个分量必须是不可分的数据项,也就是说同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,强调表的原子性。满足了这个条件的关系表就属于第一范式。
若要满足第一范式,可将上述表重构为下表:
编号
品名
进货数量
进货单价
销售数量
销售单价
备注
但如果仅仅只是满足了1NF,会出现数据大量的冗余,例如下表:
第二范式(2NF)当关系表满足第一范式时,并且所有的非主属性都完全依赖于关键字。从这个定义可以看出,第二范式不存在非主属性对于部分候选关键字的部分依赖,不过允许非主属性之间存在着传递依赖
学号
姓名
年龄
课程名称
成绩
学分
上表不满足第二范式,因为存在如下关系:
(课程名称)→(学分)
(学号)→(姓名,年龄)
由于不满足2NF,这个选课关系表会存在如下问题:
数据冗余:同一个课程被n个同学选到,那么学分这个属性就会重复n-1行。
更新异常:若调整了某门课程的学分,数据表中所有相关行的学分都要修改,否则会出现一门课程学分不同的情况。
...
浅谈TCP协议
TCP全称是 Transmission Control Protocol,是传输控制协议。TCP在网络七层模型中的传输层。
我们程序的数据会首先进入TCP的segment中,然后TCP的segment会打到IP的package中,然后再到以太网的frame中,传到对端,各层解析自己的协议,然后把数据交由更高层的协议处理。
TCP头部格式想要了解TCP,那就免不了需要熟悉TCP的头部
我们来分析一下TCP头部的几个字段的含义和作用
源端口/目的端口: 各占2个字节,表示数据从哪个进程来,去往哪个进程。
序号:占4个字节,TCP连接中传送的数据每一个字节都会上一个序号,序号字段的值就是本报文段发送的==数据的第一个字节的序号== 。
确认号:占4个字节,是期望收到对方下一个报文段的序号。
数据偏移:占4个字节,它指出TCP报文段的数据距离TCP报文段的起始处有多远(首部长度)。
紧急URG:当URG=1时,表明紧急指针字段有效。它告系统此报文段中有应急数据,应优先传送。
确认ACK:只有当ACK=1时,确认号才有效,否则无效。
PSH:用来提示接收端应用程序立刻将数据从tcp ...
浅谈IP协议
前两天做了几道关于计算机网络的习题,说来惭愧,明明半年多前还在学,现在却忘得差不多了。因此在这里做一下整理,首先从 IP协议开始。
概述IP协议提供的是不可靠、无连接的数据报传送服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。
协议头格式
字段
描述
4位版本号
指定IP协议的版本, 对于IPv4来说,就是4
4位头部长度
IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节
8位服务类型
3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置0). 4位TOS(最小延时, 最大吞吐量, 最高可靠性, 最小成本),只能选其一. ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要
16位总长度
唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id ...
动态代理
JDK 内置的 Proxy 实现动态代理JDK内置的动态代理只能够代理实现接口的类,因此需要先提供一个接口
1234public interface Interface { void doSomething(); void somethingElse(String arg);}
实现类:
1234567891011public class RealObject implements Interface { @Override public void doSomething() { System.out.println("doSomething"); } @Override public void somethingElse(String arg) { System.out.println("something " + arg); }}
实现一个动态代理类,该类实现接口 InvocationHandler
12345678910111 ...