1、简述什么是 JDK、JRE 和 JVM? JDK : 开发工具包 JRE : 运行时环境 JVM : java虚拟机 2、写出Java的四类八种基本数据类? 整数 byte short int long 小数(浮点) float double 布尔 boolean 字符 char 3、& 和 && 的区别 ? & 符号的左右两边,无论真或假都要执行 && 符号的左边如果为假,符号的右边不再执行,提高了代码的执行效率 4、 switch的参数可以是什么类型 int 及以下整数包含 字符 char byte short int char String 枚举 5,简述什么是标识符,及其定义的规则 标识符就是名字 数字不能开头 不能使用关键字起名字 特殊符号只有 _ $ 26个大小写英文字母 数字0-9 其他国家的语言文字 6、说出成员变量和局部变量的区别 1, 物理位置 成员变量: 类中方法外 局部变量: 方法中或方法定义的小括号里面 2, 内存位置 成员变量: 在堆内存中 局部变量: 在栈内存中 3, 生命周期 成员变量: 随着对象创建而产生,随着对象的消失而消失 局部变量: 随着方法的调用而产生,随着方法调用结束而消失 4,有无默认值 成员变量: 有默认值, 整数0,小数0.0 字符 ‘\u0000’ 布尔 false 引用数据类型 null 局部变量: 没有默认值,使用的时候,必须先赋值 7、static关键字都能修饰什么? 都有什么特点 1, 修饰成员变量, 叫静态变量 具有共享性,节省内存空间 2, 修饰方法: 静态方法: 可以直接使用类名.进行调用, 3, 修饰代码块: 静态代码块 ,给静态变量进行赋值 4, 修饰类: 静态内部类 8 、什么是封装,为什么要封装 就是将事物的属性和行为 通过 private进行修饰,外界无法直接进行访问,需要提供公共的setter 和 getter 进行间接的访问 提高代码的安全性和复用性 9, 什么是面向对象,请详细说明(分别解释 封装 继承和多态) 面向对象是一种以事物为中心的编程思想,具体分为封装继承和多态 封装: 通过private关键字将事物的属性和行为封装起来,对外通过setter和getter提供公共的访问方式,提高了代码的安全性 继承: 让类与类之间产生子父级的关系,子类可以去使用父类的资源,提高了代码的复用性 多态: 事物的多种形态,发生多态的前提,必须有继承,有方法的重写,有父类的引用指向子类对象 10, overload和override的区别 overload 是重载 要求在同一个类中,方法名相同,参数列表不同与返回值类型无关 参数列表不同表现在: 个数不同, 数据类型顺序不同,数据类型不同 override是重写 要求发生在子父级的继承关系中,方法名相同,参数列表相同,返回值类型是父类返回值类型本身或其子类, 异常等于父类本身异常类型或小于父类本身异常 11, final 和 finally的区别 final 是权限修饰符, 表示最终的, 能修饰 变量, 方法,和类 修饰变量: 变成了常量 修饰方法: 变成了最终的方法,不能被重写,但是可以被正常调用 修饰类: 变成的最终的类,不能有子类,但是可以被正常创建对象 finally 是一个代码块,只能与我们的 try代码块连用,表示无论代码是否发生异常,finally里面的代码都要执行 14, 静态变量与成员变量的区别 内存位置 : 静态变量在方法区中,成员变量在堆内存中 生命周期 : 静态变量随着.class文件加载而产生,随着.class文件结束而结束; 成员变量随着对象的创建而产生,随着对象的结束而结束 调用方式: 静态变量既可以通过 类名.直接进行调用, 也可以通过对象名.进行调用; 成员变量只能通过 对象名.进行访问 15, throw和throws 的区别 throw 是具体抛出一个异常对象,在方法的内部, 后面有且只能有一个异常对象,代码一旦遇到了throw证明出现了问题,代码就会停止 throws 是异常的声明, 在方法定义的小括号后面,后面可以跟多个异常的类型,方法有throws,代码不一定发生异常 16 String,StringBuilder 与 StringBuffer 的区别 String是不可变的字符串序列, StringBuilder和StringBuffer是可变的字符串序列 StringBuilder 是 线程不安全的,从jdk1.5版本开始的,效率高 StringBuffer 是 线程安全的,从jdk1.0开始的,效率低 17, == 和 equals的区别 == 既可以比较基本数据类型,也可以比较引用数据类型,比较基本数据类型,比较的是具体的值,比较引用数据类型比较是地址值 equals只能比较引用数据类型,重写之前比较的是引用数据类型的地址值,重写之后,比较的是引用数据类型的内容 18, 包装类拆箱装箱 基本数据类型转换成对应的引用数据类型,为装箱,把引用数据类型转换为对应的基本数据类型为拆箱,jdk1.5之后可以实现自动拆装箱 19,请说出5个异常类型 数组索引下标越界异常,空指针异常,文件找不到异常,类型转换异常,算数异常 ArithmeticException 算术异常,如除以0 ArrayIndexOutOfBoundsException 数组下标出界 IOException I/O异常的根类 FileNotFoundException 不能找到文件 NullPointerException空指针异常 20, HashSet 的去重原理 不同的对象,地址值肯定不同,地址不同,直接插入数据成功 如果地址值相同,不能证明是同一个对象 需要通过equals 的方法继续比较,比较的是对象中的每一个内容 如果内容相同证明是同一个对象,插入失败 如果内容不同,证明不是同一个对象,数据插入成功 21, jvm内存划分 jvm分为方法区,堆内存,栈内存,本地方法栈,程序计数器, 方法区: 主要存.class字节码文件,静态变量,字符串常量 堆内存: 主要存new出来的对象,数组也在堆内存中 栈内存: 存正在执行的方法,局部变量也在栈内存中 22, 构造方法是否可以被重写?为什么? 构造方法不能被重写,因为构造方法要求,方法名与类名保持一致, 23, Collection 与 Collections 的区别 collection是单列集合的顶层父接口,Collections 是处理集合的工具类 24, 集合与数组的区别 集合与数组都是容器 数组既可以存基本数据类型也可以存引用数据类型,数组的长度固定不能发生改变 集合只能存引用数据类型,可以存任意的引用数据类型,长度可变 25, 多线程的三种实现方式 1, 继承Thread,重写run方法,最后创建Thread 的子类对象,调用start()方法开启线程任务 2, 实现Runnable接口,重写run方法,创建Runnable 的实现类对象,通过Thread 的构造传递,调用start() 方法开启线程任务 3, 实现Callable接口,重写call方法,创建Callable的实现类对象,将Callable 的实现类对象,传递到FutureTask的构造方法中,最后将FutureTask传递到Thread 的构造方法中,通过start()方法开启线程任务 26, 多线程的生命周期 多线程的生命周期有5种状态,分别是 新建态,就绪态,运行态,阻塞态和死亡态 新建态: 刚new出来的时候 就绪态: 已经.start(),没有获取到cpu资源 运行态: 获取到cpu资源进入运行态 阻塞态: 线程遇到sleep(),遇到wait() 或者io流阻塞让cpu资源丢失 死亡态: 线程正常结束,线程任务出现异常 27, TreeSet和HashSet的区别 TreeSet 和 HashSet 一样都有 无序无索引不能重复 TreeSet 可以进行根据一定的排序规则进行排序 HashSet 没有排序的规则 28, TreeMap如何去重 TreeMap去重 是利用key值的 compareTo 方法,compareTo方法为0,就证明是同一个元素,进行去重 29,所学习的io流一共分为几类 IO流根据流向 有输入流和输出流两种 IO流根据类型分类有 字节输入输出流 和 字符输入输出流 字节输入流 InputStream 字节输出流 OutputStream 字符输入流 Reader 字符输出流 Writer 30, 目前学习的最高效的文件复制方式 高效缓冲流+字节数组 字节数组的大小一般是1024的倍数 最高一般不超过8倍 31,String abc = new String("abc")有几个对象 有两个对象,一个对象"abc"在方法区的字符串常量池中,一个在堆内存中,是new String() 32,map的两种遍历方式 map不能直接遍历,想要遍历有两种间接的方式 1, 通过map方法的 keySet() 方法, 将map中的key 取出来,存到set集合里面,之后遍历set集合,通过map中的 get(key key) 方法取出每一个value值 2, 通过map中的 entrySet() 方法, 将map中的key 和 value 存到 map的内部类 entry中,之后将entry对象存到set集合里面,之后通过遍历set集合,通过entry内部类中的 getKey, 和 getValue 获取每一个值 33,HashMap与HashTable 的区别 HashMap 是线程不安全的,允许有空的键值对 Hashtable 是线程安全的,不允许有空的键值对 34,什么是反射? 反射就是在程序运行时期,动态的获取类中成员信息(构造方法,成员变量,成员方法)的过程! 35, 字节流与字符流有什么区别 字节流是万能流,可以处理任意的文件 字符流不是万能流,只能处理纯文本文件