java基础总结

1.&&和&的的区别

1)都表示逻辑与and,当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则一方为false,结果为false。

2)&&具有短路的功能,即如果第一个表达式为false,则不在计算第二个表达式,例如if(Str!=null && Str.equals(" ")) 表达式中,顺序执行,当str为null时,不会出现NullPointerException,如果把&&改为&,则会出现NullPointerExcepton异常,if(x==33 & ++y>0) 会增长,而if(x==33  && ++y>0)不会增长。

3)&作为位运算符,当&操作符两边的表达式不是Boolean类型时,&表示按位与操作。通常使用0x0f来表示与一个整数&进行运算,来获取该整数的最低4个bit位。

4)&通常用于位运算,也可用于逻辑运算。&&主要用于逻辑运算。它们的最大区别在于&&用于短路,&用于非短路。

2.java中用break跳出当前多重嵌套循环。

3.switch语句中byte,short,char都可以隐式转换为int类型,可以作用在switch上,而long,string都不能隐式转换为int类型,所以不能作用在switch上。

4.short s1=1;s1=s1+1 错误写法,由于s1+1运算时会提升运算等级,进行强制类型转换为int类型,在赋值给short s1时,编译器会报强制类型转换错误。

  short s1=1;s1+=1写法正确,由于+=是java语言规定的运算符,java 编译器会先进行处理。

5.char类型变量是用Unicode编码字符的,Unicode编码中包含汉字,特殊字符如果也包含在Unicode编码中,就可以存储,如果没有包含,就不能存储,Unicode编码占用两个字节,则char也占用两个字节。

6.final关键字修饰类表示这个类不能被继承,final类中所有成员成员方法都被隐式指定final方法。

  final修饰方法,如果是基本数据类型的变量,则其数值一旦初始化之后便不能改变,如果是引用类型的变量,则在其初始化后便不能再让其指向另一个对象。

 final修饰变量时,是指引用变量不能变引用变量所指向的对象中的内容还是可以改变的。

7.==和equals的区别:

“==”如果判断数值类型的话,判断内容是否相等。如果判断引用类型则是判断内存地址是否相同。

equals判断内容是否相等

8.静态变量与实例变量的区别:

语义定义上区别:静态变量要加static,实例变量不加。程序运行上区别:实例变量必须创建了实例啊,才会被分配空间,而静态变量不属于实例变量,属于类,只要程序加载了类的字节码,静态变量就会被分配空间。总之实例变量必须创建实例对象后才可以通过这个对象来使用,而静态变量则可直接使用类名来引用。

一个static方法不可以从内部调用非static方法。

9.Integer和int的区别:

Integer默认为null,int默认为0,Integer是java为int提供的封装类

10.Math类中的方法:

Math类提供了三个取整的有关的方法:ceil向上取整,floor向下取整,round四舍五入。

11.作用域public、private,protected,以及不写时(friendly)的区别:

作用域                public           protected         friendly        private

当前类                 ✔                  ✔                       ✔                 ✔

同一package       ✔                 ✔                       ✔

子孙类                ✔                  ✔

其他package      ✔      

12.overload和override的区别:

overload是重载,方法名相同,参数个数或类型、顺序可能不同,

override是重写,方法名相同,参数个数和类型必须相同,实现父类中的方法。所抛出的异常也必须相同,方法返回一致。

13.构造器Constructor不能被继承,因此不能被重写override,但可以被重载overload。

14.接口(interface)可以继承接口,抽象类可以实现接口,抽象类可以继承具体类,抽象类(abstract)中可以有静态main方法。

15.面向对象语言有封装,继承,抽象,多态等四个主要特征。

16.abstract class和interface的区别:

abstract class抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中方法不必是抽象方法。abstract class类中定义抽象方法必须在具体(concrete)子类中实现,所以,不能有抽象构造方法和抽象静态方法。如果子类中没有实现父类中所有的抽象方法,那么子类也必须定义为abstract类型。

接口可以说说抽象类的一种特性,接口中的所有方法必须是抽象的。接口中的方法默认定义为public abstract类型,接口中成员变量类型默认为public static final。

17.一个类可以实现多个接口,但只能继承一个抽象类。

18.abstract的method不可以同时是static,不可以同时是native,不可同时是synchronized。

19.内部类就是在一个类内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。

内部类可以引用它包含类的成员,如果不是静态变量没有限制。

20.匿名内部类anonymous inner class 可以继承extend其他类,可以实现implements接口interface。

21.string类不是基本数据类型,是final类型,不可被继承。

22.string,stringBuffer和stringBuilder的区别:

string和stringBuffer可以存和操作字符串,string提供了数值不可变的字符串,stringBuff提供的字符串进行修改。string覆盖了equals方法和hashCode方法,stringBuffer没有覆盖equals方法和hashCode方法。

