volatile
• 禁止了指令重排
• 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的
• 不保证原子性(线程不安全)只有synchronized才保证了原子性和可见性。
static关键字修饰方法的用法
被static修饰的方法叫做静态方法 如题中hello就是一个静态方法
静态方法的访问有两种:
1.直接使用“类名.”调用 Test.hello(); (一般都用第一种方法,让人一下就明白这是静态方法)
2.new 一个对象 ,“引用.” 的方式调用
使用这种方法,其实底层会转化为 "类名."调用的方式
本题中就用了第二种方法,虽然Test test = null
但是test.hello();------>Test.hello();
主机甲和主机乙间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300字节和500字节的有效载荷,第一个段的序列号为200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是?
确认序列号=原始序列号+TCP段的长度,所以第一次的确认序列号为200+300=500,第二次确认序列号为500+500=1000
HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null,与之对应的是Hashtable。
(注意大小写:不是HashTable),Hashtable不能将键和值设为null,否则运行时会报空指针异常错误)
标识符:
用来表示变量名,方法名,类名,数组名和文件名的有效字符序列。
也就是说,任何一个变量,常量,方法,对象和类都需要有名字,这些名字就是标识符。
规定如下:
(1)标识符可以由数字、字母、下划线或美元符号等组合而成。
(2)必须以字母、下划线或者美元符号开头,不能以数字开头路。
在JDK1.6的版本中,switch后面的括号里面只能放int类型的值,是只能放int类型,
但是放byte,short,char类型的也可以。
是因为byte,short,shar可以自动提升(自动类型转换)为int。
而不能放long型和String型。
当使用long型的时候,出现下面的错误
而在JDK1.7的版本中,switch中可以使用字串String。但仍不支持long型。
git命令合并代码:(1)git merge;(2)git pull;(3)git cherry-pick
git blame:执行该命令时,会逐行显示文件,并在每一行的行首显示commit号,提交者,最早的提交日期等
TCP/IP是Internet最基本的协议。TCP/IP采用四层结构来完成传输任务,其四层结构为网络接口层、网络层、传输层和应用层,各层都是通过呼叫其下一层所提供的网络完成自己,相对于OSI标准的七层结构,少了表示层、会话层和物理层
可重入函数可认为是可以被中断的函数,自动变量定义的时候才被创建,函数返回时,系统回收空间,他是的是局部作用域变量,不需要互斥量。可重入函数对全局变量才需要互斥量保护。
使用事务保证数据的一致性和完整性
Java单继承,多实现:一个类可以同时实现多个接口,但是只能继承自一个类,但它可以被多个类继承,也就是说一个类只有一个直接父类,但是可以有多个子类
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
通常,Java的异常(包括Exception和Error)分为 可查的异常(checked exceptions)和不可查的异常(unchecked exceptions) 。
可查异常(编译器要求必须处置的异常): 正确的程序在运行中,很容易出现的、情理可容的异常状况 。 可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常 状况,就必须采取某种方式进行处理。
除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。
Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。
运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
类加载过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。如图所示。
加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。以下陈述的内容都已HotSpot为基准。
类加载过程:
1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区
2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容
3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内
4, 加载静态内容:
4.1、把.class中的所有静态内容加载到方法区下的静态区域内
4.2、静态内容加载完成之后,对所有的静态变量进行默认初始化
4.3、所有的静态变量默认初始化完成之后,再进行显式初始化
4.4、当静态区域下的所有静态变量显式初始化完后,执行静态代码块
5,当静态区域下的静态代码块,执行完之后,整个类的加载就完成了。
final类中只能含有非抽象的方法;
对于abstract类的子类来说有两种途径,一种是实现其超类的所有abstract方法;或者是 //子类也声明为abstract类,将全部实现抽象方法的责任交给它的子类。
load是加载,top是规定要返回的目录的记录的数目! SUM() 函数返回数值列的总数(总额)
explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 explain语法:explain select … from … [where …] 例如:explain select * from news;
Java 运行时数据区可以分成 方法区、 堆、 栈、 程序计数器、 本地方法栈
堆:Java 对象, 线程之间共享的
栈:方法运行,每一个方法对应一个栈帧,每一个线程对应一个栈,
每个栈帧包括 操作数、局部变量表、指向运行时常量池的引用,方法返回地址、附加位区 所以是线程不共享
方法区(静态区):被虚拟机加载的类信息、静态(static)变量,常量(final),即时编译器编译后的代码等数据。运行常量池是方法区的一部分,class文件除了有类的版本、字段、接口、方法等描述信息之外,还有一项信息常量池保存编译期生成的字面量和符号引用。 线程之间共享的
程序计数器:指出某一个时候执行某一个指令、执行完毕之后要返回的位置,当执行的Java方法的时候,这里保存的当前执行的地址,如果执行的是本地方法的时候,那么程序计数器为空。线程不共享。
1、如何判断一个序列是不是堆?
把这个序列看成是数组型的二叉树,如果根节点是i,左子数是2i,右子数是2i+1。
2、堆分为最大堆和最小堆。
(1)最大堆
以{100,60,70,50,32,65}为例分析:
最大堆中所有父节点都比左子树大,比右子数小,画成堆形式如下:
100
/ \
60 70
/ \ /
50 32 65
(2)最小堆
比如{32,50,60,70,100,65}为例分析:
最小堆中所有父节点都比左子树小,比右子数大,画成堆形式如下:
32
/ \
50 60
/ \ /
70 100 65
选择排序,堆排序,希尔排序,快速排序不稳定
JVM是Java Virtual Machine(Java 虚拟机 )的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
简单来看,虚拟机本质就是一个进程。模拟平台操作的一个进程
super的使用有三种情况:第一,用来访问父类被隐藏的成员变量,如super.variable;第二,用来调用父类中被重载的方法,如super.Method([paramlist]);第三,用来调用父类的构造函数,如super([paramlist])。
java的字符类型采用的是 Unicode编码方案,每个Unicode码占用(16)个比特位。
javac.exe是编译.java文件
java.exe是执行编译好的.class文件
javadoc.exe是生成Java说明文档
jdb.exe是Java调试器
javaprof.exe是剖析工具
synchronized关键字是同步代码块关键字, 对对象加互斥锁
synchronized:
用来给对象和方法或者代码块加锁. 当它锁定一个方法或者一个代码块的时候, 同一时刻最多只有一个线程执行这个段代码
volatile:
用来确保将变量的更新操作通知到其他线程, 当把变量声明为volatile类型后, 编译器与运行时都会注意到这个变量是共享的, 因此不会将该变量上的操作与其他内存操作一起重排序. 然而, 在访问volatile变量时, 不会执行加锁操作, 因此也就不会使执行线程阻塞, 因此, volatile变量是一种比synchronized关键字更轻量级的同步机制
serialize:
Java对象序列化为二进制文件
static:
修饰变量, 方法, 静态代码块
静态变量:
由static修饰的变量称为静态变量
静态变量属于类, 而不属于某个类
静态变量的副本只有一个
静态方法:
在静态方法中只能调用静态变量和静态方法
在非晶态方法中, 可以调用静态方法或者变量
在静态方法中, 可以调用静态方法或者变量
在非静态方法中, 可以调用静态方法或者变量
在静态方法中不能使用this和super关键字
静态代码块:
用来给静态成员变量初始化
使用super()或者this()方法是必须放在构造函数的第一行
由于this函数指向的构造函数默认有super()方法,所以规定this()和super()不能同时出现在一个构造函数中。
因为staic方法或者语句块没有实例时可以使用,而此时不需要构造实例,所以不能用this()和super()