Java面试题大全(Java基础十二)
2016-09-29 16:53
295 查看
66、说出一些常用的类,包,接口,请各举5个
常用的包有:
java.lang包下包括Math、System、StringBuilder、StringBuffer、Runtime、Thread、Runnable等。
java.util包下包括List、Set、Map,以及这些接口的常用实现类:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。
java.io包下包括InputStream、OutputStream、Reader、Writer、FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter等
java.sql包下包括Connection、Statement、PreparedStatement、ResultSet等。
java.net包下包括Socket、ServerSocket、URL、URLConnection、DatagramPacket、DatagramSocket等。
如果为让别人感觉你对Android很熟悉,还应该增加一些Android常用的包、类,如:
android.app包下有:Activity、ListActivty、TabActivity、AlertDialog、AlertDialog.Builder、Notification、Service等。
android.content包下有:ContentProvider、ContentResolver、ContentUris、ContentValues、Context等
android.database包下有Cursor等
android.database.sqlite包下有:SQLiteDatabase、SQLiteOpenHelper等
android.graphics包下有Bitmap、BitmapFactory、Canvas、Color、Matrix、Paint、Path等。
android.widget包下有TextView、Button、CheckBox、RadioButton、ListView、GridView、Spinner、Gallery等。
67、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流由InputStream OutputStream派生出来,字符流由Reader、Writer派生出来。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
68、字节流与字符流的区别
字节流和字符流区别非常简单,它们的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同:字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。
字节流直接是基于字节进行输入、输出的,因此它的适用性更广。字符流则在处理文本内容的的输入、输出时更加方便——不会出现读取半个字符的情形。
Java提供了将字节流转换为字符串的InputStreamReader和OutputStreamWriter,但没有提供将字符流转化为字节流的方法。因为:字节流比字符流的使用范围更广,但字符流比字节流操作方便。如果有一个流已经是字符流了,也就是说是一个用起来更方便的流,为什么要转换成字节流呢?反之,如果现在有一个字节流,但我们知道这个字节流的内容都是文本内容,那么把它转换成字符流来处理就会更方便一些,所以Java只提供了将字节流转换字符流的转换流,没有提供将字符流转换成字节流的转换流。
69、什么是Java序列化,如何实现Java序列化?或者请解释Serializable接口的作用。
象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流(无论是从磁盘中获取,还是通过网络获取),都可以将这种二进制流恢复成原来的Java对象。
实现Java序列化有两种方式:
A.让Java类实现Serializable接口。
B.让Java类实现Externalizable接口,实现该接口时还必须实现readExternal、writeExternal O这两个方法。
一旦Java类实现了上面两种接口,接下来程序中就可通过ObjectInputStream、ObjectOutputStream来读取、保存Java对象。
Serializable接口只是一个标记接口,实现该接口无需实现任何方法,实现了该接口的类就是可序列化的类。
序列化对于Java开发非常重要,例如在web开发中,如果对象需要保存在了Session中,Tomcat在某些时候需要把Session中的对象序列化到硬盘,因此放入Session中的对象必须是可序列化的,要么实现Serializable接口,要么实现Externalizable接口。还有,如果一个对象要经过网络传输(比如RMI远程方法调用的形参或返回值),这个对象也应该是可序列化的。
70、描述一下JVM加载class文件的原理机制?
当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过
加载
连接
初始化
三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或类初始化。
类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。
类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是我们前面所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。
通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种来源:
A.从本地文件系统来加载class文件,这是前面绝大部分类加载方式。
B.从JAR包中加载class文件,这种方式也是很常见的,前面介绍JDBC编程时用到的数据库驱动类就是放在JAR文件中,JVM可以从JAR文件中直接加载该class文件。
C.通过网络加载class文件。
D.把一个Java源文件动态编译、并执行加载。
当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:
1.Bootstrap ClassLoader:根类加载器。
2.Extension ClassLoader:扩展类加载器。
3.System ClassLoader:系统类加载器。
Bootstrap ClassLoader,被称为引导(也称为原始或根)类加载器。它负责加载Java的核心类。在Sun的JVM中,当执行java.exe的命令时使用-Xbootclasspath选项或使用-D选项指定sun.boot.class.path系统属性值可以指定加载附加的类。
Extension Classloader,被称为扩展类加载器,它负责加载JRE的扩展目录(%JAVA_HOME%/jre/lib/ext或者由java.ext.dirs系统属性指定的目录)中JAR包的类。
通过这种方式,我们就可以为Java扩展核心类以外的新功能,只要我们把自己开发的类打包成JAR文件,然后放入JAVA_HOME/jre/lib/ext路径即可(对于笔者的安装环境来说,扩展路径为:D:/Java/jdk1.7.0/jre/lib/ext)。
System Classloader,被称为系统(也称为应用)类加载器,它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()获取系统类加载器。如果没有特别指定,则用户自定义的类加载器都以类加载器作为父加载器。
常用的包有:
java.lang包下包括Math、System、StringBuilder、StringBuffer、Runtime、Thread、Runnable等。
java.util包下包括List、Set、Map,以及这些接口的常用实现类:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。
java.io包下包括InputStream、OutputStream、Reader、Writer、FileInputStream、FileOutputStream、FileReader、FileWriter、BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter等
java.sql包下包括Connection、Statement、PreparedStatement、ResultSet等。
java.net包下包括Socket、ServerSocket、URL、URLConnection、DatagramPacket、DatagramSocket等。
如果为让别人感觉你对Android很熟悉,还应该增加一些Android常用的包、类,如:
android.app包下有:Activity、ListActivty、TabActivity、AlertDialog、AlertDialog.Builder、Notification、Service等。
android.content包下有:ContentProvider、ContentResolver、ContentUris、ContentValues、Context等
android.database包下有Cursor等
android.database.sqlite包下有:SQLiteDatabase、SQLiteOpenHelper等
android.graphics包下有Bitmap、BitmapFactory、Canvas、Color、Matrix、Paint、Path等。
android.widget包下有TextView、Button、CheckBox、RadioButton、ListView、GridView、Spinner、Gallery等。
67、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流由InputStream OutputStream派生出来,字符流由Reader、Writer派生出来。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
68、字节流与字符流的区别
字节流和字符流区别非常简单,它们的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同:字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。
字节流直接是基于字节进行输入、输出的,因此它的适用性更广。字符流则在处理文本内容的的输入、输出时更加方便——不会出现读取半个字符的情形。
Java提供了将字节流转换为字符串的InputStreamReader和OutputStreamWriter,但没有提供将字符流转化为字节流的方法。因为:字节流比字符流的使用范围更广,但字符流比字节流操作方便。如果有一个流已经是字符流了,也就是说是一个用起来更方便的流,为什么要转换成字节流呢?反之,如果现在有一个字节流,但我们知道这个字节流的内容都是文本内容,那么把它转换成字符流来处理就会更方便一些,所以Java只提供了将字节流转换字符流的转换流,没有提供将字符流转换成字节流的转换流。
69、什么是Java序列化,如何实现Java序列化?或者请解释Serializable接口的作用。
象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流(无论是从磁盘中获取,还是通过网络获取),都可以将这种二进制流恢复成原来的Java对象。
实现Java序列化有两种方式:
A.让Java类实现Serializable接口。
B.让Java类实现Externalizable接口,实现该接口时还必须实现readExternal、writeExternal O这两个方法。
一旦Java类实现了上面两种接口,接下来程序中就可通过ObjectInputStream、ObjectOutputStream来读取、保存Java对象。
Serializable接口只是一个标记接口,实现该接口无需实现任何方法,实现了该接口的类就是可序列化的类。
序列化对于Java开发非常重要,例如在web开发中,如果对象需要保存在了Session中,Tomcat在某些时候需要把Session中的对象序列化到硬盘,因此放入Session中的对象必须是可序列化的,要么实现Serializable接口,要么实现Externalizable接口。还有,如果一个对象要经过网络传输(比如RMI远程方法调用的形参或返回值),这个对象也应该是可序列化的。
70、描述一下JVM加载class文件的原理机制?
当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过
加载
连接
初始化
三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或类初始化。
类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。
类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是我们前面所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。
通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种来源:
A.从本地文件系统来加载class文件,这是前面绝大部分类加载方式。
B.从JAR包中加载class文件,这种方式也是很常见的,前面介绍JDBC编程时用到的数据库驱动类就是放在JAR文件中,JVM可以从JAR文件中直接加载该class文件。
C.通过网络加载class文件。
D.把一个Java源文件动态编译、并执行加载。
当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:
1.Bootstrap ClassLoader:根类加载器。
2.Extension ClassLoader:扩展类加载器。
3.System ClassLoader:系统类加载器。
Bootstrap ClassLoader,被称为引导(也称为原始或根)类加载器。它负责加载Java的核心类。在Sun的JVM中,当执行java.exe的命令时使用-Xbootclasspath选项或使用-D选项指定sun.boot.class.path系统属性值可以指定加载附加的类。
Extension Classloader,被称为扩展类加载器,它负责加载JRE的扩展目录(%JAVA_HOME%/jre/lib/ext或者由java.ext.dirs系统属性指定的目录)中JAR包的类。
通过这种方式,我们就可以为Java扩展核心类以外的新功能,只要我们把自己开发的类打包成JAR文件,然后放入JAVA_HOME/jre/lib/ext路径即可(对于笔者的安装环境来说,扩展路径为:D:/Java/jdk1.7.0/jre/lib/ext)。
System Classloader,被称为系统(也称为应用)类加载器,它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()获取系统类加载器。如果没有特别指定,则用户自定义的类加载器都以类加载器作为父加载器。
相关文章推荐
- java面试题大全-基础方面
- java面试题大全-基础方面
- Java面试题大全(Java基础十一)
- Java面试题大全(Java基础六)
- java基础面试题大全(一)
- java面试题大全-基础方面
- Java面试题大全(Java基础十三)
- Java面试题大全(Java基础八)
- java面试题大全-基础方面 答案自己写
- java面试题大全-基础方面(1)
- Java面试题大全(Java基础三)
- Java面试题大全(Java基础十四)
- java面试题大全-基础方面
- java面试题大全-基础方面
- Java面试题大全(Java基础四)
- Java面试题大全(Java基础五)
- java面试题大全-基础方面
- Java面试题大全(Java基础十)
- Java面试题大全(Java基础七)
- java面试题大全-基础方面