StringBuffer线程安全,速度慢。StringBuilder线程不安全,速度快。主要方法都是append和insert方法。

23.String[] result=str.split(",") 把一段逗号分隔的字符转换成数组。

24.数组没有length()这个方法,有length属性,string有length()方法。

25.try{return}finally{} fianlly里的code会被执行,在return前执行

finally内的代码不管有无异常发生,都会执行。具体来说:
如果没有异常发生,在try内的代码执行结束后执行。
如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
如果有异常发生但没被捕获,则在异常被抛给上层之前执行。

26.final,fianlly,finalize的区别:

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义为final类型。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。JVM不保证此方法总是被调用。

27.error和exception有什么区别:

error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序处理。

exception表示一种设计或实现问题,程序中的错误

28.异常处理关键字:throws是获取异常,throw是抛出异常,try是将会发生异常的语句括起来,从而进行异常处理,也可以在try块中可以抛出新异常。

29.实现一个多线程

1)new Threed() 直接调用threed中的run方法,往往使用它的子类new subThreed() 

2) new Threed(Runnable)形式,实现Runnable接口,调用runnable的run方法。

3)利用线程池创建多线程的方式

用synchronized关键字修饰同步方法,反对stop(),因为它不安全。反对使用suspend(),因为它会发生死锁。

sleep()线程睡眠,wait()线程等待,notify()通知线程进入运行状态,notifyAll()通知所有线程进入运行状态。

start()启动一个线程,run()执行该线程所关联的代码。

状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。

30.synchronized和java.util.concurrent.locks.Look的异同:

相同点:Look能完成synchronized所实现的所有功能

不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手动释放锁,并且必须在finally从句中释放。Lock还有更强大的功能。例如,它的tryLock方法可以非阻塞方式去拿锁。

31.collection是集合的接口(子接口List和Set),collections是集合的工具类。

32.List接口下的ArrayList、LinkedList和Vector的区别:

ArrayList是基于索引的数据接口,底层是数组。查询比较快,线程不安全,数据增长会扩容为原来的0.5倍

LinkedList是以元素列表的形式存储它的数据。插入,更新,删除比较快(不需要重新计算大小更新索引),更占内存

Vector查询速度比较慢,线程安全,数据增长会扩容为原来的1倍。

32.HashMap和HashTable的区别:

HashMap底层实现:是由数组+链表组成,put底层实现,通过可以的hash值%entry[] length得到该存储的下标位置多个可以的hash值相同的话就会存储到该链表的后面。

HashMap线程不安全,允许有null的键和值,效率高点,方法不是synchronized提供的同步,有containsvalue和containsKey方法

HashTable线程安全,不允许有null的键和值,效率低点,方法是synchronized提供的同步,有contains方法。

33.List和Map的区别:

一个是存储单列数据的集合,另一个是存储键和值这样的双列数据集合,List中存储的数据是有序的,并且允许重复,Map中存储的数据是无序的,其键不允许重复,值可以重复。

34.List,Set继承Collection接口,Map不是

35.List,Set,Map三个接口存取值特点:

Set 通过add方法存元素,通过equals比较是否已存在(不能重复),取值只能以Iterator接口取得所有元素,再逐一变量各个元素。

List有先后顺序的集合,add方法存元素,先后顺序添加,生成索引,除了通过Iterator接口取得所有元素,再逐一变量各个元素,还可以调用get(index i)来说明取第几个值。

Map是双列的集合,put方法存值,通过equals判断key值是否相同,每次存储一对key/value。根据key值获得相应的value。

总结:List以特定次序来持有元素,可有重复元素。set无法拥有重复元素,内部排序。Map保存key/value值,value可多值。

36.ArrayList,Vector,LinkedList的存储性能和特性:

ArrayList和Vector都是使用数组方式存储数据,它们都允许直接按序号索引元素,但插入元素涉及元素移动等内存操作,所以索引数据快而插入数据慢,Vector使用了synchronized方法,线程安全,性能上较ArrayList差。

LinkedList使用双向链表实现存储,按序号索引数据需要向前向后遍历,但插入数据只需记录前后项即可,所以插入速度快,线程成不安全。

37.Collection和Collections区别:

Collection是集合类的上级接口,继承它的主要接口set和list。Collections是针对集合的帮助类。

38.java中几种流的区别:

字节流,字符流,字节流继承与InputStream,OutputStream,字符流继承于InputStreamReader,OutputStreamWriter。在java.io包中还有许多其他流,主要是为了提高性能和使用方便。

字符向字节转换时,需要注意编码问题,因为字符串转换成字节数组,其实是专程该字符的某种编码的字节形式,读取反之。

39.序列化:需要序列化必须实现Serializable接口,只是标注该对象是可被序列化的。

40.JVM加载class类的原理机制:JVM中类的装载是由ClassLoader和它的子类来实现。Java ClassLoader 是一个重要的java运行时系统组件,它负责在运行时查找和装入类文件的类。

