浅谈JavaEE小知识点
-
JDK JRE JVM 区别
Jdk 将不可用Java文件变成可用class文件,jdk是开发人员使用的,jdk还可以执行class文件,javac编译命令Java (class文件的名)执行名命令, jre将class文件放到jvm中,在jvm中运行。
-
怎么快速除2乘2
可以使用位移运算法,例如a<<1=a*2 a>>1=a/2,但是byte和short类型变成了int
-
关于JVM垃圾回收机制
虚拟机自动回收垃圾,人为不能控制回收哪处的垃圾。回收垃圾实在堆内存中发生。没有引用指向的对象会被标记为垃圾。可以使用system().gc是提醒进行垃圾回收处理。Runtime().gc也是一个意思。虚拟机自己回收还是提醒回收都会有一个Finalize()方法。
-
什么是继承
子类继承父类中的方法与属性,关键字是extends。子类可以比父类增加自己的属性和方法。
-
什么是接口
接口之中的所有方法都必须得到使用,缺一不可,接口不是一个类,不能实例化。除非是JDK1.8以后方法前加default可以加方法体,否则不能加方法体。接口可以有常量,抽象方法,默认的方法都是abstract(抽象的)。接口可以实现多继承,用implements实现接口。
-
什么是封装
封装就是把对象的属性和方法使用private public protected default四个关键字来修饰,尽可能的隐藏内部细节,只提供接口。
-
抽象类和接口有什么区别与什么时候使用
接口之中只能定义抽象方法(除了JDK8以后),public final static 修饰的常量,抽象类可以定义普通方法和抽象方法。抽象类是一个类只能被单继承,而接口可以被多实现,抽象类可以实现接口,抽象类只能继承抽象类并且是单继承,接口只能继承接口 并且可以多继承。(区别)
他们都是被用来继承或实现的,都不能被实例化。原则上能写成接口就不要写成继承(联系) -
什么是多态
1.多态是指父类引用指向子类对象,一定发生继承关系。
2.多态指的是重载和重写,方法的重载编译时多态,重写则是运行时多态。 -
面向对象和面向过程
面向对象就是找对象,解决每个对象的问题,然后成功。面向过程就是单纯的解决一个又一个问题最终实现成功
-
怎么理解super和this
This是当前对象的引用,super是当前对象的父类进行引用。
-
怎么理解堆内存和栈内存
垃圾回收在堆内存中进行,栈内存中运行方法,可以反复进栈出栈,但是要注意栈溢出问题。栈是先进后出,后进先出。
-
如何理解static 和final
Static是静态的,属于类,存在于静态方法区,final修饰变量不可修改值,被static和final修饰的就是常量。
-
JAVA怎么实现多继承
只对此类可见,其他类都不可见;好处,隐藏你其他类知道的操作,也即封装性,但内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量
- copying 把散着的存活的数据拷贝到相对连续的内存当中,先拷贝有用的后清理垃圾内存。
- mark-compact 标记活的—》放入连续的内存之中
- mark-sweeping将有用的无用的全部做标记,直接删除没用的
-
如何理解对象引用
实例化类时,new出一个新对象,给新对象取外号也就是赋予地址,调用此地址就是调用此对象,这就是对象引用 -
类和对象之间的区别
具有相同属性及相同行为的一组对象称为类。对象是类NEW出来的 -
怎么理解高内聚低耦合这句话
块内联系,一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高
块间联系,模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息
重载是编译时多态,重写是运行时多态,重写是为了继承,写在方法之中,重载的时候方法名一样,参数类型和个数不一样,重写是对父类的函数进行重新定义。
-
StringBuffer 和StringBuilder
Builder线程不安全,但是更加高效更加实用, Builder运行速度快,多线程buffer,单线程builder -
listiterrator 和interator区别
Listiterrator只能用于list, Listiterrator可以用add方法,iterator不可以,listiterrator有hasprevious逆向遍历,可以定位,使用nextindex,listiterrator可以用set修改,itertor不可以修改 -
linkedlist和arraylist的优缺点
Arraylist是满了以后自动扩容,线性顺序存储,查找快,增删慢
Linkedlist是双链表结构,查找慢 增删快有getFirst等方法 -
队列与栈区别
Queue队列先进先出 栈先进后出 环形结构先写的先被覆盖栈调用的是linkedlist方法
-
队列输入aaa,bbb,ccc,ddd 输出也是aaa,bbb,ccc,ddd
用两个栈实现先进先出的队列功能
-
collection和collections区别
对集合对象进行基本操作的通用接口方法
包含有各种有关集合操作的静态多态方法。包装类 -
Stringbuffer和Srting区别
Stringbuffer不需要分配新内存用append,String需要分配新内存
-
treeset是啥
TreeSet 是一个自然顺序的集合,继承了AbstractSet抽象类,所以它是一个set集合,可以被实例化,且具有set的属性和方法,不允许添加重复元素
-
hashset是啥
给了一个初始常量16,还有一个加载因子0.75,然后进行扩容,扩容约二倍,存取速度快
-
常用集合有哪些*
Collection :集合的根接口
List:有序可重复arraylist:查找快增删慢 linkedlist:查找慢增删快getfirst方法
Set:无序不可重复hashset: 存取快不能保证迭代的顺序hashcode相同时发生了hash冲突使用拉链法,也是使用了右移方法因为除法效率低
linkedhashset: 迭代的输出顺序与输入顺序一致 treeset:有自然顺序
Map:键不重复,值可以重复hashmap:访问速度快,键只允许一个为null,值可以多个null
linkedhashmap: 保持了插入的顺序 treemap: 默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。 -
list和set
Set内存放的元素不允许重复无顺序,List存放的元素有顺序可重复。
-
hashset如何运用hashcode和equals来区分的
hashset先调用对象的hashcode函数来进行散列,当散列到不同位置时,则认为对象不相同且进行插入操作(不用判断equals函数);相同位置则需要使用equals判断
-
什么是桶
桶是key和value的包装
-
HashMap和hashtable区别
Table=stringbuffer线程安全慢
Hashmap允许空值 线程不安全快 -
linkedhashset和hashset区别
Linkedhashset迭代的顺序与输入顺序一致
-
Map集合是collection框架下的吗?
不是
-
MAP值可以重复吗
key不会出现重复,如果重复了就会覆盖
value可以重复 -
如何遍历
Iterator for foreach
-
foreach和迭代器遍历的区别
iterator()要求容器返回一个Iterator。next()获得序列中的下一个元素。hasNext()检查序列中是否还有元素。remove()将迭代器新返回的元素删除。
-
throws和throw都是什么
throw是语句抛出一个异常写在方法体中。throws是写在方法声明上。
-
迭代器迭代时可以删除和增加吗list集合
可以删除remove调用的是interator本身的方法
-
迭代器模式
迭代器模式:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节
-
集合可以嵌套集合吗
可以 因为有object
-
final可以修饰什么
属性和方法还有类,被final修饰的类和方法无法被继承。
-
简单说一下排序算法(查找算法)*
二分法查找:数据需是排好序的,每次定义查询的长度都是数值的一半
直接插入:数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换
希尔排序:将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小
简单选择:找到关键字最小的元素,最小元素不是待排序序列的第一个元素,将其和第一个元素互换;余下的 N - 1 个元素中,找出关键字最小的元素,重复
堆排序:构建大顶堆,根元素必须是最大值,取出根节点与序列末尾元素进行交换对交换后的n-1个序列元素进行调整,然后重复
快速排序:选择序列当中第一个数最为基准数,序列当中的所有数依次遍历,比基准数大的位于其右侧,比基准数小的位于其左侧
冒泡排序:双重循环,必须保证右边的数据比左边的大
归并排序:将序列每次折半拆分,将划分后的序列段两两排序合并
桶排序(基数排序):从个位拆,放入各自的桶中,然后在按照十位,依次进行,最后排序成功 -
集合也有类似的工具类吗?
数组有 arrays工具类,集合有clloections
-
包导进去了,调用同名类时怎么办
写路径全程,例如com.xxx.xxx
-
工厂模式
工厂方法模式与抽象工厂模式。或者简单工厂模式, 工厂方法模式抽象工厂模式。
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 -
进程线程包含关系
进程包含线程,最少有一个线程,每个线程都有独立运行的栈,多进程指的是系统同事运行多个任务(程序),多线程指的是多个栈同时运行
-
如何开辟新的线程
1 a.一个类继承thread类
b.重写Run方法
c.调用.start方法激活新线程 。start实现了两个方法,开辟新的栈,run入栈,然后执行
2 a写一个类对应Runnable接口
b 重写run方法
c通过线程类来讲Runnable对象作为成员变量输入(相当于重写Run方法)
d调用线程类的start的方法激活新线程 -
节点流,处理流,缓冲流,序列化流*
输入流 | 输出流 | |||
---|---|---|---|---|
字节流 | 字符流 | 字节流 | 字符流 | |
节点/基本流 | FileInputStream | FileReader | FileOutputStream | FileWriter |
处理/转换流 | InputStreamReader | FileOutputStream | ||
缓冲流 | BufferedInputStream | bufferdeReader | BufferedOutputStream | bufferdeWriter |
序列化流 | ObjectInputStream | ObjectOutputStream |
**transient或者static修饰则不被序列化**
-
写IO流的时候怎么保证io正常关闭
Trycatch finally里边写.close 都会关闭
-
线程的状态与进程的状态相同五种*
A:(New)新建状态
B:(Runnable)可运行状态
C:(Running)运行状态
D:(Block)阻塞状态
E:(Dead)死亡状态 -
线程的优先级
优先级高不代表百分之百先执行,通过设置Thread.MIN_PRIORITY//1, Thread.NORM_PRIORITY//5, Thread.MAX_PRIORITY//10,
-
线程的休眠
Sleep()join()是先进入锁定状态然后返回就绪状态,yield变成就绪状态,wait()是永久休眠直到唤醒,唤醒使用notify/notifyall。
-
线程并发问题是啥,咋解决
多个线程同时访问同一资源,应该使用锁来控制线程,synchronized修饰需要修饰的方法上叫做方法锁,还可以添加同步代码块synchronized(this),this称为对象锁,锁一致时才是上锁,不一致等于没上锁。还有一种锁叫类锁,当前对象名.class就是类锁
-
类锁与对象锁
类锁是一种特殊的对象锁,
-
线程池创建
运用Excutors创建线程池,能装到池子中的,Runnable接口还有Callable接口,ExcutorServicees=Executors.newFixedThreadPOOL(2),参数的意义是能装几个线程,二者区别是Runnable实现的是RUN方法没有返回值,callable实现的是Call方法有返回值,可以自己填写在泛型之中返回。
-
死锁的发生
俩线程,彼此等待对方占用的锁,死锁发生的前提条件是大于一个锁,同步锁中嵌套了其他同步锁,程序出现了无限等待。
-
定义日期格式
Simpledateformate ,to_char,to_date,java区分大小写,oracle不区分
-
运行时异常,检查性异常区别
runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。checked exception。checked对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch
-
构造器可以被重写吗,重载呢?
能被重载,不能被重写
-
string能不能被继承
被final修饰的类不能继承
-
异常处理finally之中有return
先执行finally ,在执行return
-
单例模式
懒汉式,饿汉式,注册式
-
char多大
Java有固定长度16位,字符可以装入其中。Unicode2字节,如果是utf-8就是仨字节65535大小
-
线程start和run有什么区别
Start方法做了两件事,新开辟一块内存调用run方法,run做了一件事,只是运行。
-
jdbc连接步骤
1.注册驱动。
2.获取链接对象
3.获取sql语句平台,例如preparestatement
4.执行sql语句
5.处理结果
6.释放资源 -
jdbc如何对事物进行处理
默认自动提交,可以修改setAutoCommit(false)来关闭默认提交,
然后进行commit或者rollback操作 -
jdbc核心类和作用
Drivermanager加载驱动核心类,获取连接对象,获取执行平台,执行sql语句,处理结果并释放资源,可以用class.Forname(驱动),也可以用drivermanager的registerDriver(new +驱动)。
-
数据库连接池区别
Druid,c3p0,dbcp:druid的driverClassName可以不配,如果不配根据url自动识别数据库类型,自己选择,属性名也大多不相同