牛客网试题总结
JVM:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3:
JVM内存配置参数:Xmx代表虚拟机最大内存,Xms代表虚拟机初始内存即最小内存值,Xmn代表轻代大小,而年轻代可以分为五份:伊甸区:幸存者区=3:2,所以可以分为五份5120/5=1024,所以幸存者区等于1024x2=2048
线程私有和线程共享:
私有线程区域:程序计数器、虚拟机栈、本地方法栈
线程共享区域:堆、方法区
java包:
javax.awt 和javax.swing包:
swing是对awt的补充,awt是基于本地的c/c++程序,运行速度快,而swing是基于awt的Java程序,运行速度慢。
2.awt和swing的控件在不同的平台表现可能不同,而swing表现在所有平台一致
servlet 常用的包:
1.javax.servlet
2.javax.servlet.http
Math包:
Math.floor() 表示向下取整,返回double类型 (floor—地板)Math.floor(8.2)=8.0
Math.ceil() 表示向上取整,返回double类型 (ceil—天花板)Math.floor(8.2)=9.0
Math.round() 四舍五入,返回int类型 Math.floor(8.2)=8
html前端和jsp前端:
forword和redirect:
forward,服务器获取跳转页面内容传给用户,用户地址栏不变
redirect,是服务器向用户发送转向的地址,redirect后地址栏变成新的地址
动态include和静态include:
当一个jsp包含另一个jsp的时候会分为静态和动态包含
静态包含:静态包含用include伪码实现,不会检查所含文件的变化,例: <%@ include file=“included.htm” %> ,将两个文件的代码合成一个文件在进行翻译,因此不允许有相同的变量,共享request作用域。
动态包含:动态包含用jsp:include动作实现,例: <jsp:include page=“included.jsp” flush=“true” />,他总是会检查所含文件中的变化,适用于包含动态页面,各个文件分别进行编译,然后组合成一个文件,允许有同名的变量,但是共享request作用域。
Linux:
多线程:
线程状态分为新生状态、就绪状态、运行状态、阻塞状态、死亡状态
关键字:Thread,synchronized
实现多线程三种方式:
1.继承Thread抽象类,重写run方法,无返回值,不能抛异常(其实Thread类本身也实现了Runnable接口)
2.实现Runnable接口,重写run方法,无返回值,不能抛异常。
3.实现Callable接口,重写call方法,有返回值,get();方法获取返回值,可以抛异常该方法需要代理类执行线程
4.使用线程池(有返回值)
多线程方法:
1.run():是在主线程中执行方法,和调用普通方法一样;
2.start():是创建了新的线程,在新的线程中执行;(异步执行,调用此方法不一定马上执行,看cpu)
单独调用run()方法,是同步执行;通过start()调用run(),是异步执行。
3.sleep();可模拟网络延迟,属于Thread类的方法,让线程暂停指定时间,不释放同步锁,监控不停止
4.wait();属于Object类的方法,让一个线程处于等待状态,会释放同步锁,运行状态直接变成阻塞状态,需要等待notify方法或者notifyAll方法唤醒他变成就绪状态
5.join();加入一个线程,等他执行完才继续之前的线程执行,释放同步锁
6.yield();礼让方法,暂停执行当前的线程,去执行其他线程
7.notify(): 可以唤醒调用wait方法的线程,通知一个线程继续运行。
8.notifyAll(): 可以唤醒所有调用wait方法的线程,通知所有线程继续运行。
9.setPriority(): 设置一个线程的优先级。(范围在1~10,设置最大并不一定先执行,看cpu)
10.interrupt();可以停止一个线程,要加一个boolean值标记线程状态。
11.cyclicBarrier();可以让一组线程等待其他线程。
12.countDownLatch(); 可以让一组线程等待某个事件发生。
线程池:
抛InterruptedException:
当线程被打断的时候会抛InterruptedException异常
1.java.lang.Object 类的 wait 方法
2.java.lang.Thread 类的 sleep 方法
3.java.lang.Thread 类的 join 方法
synchronized和ThreadLocation和volatile:
synchronized:
synchronized可以给对象加锁,保证的是线程间的数据共享,保证原子性、可见性、有序性,可能造成死锁,可以使用在变量、方法、和类级别。锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
volatile:
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取;仅能使用在变量级别,不会造成线程的阻塞,只保证有序性和可见性,不保证原子性
ThreadLocation:
ThreadLocation继承自Object类,没有实现任何接口,ThreadLocation不是一个线程,而是线程的一个局部变量。用于线程间的数据隔离,保证数据安全性,ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本。
基本数据类型+String:
基本数据类型:
Integer:
Integercache已经new了-128~127之间的对象,当第一次执行Integer i= 20会将i指向new好的对象,当第二次执行Integer ii= 20的时候也将ii指向new好的对象,所以ii==i,但是执行Integer iii =new Integer(20)的时候会新建一个Integer对象,执行Integer a=10的时候实际上执行Integer a=valueof(10),Short和Long包装器类型都有cache
类型转换:
java中的整数默认类型是int,小数默认类型是double
byte、short、char的二元运算过后类型会转化成int
只要二元运算中含有double和int和long,二元运算结果都是该类型。
默认值:
byte、int、short、long都是0,double、float都是0.0、boolean是false、char的默认值是 " "、他们的包装类都是null
String:
String底层实现是字符数组
Substring(x,y):
string.substring(x,y)方法指的是截取从x(包括)到y不包括的字符——[x,y)
字符串加号拼接:
除了 “ ” 字符串,其他字符串碰到+号会进行拼接,但是如果字符串在加在最后,前面有数字计算,会先计算前面数组运算的结果然后再和字符串进行拼接,如果字符串加在第一个,后面数字运算用括号,则先计算括号内容再进行拼接。
接口和抽象类:
接口:
接口可以用abstract修饰,,接口中可以有构造函数,但是不能Shiloh,接口可以多继承,接口中的方法用static或者default修饰一定要有空的方法体。
抽象类:
抽象的关键字:abstract
抽象类中不一定有抽象方法,但是包含抽象方法的类一定是抽象类,不能实例化一个抽象类,抽象方法不能有方法体
接口和抽象类区别:
区别1:抽象类体现继承关系,一个类只能単继承。接口体现实现关系,一个类可以多实现。
区别2:抽象类中可以定义非抽象方法和抽象方法,子类继承后可以直接使用非抽象方法。接口的方法都是抽象的,必须由子类去实现。接口中的成员都有固定的修饰符。
区别3:抽象类有构造方法,用于给子类对象初始化。而接口没有构造方法。
特点1:抽象类不可以实例化,即不能用new创建对象。抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类也是抽象类。
特点2:抽象类abstract关键字不能和哪些关键字共存:
- final 因为final修饰的方法不能被继承。
- static因为类.方法(),此方法没有方法体,没有意义。
- private 因为抽象方法是要被子类覆盖的,加上private子类就不知道这个方法了。
特点3:接口中声明变量必须是final、public 、static的,接口中定义的方法都是abstract、public的。接口里的数据成员必须初始化,且全是常量,不是变量。
特点4:接口是抽象类的变体, 接口也可以通过关键字extends来继承其他接口。
访问修饰符:
修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
代码执行顺序,从上往下优先级减小:
1.父类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
2.子类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
3.父类属性对象初始化
4.父类普通代码块(每次new,每次执行 )
5.父类构造函数(每次new,每次执行)
6.子类 属性对象初始化
7.子类普通代码块(每次new,每次执行 )
8.子类构造函数(每次new,每次执行)
没有继承:static代码块>普通代码块>构造函数
有继承:父类的static代码块>子类static代码块>父类普通代码块>父类构造函数>子类普通代码块>子类构造函数
当一个类继承一个类,子类会隐式调用父类无参的构造函数,如果父类没有无参构造函数,且没有调用有参的构造函数,编译出错
线程同步的集合:
线程同步:喂,SHE
喂(Vector)
S(Stack)
H(hashtable)
E(enumeration)
Try catch finally代码块:
1.不管有没有异常,finally都会执行
2.当try或者catch中有return finally都会执行
3.在执行到try或者catch中的return的时候会将计算的结果保存起来,然后执行finally代码块,如果finally中有return,则整个return。
try的三种形式:
1.try-catch
2.try-finally
3.try-catch-finally
坑:
1.Integer对象
Integer i=new Integer(2);
Integer ii=new Integer(2);
i和ii因为用的是new所以这个是两个不同的对象
2.代码循环中
i=i++,i的值永远不变
3.虽然整数类型运算会自动转换成int类型,使用+=会自动强转类型,不报错
4.list的remove方法调用后长度会减一,去除该元素后,后面的会顶上来。
Collection接口+Map接口:
Collection接口:
Collection接口继承自Iterable接口,他的工具类是Collections,他的实现类包括List接口和Set接口,和他平级的是Map接口
List:
List继承于Collection接口,list有序且可以重复,他的常见实现类包含ArrayList、LinkedList、Vector。
ArrayList:底层实现是数组,线程不安全,增删效率慢,查询快,当不指定类型的时候,默认再取出的是Object类型
LinkedList:底层实现是链表,线程不安全,增删率快,查询慢
Vector:线程安全,但是效率较慢
Set:
Set继承于Collection接口,Set无序且不可以重复,他的常见实现类包括HashSet、TreeSet、LinkedHashSet
HashSet:不能重复数据,可以出现空数据,数据无序
TreeSet:不能重复数据,不能出现空数据,数据有序的
LinkedHashSet:数据有序。
Map接口:
Map是一个接口,,底层实现是数组+链表,通过键值对形式存储,他的常见实现类包括HashMap、TreeMap、HashTable。
HashMap:不是线程安全的,无序。底层实现是数组+链表+红黑树
TreeMap:
Hashtable:
循环语句:
循环语句包括 for 、while、 do {} while(){}
do while ():
do{} while(){}会先执行一次do里面的内容,然后再进行判断,如果while里面是true,则继续执行do while,一直到while为flase();
for();
for循环执行顺序:
for(a;b;c){
d}
初始化只执行一次a,然后判断b是不是true,是true执行d,然后再执行c,第二次直接判断b是不是true。
异常类:
异常类的父类是Throwable类,和他同级的有Error类
Throw和Throws的区别:
Throws指的是可能抛出的异常,通常定义在方法头
Throw在方法中,指的是手动抛出异常
MySQL:
乐观锁、悲观锁
乐观锁:顾名思义,比较乐观,每次拿数据的时候都认为别人不会修改,所以不上锁,一般在表中加一个版本字段,每次操作完成修改版本号。
悲观锁:顾名思义,比较悲观,总是假设最坏的情况,认为每次拿数据的时候都认为别人会修改,所以在拿数据的时候都会上锁。
引擎:
MyISAM引擎:5.5之前使用,不支持事务管理,使用表级锁,不支持外键
InnoDB引擎:5.5之后使用,支持事务管理,使用行级锁,支持外键
索引:
Mysql的索引用的是B+树,链表加树,树矮,遍历快
数组:
数组是引用类型,当声明一个数组的时候不能直接限定数组的长度
例 String a[]; 或String [] a; 因为Object是所有类的父类,所以Object [ ];也可以
只能在实例化一个对象的时候才声明长度
例 String a []= new String [2 ];
继承:
父类引用指向子类对象:
当 Father f=new Son();的时候,编译看左边,运行看右边
枚举:
枚举关键字enum
枚举是一种特殊的类,他的构造函数必须为private,枚举中的是常量
虚函数:
c++中的虚函数其实就是java中的普通函数,加上final就变成非虚函数,java中的抽象函数就是c++中的纯虚函数
对象:
创建对象:
创建对象的四种方式:
1.new
2.Class反射类
3.Constructor反射类
4.反序列化
5.对象克隆方法