1 面向对象的特征
封装 继承 多态
封装:1.将不需要对外提供的内容都隐藏起来;
2.把属性都隐藏起来,提供公共方法对其访问;
继承: 1.父类是具有共同特征的一些方法或属性,我们单独把它拿出来放入一个类;
2.继承是越子类越具体,越父类越共性;
3.可以实现代码重用;
多态:父类的引用指向了子类的对象;
2 override 与 overload
1 override 重写 父类与子类之间 1 方法名 参数 返回类型一致 2 修饰符权限大于或等于父类 3 异常小于等于父类
2 overload 重载 同类方法之间 1 方法名 一致 ,参数顺序或者是类型,个数不一致 ,不能通过返回值不同来实现重载
3 抽象类与接口
1 抽象类可以实现方法,接口不能有实现方法
2 接口可以实现多个,抽象类单继承
3 抽象类可以有构造方法,接口不能有
4 接口中的变量都是public static final
4 string与stringbuffter StringBuilder
1 String 是 final类,为了安全 不可变的 ,静态分配内存,字符串拼接会开辟一块新的内存
String s="abc"; s="xxx"
2 Stringbuffter 可变的 使用同一块 内存,所以字符串相加比String效率较好
3 Stingbuffterst StringBuilder StringBuilder 线程不安全 效率高
5 说出ArrayList,Vector, LinkedList ,HashMap 和Hashtable,list,set的区别,讲讲他们的底层实现
list 元素 有序的可以重复的
set 元素:无序不可重复
map:键值对形式 键不能重复
ArrayList Vector ArrayList线程不安全 效率高;vector是同步的
ArrayList LinkedList: 数组查询速度快 增加删除慢 链表反之
HashMap 和Hashtable 1 HashMap线程不安全 效率高 2 HashMap允许使用NULL当做键 3 Contains api改变
HashMap:底层实现:数组+链表,即数组里的元素是链表,key算出它的hashcode作为数组的下标,因为hashcode有可能重复,链表中元素entry(key,value),根据key拿到你的值
ArrayList:底层使用数组 LinkedList使用链表
set :使用HashMap的键存储,把hashmap的键作为set的元素
6 xml的解析方式
dom sax(推式解析) stax(拉式解析)
1 dom document object model 文档对象模型
2 sax simple api for xml
3 stax Stream API for XML
DOM解析: 将xml以树结构的方式一次性加载进内存,易用,修改方便,但是更占内存。不适应于大文件,一般情况下用它即可应付大多数应用。
SAX解析: 基于推模式的事件的方式来解析xml,较少占用内存,速度比DOM解析更快,适应于大文件。
STAX解析:基于拉模式的事件流的方式来解析xml,在3种解析方式中速度是最快的,可操作性也是最好的。
拉与推区别:
推触发的事件是固定,在固定的事件编写我们的代码
拉把触发的事件转化成int类型,根据int类型对应的事件自己编写代码,控制事件比较灵活
7 说说一下final与 finally finalize static
1 final 类 不能被继承
final 方法 不能被重写
final 变量 值不能被修改 如果修改的是引用变量,引用不能改, 引用所指向的对象内容是可以被修改的
2 finally try catch finally finally 不管有无异常最后都会执行,有一种情况不执行,在代码中调用了system.exit(0);
3 finalize 垃圾回收该对象时 要执行的方法 ,类似servlet要死之前调用destroy
4 static : 不用new 直接通过类名使用,只执行一次
1 限制变量的作用域 全局
2 指定变量的存储域 存储在静态区
8 多线程有几种实现方法,如何同步,有哪些类型的线程
1 继承thread 2 实现Runnable
区别 1 单继承 多实现 2 实现Runnable 资源共享
2 如何同步
1 Synchronized
2 wait(等待下一个线程) notify(唤醒一个正在等待同步锁的线程) notifyAll(唤醒所有) 生产者与消费者
3 有精灵线程(守护线程 后台 比如垃圾回收线程)和用户线程(普通线程)
应用程序是否退出,只要没有用户线程在运行了, 应用程序就退出,但是有精灵线程在运行(垃圾回收机制一直在运行)
精灵线程不具备生命周期,随着虚拟机的结束而结束;如果想把线程转为精灵线程,必须在start之前调用
setDaemon(boolean)方法,一旦线程变为精灵线程就不能变成用户线程了
9 讲讲线程池和连接池
1 为什么要用线程池? 以空间换时间的做法
如果创建和销毁线程各需要3秒,而使用的时间只有1秒,没必要每次都创建,这时可以使用线程池
创建3 +销毁3 > 使用时间1 使用线程池 创建几个线程放入池中,使用时取一个出来执行,执行完后扔(如何扔)回池中,重复利用.
在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多
a.减少在创建和销毁线程上所花的时间以及系统资源的开销
b.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
2 那么如何创建线程池 使用Executors中的方法创建线程池ExecutorService
newFixedThreadPool创建固定大小的线程池
newCachedThreadPool 创建一个可缓存的线程池
newScheduledThreadPool(int corePoolSize) :创建一个给定大小的定期执行的线程池
ExecutorService pool=Executors.newFixedThreadPool(5);
pool.execute(线程);
pool.shutdown
常见的连接池:DBCP,C3P0,PROX001
10 java中有几种类型的流?请说出一些io类?
方向上划分 :相对于程序而言,分为输入流和输出流
单位划分:字节流与字符流
功能划分:节点流和过滤流(包装流)
FileInputStream ObjectInputStream BuffedInputStream ByteArrayInputStream(内存流) PipedInputStream(管道流)
DataInpuStream(读取八大基本数据类型,网路读数据)
转换流是适配器模式;过滤流是装饰器模式
11 JAVA的异常类型,如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义
1 异常类型
Throwable
/
error exception
/
uncheced异常 checked异常(必须捕获或者抛出)
(运行时异常,系统异常) 编译时异常,普通异常
error 导致应用退出 内存溢出 断电
unchecked异常与 checked异常区别 checked异常必须捕获或者抛出,否则编译通不过
unchecked异常:nullPointerExcption arrayIndexOutOfExcption ClassCastException 算术异常 NoSuchMethodError
2 try,catch,finally try 必须要有,catch,finally两者的组合
3 throws 方法声明上 throw方法内部
12 jvm原理
1 .java(源程序)---编译器---.class字节码文件----类加载器载入内存----字节码校验器(安全检查)---解释器(解释成
操作系统识别的指令)--操作系统--cpu
类加载器;java中有3种类型的类加载器
1 应用程序类AppClassLoader 加载我们应用程序类路径下的class
2 扩展类加载器 ExtClassLoader 加载jdk下的 jre/lib/ext
3 Bootstrap类加载器 加载jdk下的jre/lib
加载机制是用类的委托机制加载
首先AppClassLoader类加载器---父类---父类,最顶层的父类加载器进行加载,如果找不到class,由子类去加载,原路返回,最后
所有的类加载器都找完了所有的路径还是找不到类,会抛出ClassNoFoundException
13 java修饰符作用域public,protected,默认的,private
当前类 当前包 子类 其他包
public y y y y
protected y y y n
默认的 y y n n
private y n n n
14 java序列化
Serializable是一个标识性接口,它的作用是
1.在网络上传输对象;
2.保存数据到硬盘;
15 java集合框架的uml图
16 讲一下反射
1 反射 就是获得自身信息的一组类以及api,这组api可以获取类及其父类的 属性 或者方法 调用方法等 有关于类的api Class
属性的api Field 和方法的api Method
2 Filed getDeclaredFields 所有的属性(老李说的暴力访问) getFields public
3 Method
getDeclaredMethods:本类的方法
getMethods:本类以及所有父类的方法
//调用类的方法 方法(method).invoke(实例,参数列表); //原来 实例.方法(参数列表)
private static void invokeMethod() {
Class c=Domain.class;
Method methods[]=c.getDeclaredMethods();
Method method=null;
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("setName")) {
method=methods[i];
}
}
Domain d=(Domain) c.newInstance();
method.invoke(d, "aaa");
System.out.println(d.getName());
}
17 java中如何实现多态
1 父类引用指向子类实例
2 方法的重载
18 排序 冒泡
for(int i=0;i<a.length;i++) {
for(int j=i+1;j<a.length;j++) {
if(a[i]<a[j]) {
int temp=a[i]
a[i]=a[j]
a[j]=temp
}
}
}
47000 188
19 继承类执行顺序结果
类的委托机制
首先AppClassLoader类加载器---父类(ExtClassLoader)---父类(BootStrap),最顶层的父类加载器进行加载,如果
找不到class,由子类去加载,原路返回,最后所有的类加载器都找完了所有的路径还是找不到类,会抛出ClassNoFoundException
20 局部变量使用前必须初始化
public class Foo{
public static void main(String args[]){
String s;
System.out.println("s="+s);
}
}
what is the result?
21 可变与不可变 传值与传引用
传值:八大基本类型都为传值,就是把实参复制一份给形参;
传引用:把实参的内存地址引用给参数,引用不可变,引用指向的内容是可变的
public class Test{
public static void stringReplace(String text){
text=text.replace('j','l');
}
public static void bufferReplace(StringBuffer text){
text=text.append("c");
}
public static void main(String args[]){
String textString=new String("java");
StringBuffer textBuffer=new StringBuffer("java");
StringReplace(textString);
bufferReplace(textBuffer);
System.out.println(textString+textBuffer);
}
}
what is the output?
java javac
22 得到Class的三种方式是什么?
类名.class 对象.getClass
Class.forName("Cma.A") 把.class文件读入内存
23 socket与udp
socket : 三次握手 相当于打电话 安全的
udp: 无状态的 不安全的 相当于邮寄
socket: 分为服务端与客户端
服务端
ServerSocket ServerSocket=new ServerSocket(1099)//在1099端口号启动服务
Socket socket=ServerSockeet.accept()//对客户进行监听
socket.getInputStream
客户端 Socket socket=new Socket("ip地址",1099);
socket.getOutputStream().write(“输出信息”)
通过io流进行通讯
udp :点对点通信,不需要服务器中转,谁都可以是服务器,也都可以是客户端
24 java有内存泄露吗
内存泄露:当一个对象在程序中没有被使用,但是又无法被垃圾回收站回收,这种现象就称为内存泄露,经常发生在
长生命周期的变量引用短生命周期的变量
Object o1=new Object();
Object o2=o1;
o1=null;//
比如栈在弹出元素时,如果我们不在弹出元素的同时从数组删除该元素就会发生内存泄露;
25 如何读取一个大文件如4GB文件
1 分段读取,先处理对进来的数据(比如先读100m,先入库),再把这个100m占用的资源释放掉,接着往下读
while ((str = br.readLine()) != null) {
i++;
app=app+str;
if(i %100 ==0){//假设读取100行
// 这里你先对这100行操作,然后继续读
app=null;
}
}
br.close();
}
2 nio 按照块的方式读取 高效率读取大文件
26 super与this
1 this表示当前对象,也就是当前类对象,super表示当前类的父类
注意点:
1 调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用
super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
27 ==与equals
基本数据类型只能用"=="来比较,比较的是值;
引用类型用"=="比较的是内存地址,equals比较的是值
String重写了equals方法,比的是内容
comparable是接口 java.lang 自然排序 compareTo自然比较方法
comparator是接口 java.util 整体排序