JavaSE基础问答
1.JAVA的基本数据类型有哪些?
JAVA的基本数据类型分为4类8种,就是整形 byte、short、int、long。浮点型 float 跟double,字符型 char,跟布尔型 true和 false。
追问:那 int 占几个字节?
整形从低到高分别占1,2,4,8个字节,int 的话就是占4个字节。一个字节8位,就是占32位嘛。然后最大值就是2的32次方,是21亿多。
2.说说 String 和 StringBuffer的区别。
String和StringBuffer都能对字符串进行操作,最主要区别就是String类的对象是不可变的,而StringBuffer类的对象是可变的。如果一个字符串改变的话就用StringBuffer,不然用String的话会生成很多新的String对象,浪费内存。
追问:那StringBuffer 和 StringBuilder的区别呢?
这两个类的对象都可以改变。区别是在执行速度方面,StringBuilder 大于StringBuffer,但是在线程安全方面,StringBuilder是线程非安全的,StringBuffer是线程安全的。在多线程时,JVM可以保证StringBuffer可以正确操作。但是大多数时候我们都是用的单线程,所以大多数都是选择用速度较快的StringBuilder。
也就是说少量数据就用String,因为比较方便。 单线程下操作大量数据用StringBuilder,因为速度较快。 多线程下操作大量数据用StringBuffer,因为能搞保证正确性。
3.面向对象的特征有哪些?
面向对象主要指的是 封装、多态、继承。
封装就是把对象的属性和行为封装在一个模块中,代码上就是封装在一个类中,然后对象的属性用变量定义,行为用方法定义,将属性的访问类型设为私有private的,然后提供一个共有的 get 和 set 方法,然后只有本类的对象才能够对属性进行赋值。封装可以提高代码的安全性。
多态,就是多种状态。 主要的形式就是左边是父类变量,然后右边实例化一个子类,就是new 一个子类。 然后这个父类变量就有了子类的方法。
继承,是java中类与类之间的一种关联方式。通过extends关键字就可以实现一个类继承另一个类,比如A extends B,就是A继承B,A称为子类,B称为父类。子类可以对父类的属性和方法进行调用或重新定义。并且可以新增其他的属性或方法。这样可以提供软件的可重用性和可扩展性。
4.常用的集合类有哪些?
常用的集合主要是三个,List、Set 和Map。List 的子类又主要是用 ArrayList 和LinkedList,Set 的子类是 hashSet 和 TreeSet,Map 的子类是HashMap 和 HashTable。主要区别是 List 集合能重复,Set 集合不能重复,重复的话会自动覆盖,Map集合的键不能重复,键重复的话值就被覆盖。 对于List 的子类 和ArrayList 和LinkedList,ArrayList 是查询数据快而插入数据慢,LinkedList是查询数据慢而插入数据快。 Set的子类HashSet 用得比较多,TreeSet 的话可以对对象进行排序,但是要实现一个Comparable 接口和 重写里面的 compareTo方法,麻烦一点。 至于HashTable和HashMap的话,就是HashTable是线程安全的,HashMap是线程不安全的,但是HashMap速度比较快。一般单线程下都是用的HashMap。 理解线程安全和速度的关系有点像生活中的‘载客摩托车’ 和 ‘公车’, 有时候赶时间去地铁站,公车的话虽然安全,但是速度有点慢,要多时间,这时候我就选择‘载客摩托车’,因为他好像红灯绿灯都能走,很快,但是不安全。 就是线程安全与执行速度要视情况而定。单线程就是路上车少的时候摩托车挺快也挺安全的,但是多线程就是多车的时候,选择公交就行,虽然慢一点,还是安全重要。
5.抽象类和接口的区别。
首先,抽象类和接口都不完整,就是都不能被实例化,他们只有被子类继续或者实现才有意义。
区别是:
抽象类可以有构造方法,接口没有构造方法。抽象类除了能有抽象方法外,其他的跟普通的类一样。
抽象类中有普通变量和静态变量,接口中只有public static final 修饰的常量。
抽象类中可以有普通方法,抽象方法有没有都行,接口中没有普通方法,只有抽象方法。
抽象类中的抽象方法的访问类型修饰符可以是public 或 protected 的,接口中的抽象方法只能是默认的public abstract ,而且接口中public abstract 还可以省略。
抽象类只能单继承,接口可以多继承。
6.final, finally,finalize的区别。
final可以用来修饰类,表示这个类不能被继承。final可以用来修饰变量(不管是类的成员变量还是方法中的局部变量),表示该变量的值不能再改变(即常量)。final还可以用来修饰方法,表示这个方法不能被子类重写。(static可以修饰类中的成员变量,表示类变量。但不能修饰方法中定义的变量。)
finally是异常处理语句结构的一部分,放在try-catch的后面,表示总是执行。里面一般放的是关闭文件、关闭流、关闭系统之类的代码。
finalize是Object类的一个方法。是GC垃圾回收运行机制中的一部分。在垃圾回收的时候会调用被回收对象的这个finalize()方法。可以重写这个方法使垃圾回收时也回收其他资源,例如关闭文件等。这样就能更有效地利用好有限的资源,节省空间。还有就是因为垃圾回收是不定时的,所以JVM不保证这个finalize方法总被调用。
7.如何实现多线程。
线程的实现由两种方式,第一种是继承Thread类,然后重写run方法;第二种是实现runnable接口,然后实现其runnable接口。
追问:怎么启动?
调用线程对象的 start()方法
怎么停止?
1.正常情况下等run方法跑完就停止了,如果run方法里面有while循环的话,一般是通过一个布尔型条件(flag)来控制。
2.用stop()方法来停止。但是这样很危险。可能会产生不可预料的后果。
3.用interrupt 方法来停止。
JSP:
8.请求的GET与POST方式的区别。
9.转发和重定向的区别。
10.说一下JSP的内置对象。
11.说一说Servlet的生命周期