jvm、java、js、mysql、python面试知识点(记录)

1.静态块在类被加载时就会被调用。不管先后顺序,都会在main()方法执行之前执行。
2.初始化顺序:静态对象(静态只初始化一次)-父类优先于子类-按成员变量定义的顺序初始化
3.成员变量、静态变量(全局变量)、局部变量
4.构造函数用来在对象实例化时初始化对象的成员变量。
构造函数不能被继承,但是可以被重载,可以定义多个构造函数。
子类可以通过super来显式的调用父类的构造函数。
5.接口的作用域修饰符都是public
6.实现clone的类首先要继承Cloneable接口。
在clone方法中调用super.clone()
当类中包含一些非基本的数据类型时,需要用到深复制,在对对象使用clone()之后,需要带对对象中的非基本数据类型的属性再次使用clone()。
7.反射机制:非常重要的机制是,可以在运行时动态的创建类的对象。
8.创建对象的方法(4种):
1).通过new实例化对象
2).通过反射机制创 建对象
3).通过clone()方法创建对象
4).通过反序列化的方式创建对象
9.组合和继承
继承:
class English{}
cless A extends English{}
组合:
class a{}
cless A extends English{
private a zimu = new a();
}
10.多态(重载和覆盖):
类中的方法才有多态的概念,类中的成员变量,没有多态的概念。
函数不能以返回值来区分。
11.抽象类、接口:
抽象方法不能有方法体,同理也不能有大括号。
abstract不能修饰属性。
final修饰常量,常量在定义的时候必须初始化。
12.内部类:
非静态内部类不能有静态成员。
静态内部类不能访问外部类的非静态成员。
13.this与super的区别:
this:区分对象的成员变量与方法的形参。
super:访问父类的方法或成员变量。
当子类构造函数需要调用父类构造函数时,super必须为构造函数的第一条语句。
14. final :修饰 表示 属性不可变、方法不可覆盖、类不可被继承
finally:一定被执行。一般用在异常处理,释放资源
finalize:
15. static: 单例模式的运用。(一种运用)
成员函数内部不能定义static变量。
static成员变量、static成员方法、static代码块、static内部类
16. switch语句 在执行case时 记住加break,否则会不管判断条件 顺序执行。
17. instanceof:判断 前者是否为后者的一个实例
18. 当一个类被strictfp(精确浮点数)修饰时,所有方法都会自动被strictfp修饰
19. java语言提供两种不同的类型,引用类和原始类。
20. 隐式的数据类型转换:低精度向高精度转换。byte short char int long float double
21. math方法:
round:增加0.5 向下取整 返回值int类型
ceil:向上取整 返回double类型
floor:向下取整 返回double类型
22.字符串会重置equals方法
23.异常是指程序在运行时(非编译时)所发生的非正常或错误。
24.流:字节流和字符流(处理数据类型不同)
25.当代码运行时:首先执行父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。
26.start是开启线程,run是线程的执行体,run是线程执行的入口。
CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程。前者是让一组线程相互等待到某一个状态再执行。后者是一个线程等待其他线程结束再执行。
Callable中的call比Runnable中的run厉害就厉害在有返回值和可以抛出异常。同时这个返回值和线程池一起用的时候可以返回一个异步对象Future。
start是把线程从new变成了runnable
27.x修饰符为 static 所以x为类变量,即对于所有的实例来说,他们访问的x为同一个x,类变量存储在方法区,不属于每个实例的私有,
28.ArrayList内部是动态数组实现,在增加空间时会复制全部数据到新的容量大一些的数组中。而LinkedList内部为双向链表,可以按需分配空间,扩展容量简单,因此LinkedList用时少。
29.原子性:事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现);
一致性:事务前后的数据完整性要保持一致(由DBMS的完整性子系统执行测试任务);
隔离性:多个用户的事务之间不要相互影响,要相互隔离(由DBMS的并发控制子系统实现);
持久性:一个事务一旦提交,那么它对数据库产生的影响就是永久的不可逆的,如果后面再回滚或者出异常,都不会影响已提交的事务(由DBMS的恢复管理子系统实现的)
30.shell中的特殊变量:
变量名
含义
$0
shell或shell脚本的名字
$*
以一对双引号给出参数列表
$@
将各个参数分别加双引号返回
$#
参数的个数
$_
代表上一个命令的最后一个参数
$$
代表所在命令的PID
$!
代表最后执行的后台命令的PID
$?
代表上一个命令执行后的退出状态 echo $? 如果返回值是0,就是执行成功;如果是返回值是0以外的值,就是失败。
31.python中主要存在四种命名方式:
1、object #公用方法
2、_object #半保护
#被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些变量,
在模块或类外不可以使用,不能用’from module import ’导入。
#object 是为了避免与子类的方法名称冲突, 对于该标识符描述的方法,父
类的方法不能轻易地被子类的方法覆盖,他们的名字实际上是
classname__methodname。
3、
_ object #全私有,全保护
#私有成员“private”,意思是只有类对象自己能访问,连子类对象也不能访
问到这个数据,不能用’from module import *’导入。
4、
_ object
_ #内建方法,用户不要这样定义
32.1.在事件中,this指向触发这个事件的对象(特殊的是:IE中的attachEvent中的this总是指向全局对象window)。
2.this总是指向函数的直接调用者(而非间接调用者)
3.new后面就是构造函数,构造函数中的this指向的就是当前的对象
33.length 返回浏览器历史列表中的URL数量
back() 加载 history 列表中的前一个URL
forward() 加载 history 列表中的下一个URL
go() 加载history列表中的某个具体页面。
34.首先,垃圾回收的优先级相当低。另外,即使垃圾回收器工作,finalize()也不一定得到执行,这是由于程序中的其他线程的优先级远远高于执行finalize()函数线程的优先级。或者说,如果是等待清理队列中如果又被调用,则不会执行finallize()。所以说:Java通过垃圾回收回收不再引用的变量,垃圾回收时对象的finallize()不一定会得到执行。
35.运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
36. InputStreanReader的构造函数:
InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
37.hashmap和hashtable
22. 关于HashMap的一些说法: a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。 b) HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。 c) HashMap实现不同步,线程不安全。 HashTable线程安全 d) HashMap中的key-value都是存储在Entry中的。 e) HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性 f) 解决冲突主要有三种方法:定址法,拉链法,再散列法。HashMap是采用拉链法解决哈希冲突的。 注: 链表法是将相同hash值的对象组成一个链表放在hash值对应的槽位; 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。 拉链法解决冲突的做法是: 将所有关键字为同义词的结点链接在同一个单链表中 。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0…m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。拉链法适合未规定元素的大小。
2. Hashtable和HashMap的区别: a) 继承不同。 public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map b) Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。 c) Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键, 而应该用 containsKey() 方法来判断。 d) 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。 e) 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。 f) Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old
2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 注: HashSet子类依靠hashCode()和equal()方法来区分重复元素。 HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值的,会去判断当前Map中是否含有该Key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。
38.成员变量和局部变量的区别:
区别一:定义的位置不同。
(1)成员变量定义在类中。
(2)局部变量定义在方法中。
区别二:在内存中的位置不同。
(1)成员变量存储在堆内存的对象中。
(2)局部变量存储在栈内存的方法中。
区别三:声明周期不同:
(1)成员变量随着对象的出现而出现,随着对象的消失而消失。
(2)局部变量是随着方法的运行而出现,随着方法的弹栈而消失。
区别四:初始化不同:
(1)成员变量因为在堆内存中,所以有默认的初始化值。
(2)局部变量没有默认初始化值,必须初始化后才可以使用。
39.属于被动引用不会出发子类初始化 :
1.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
2.通过数组定义来引用类,不会触发此类的初始化
3.常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
40.切片操作不会引起下标越界异常
41.JDK中提供了三个ClassLoader,根据层级从高到低为:
Bootstrap ClassLoader,主要加载JVM自身工作需要的类。
Extension ClassLoader,主要加载%JAVA_HOME%\lib\ext目录下的库类。
Application ClassLoader,主要加载Classpath指定的库类,一般情况下这是程序中的默认类加载器,也是ClassLoader.getSystemClassLoader() 的返回值。(这里的Classpath默认指的是环境变量中配置的Classpath,但是可以在执行Java命令的时候使用-cp 参数来修改当前程序使用的Classpath)
JVM加载类的实现方式,我们称为 双亲委托模型:
如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。
双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。
假设有一个开发者自己编写了一个名为Java.lang.Object的类,想借此欺骗JVM。现在他要使用自定义ClassLoader来加载自己编写的java.lang.Object类。然而幸运的是,双亲委托模型不会让他成功。因为JVM会优先在Bootstrap ClassLoader的路径下找到java.lang.Object类,并载入它
42.sleep()方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
wait()方法
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
yield方法
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
join方法
等待该线程终止。
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
43.既然是实现接口,就要实现接口的所以方法,相当于重写方法,方法的重写需要满足:三同一大一小(方法名、返回值类型、形参相同;访问权限>=重写前;抛出异常<=重写前)
44.如果父类中的某个方法使用了synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类中的这个方法并不是同步的,必须显示的在子类的这个方法中加上synchronized关键字才可。当然,也可以在子类中调用父类中相应的方法,这样虽然子类中的方法并不是同步的,但子类调用了父类中的同步方法,也就相当子类方法也同步了
45.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化 。
而静态代码块在类初始化的时候执行!!
46.加载驱动方法
1.Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
2. DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);
47.创建Statement是不传参的,PreparedStatement是需要传入sql语句
Statement sta=con.createStatement();
ResultSet rst=sta.executeQuery(“select * from book”);
PreparedStatement pst=con.prepareStatement(“select * from book”);
ResultSet rst=pst.executeQuery();
48.在jvm中 是使用监视器锁来实现不同线程的异步执行, 在语法的表现就是synchronized 。
49.字符串编译的过程:gbk==>unicode==>utf16==>url解码
字符串解码顺序为:url解码==>utf16==>unicode==>gbk
50.在JDBC编程模式中,一个数据库连接建立时,就处于一个自动提交模式,每一个SQL语句被执行完成后就会被自动提交,反映到数据库中。当需要把几条逻辑上相关的SQL组成的一个事务执行时,就需要关闭事务自动提交模式。如下面的语句所示: con.setAutoCommit(false); // 关闭自动提交模式 一旦关闭了事务自动提交模式,不会有任何SQL语句被提交至数据库系统执行,除非显式的调用提交方法。
51.python
init 方法为初始化方法, __new__方法才是真正的构造函数。
new__方法默认返回实例对象供__init__方法、实例方法使用。
init 方法为初始化方法,为类的实例提供一些属性或完成一些动作。
new 方法创建实例对象供__init
方法使用,__init__方法定制实例对象。
__new__是一个静态方法,而__init__是一个实例方法。
52.
类方法是指类中被static修饰的方法,无this指针。
类方法是可以调用其他类的static方法的。
可以在类方法中生成实例对象再调用实例方法。
53. java关键字都是小写。
54.1.session用来表示用户会话,session对象在服务端维护,一般tomcat设定session生命周期为30分钟,超时将失效,也可以主动设置无效; 2.cookie存放在客户端,可以分为内存cookie和磁盘cookie。内存cookie在浏览器关闭后消失,磁盘cookie超时后消失。当浏览器发送请求时,将自动发送对应cookie信息,前提是请求url满足cookie路径; 3.可以将sessionId存放在cookie中,也可以通过重写url将sessionId拼接在url。因此可以查看浏览器cookie或地址栏url看到sessionId; 4.请求到服务端时,将根据请求中的sessionId查找session,如果可以获取到则返回,否则返回null或者返回新构建的session,老的session依旧存在,
55.stream结尾都是字节流,reader和writer结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。 只是读写文件,和文件内容无关的,一般选择字节流。
56.数据库模式
数据库领域公认的标准结构是三级模式结构,它包括外模式、概念模式、内模式,有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。用户级对应外模式,概念级对应概念模式,物理级对应内模式,使不同级别的用户对数据库形成不同的视图。
外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示 。
模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。
内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。
**57.**Object类是一个特殊的类,是所有类的父类。它主要提供了以下11个方法
public final native Class<?> getClass()//native方法,用于返回当前运行时对象的Class对象,使用了 final关键字修饰,故不允许子类重写。
public native int hashCode() //native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的 HashMap。 public boolean equals(Object obj)//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户 比较字符串的值是否相等。
protected native Object clone() throws CloneNotSupportedException//naitive方法,用于创建并返回 当前对象的一份拷贝。一般情况下,对于任何对象 x,表达式 x.clone() != x 为true,x.clone().getClass() == x.getClass() 为true。Object本身没有实现Cloneable接口,所以不重写clone方法并且进行调用的话会发生 CloneNotSupportedException异常。
public String toString()//返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的子类都重写这个方 法。
public final native void notify()//native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视 器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
public final native void notifyAll()//native方法,并且不能重写。跟notify一样,唯一的区别就是会唤醒 在此对象监视器上等待的所有线程,而不是一个线程。
public final native void wait(long timeout) throws InterruptedException//native方法,并且不能 重写。暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁 。timeout是等待时间。
public final void wait(long timeout, int nanos) throws InterruptedException//多了nanos参数, 这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上nanos毫秒。
public final void wait() throws InterruptedException//跟之前的2个wait方法一样,只不过该方法一直等 待,没有超时时间这个概念
protected void finalize() throws Throwable { }//实例被垃圾回收器回收的时候触发的操作
58.数据库常用的关系运算为三种:
1、选择。
2、投影。
3、连接。
(1)选择,是从二维表中选出符合条件的记录,它是从行的角度对关系进行的运算。
(2)投影,是从二维表中选出所需要的列,它是从列的角度对关系进行的运算。
(3)连接,是同时涉及到两个二维表的运算,它是将两个关系在给定的属性上满足给定条件的记录连接起来而得到的一个新的关系。
59.
强引用:平时我们所使用的大部分引用都是强引用。一个对象具有强引用,类似于不可缺少的生活品。JVM在内 存不足的时候,宁可抛出outofmemory异常,使程序终止,也不愿意回收该对象。

软引用:只具有软引用的对象,就像生活中可有可无的生活品。如果JVM内存充足,垃圾回收器就不会回收它。如果JVM内存不足的话,垃圾回收器就会对它进行回收。

弱引用:只具有弱引用的对象,就像生活中可有可无的生活品。但是它比软引用具备更短的生命周期,垃圾回收器扫描它所管辖的区域,如果扫描到弱引用对象,就直接对它进行回收。

虚引用:形同虚设。虚引用就和没有任何引用一样。在任何时候都能够被回收。

虚引用与软引用和弱引用的区别:

虚引用要和引用队列联合使用。垃圾回收器在回收一个对象之前,如果还发现了该对象的虚引用,就会再对象回收之前,将虚引用添加到引用队列中。

使用软引用能带来的好处:提升JVM回收垃圾的速度,维护系统的运行安全,防止内存溢出等问题。
60.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值