41.heap和stack区别:

java内存分为两类:heap栈内存和stack堆内存

栈内存:方法的开始到结束,栈中的变量也随之释放

堆内存; new创建的对象都放在堆里,不会随方法的结束而消失,方法中局部变量使用final修饰后,放在堆里,而不是栈中。

42.GC垃圾回收的优点和原理。

优点:防止内存泄漏,有效的使用内存。

原理:作为一个单独的低级别线程的运行,不可预知的情况下对堆中已死亡的或长时间没有使用的对象进行清理和回收。

当程序员创建对象时,GC就开始监控这个对象的地址,大小以及使用情况。通常,GC采用有向图的方式记录和管理堆中的所有对象,确定哪些对象“可达”,哪些“不可达的”,当GC确定一些“不可达”时,GC就有责任回收这些内存空间,程序员可以手动执行System.gc(),通知GC运行,但是回家java语言并不保证GC一定会执行。

回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

43.单列模式:

饿汉模式:

public class Singleton1 {
    // 私有构造
    private Singleton1() {}
    private static Singleton1 single = new Singleton1();
    // 静态工厂方法
    public static Singleton1 getInstance() {
        return single;
    }
}

懒汉模式:

public class Singleton2 {
    // 私有构造
    private Singleton2() {}
    private static Singleton2 single = null;
    public static Singleton2 getInstance() {
        if(single == null){
            single = new Singleton2();
        }
        return single;
    }
}

使用synchronized同步锁

public class Singleton3 {
    // 私有构造
    private Singleton3() {}
    private static Singleton3 single = null;
    public static Singleton3 getInstance() {
        // 等同于 synchronized public static Singleton3 getInstance()
        synchronized(Singleton3.class){
          // 注意:里面的判断是一定要加的,否则出现线程安全问题
            if(single == null){
                single = new Singleton3();
            }
        }
        return single;
    }
}

使用双重检查进一步做了优化,可以避免整个方法被锁,只对需要锁的代码部分加锁,可以提高执行效率。

public class Singleton4 {
    // 私有构造
    private Singleton4() {}
    private static Singleton4 single = null;
    // 双重检查
    public static Singleton4 getInstance() {
        if (single == null) {
            synchronized (Singleton4.class) {
                if (single == null) {
                    single = new Singleton4();
                }
            }
        }
        return single;
    }
}

用枚举:

public enum SingleTon{

ONE;

}

44.排序:冒泡排序、选择排序、快速排序。(代码略)

45.HTTP请求的GET与POST方法的区别:

区别一:
  get重点在从服务器上获取资源;
  post重点在向服务器发送数据;
区别二:
   get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;
   post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
区别三:
   Get传输的数据量小,因为受URL长度限制,但效率较高;
   Post可以传输大量数据,所以上传文件时只能用Post方式;
区别四:
   get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;
   post较get安全性较高;
区别五:
   get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。
   post支持标准字符集,可以正确传递中文字符。

46.servlet的生命周期:

加载和实例化、初始化、处理请求以及服务结束。这个生命周期有java.servlet.servlet接口的init,service和destroy方法表达。

servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doxxx方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

47.servlet api 中forWord()与redirect()的区别:

直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的

48.jsp九大内置对象:

request:用户端请求,此请求包含来自get/post请求的参数

response:网页传回用户端的回应

pageContext:网页的属性是在这里管理

session:与请求有关的会话期

application:servlet正在执行的内容

out:用来传送回应的输出

config:servlet的架构部件

page:JSP网页本身

exception:针对错误网页,未捕捉的例外

49.jsp中动态include和静态include的区别:

动态include用jsp:include动作实现 它会检查所包含页面中文件的变化,适用于包含动态页面,并且可以带参数。

静态include用include伪代码实现,定不会检查所包含文件的变化,适用于包含静态页面<%@ includefile=include.htm %>

50.字符串编码处理string str=“xxx”,str=new String(str.getBytes("ISO-8859-1),"GBK");

60.页面对象传递方式:request,session,application,cookie等。

61.jsp和servlet的区别:

jsp是servlet技术的扩展,本质上是servlet简易方式,jsp编译后是“类servlet”。

不同点是:servlet的应用逻辑是在java文件上,并完全从表层的html里分离出来。jsp是java和html可以组合一个扩展名为.jsp的文件。jsp侧重于视图,servlet主要用于控制逻辑。

62.MVC的的实现:

MVC-Model-View-Controller的简写。Model代表的是应用业务逻辑(javaBean,EJB实现),View是应用的表示面(由jsp页面产生),Controller是提供应用的处理过程控制(一般是Servlet),通过这种设计模型把应用逻辑,处理过程,和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

 63.泛型:定义一个集合时,可知道里面定义的什么类型,List

你可能感兴趣的:(java面试题)