- int与Integer有什么区别?
Java语言是一个面向对象的语言,但是Java中的基本数据类型却不是面向对象的,这在实际使用时存在了很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类成为包装类(Wrapper Class)
Java语言提供两种不同的类型:引用类型和基本数据类型;int是Java语言中的原始数据类型,Integer是Java为int提供的包装类,Java为每个基本数据类型提供了封装类,其中,基本数据类型包括byte、short、int、long、float、double、char、boolean这八个基本数据类型,这八个基本数据类型对应的封装类为Byte、Integer、Long、Float、Double、Character、Boolean。
这八个类中,除了Integer和Character类以外,其他六个类的类名和基本数据类型一致,只是类名的第一个字母大写即可。对于包装类说,这些类的用途主要包含两种:
1)、作为和基本数据类型对应的类类型存在,方便设计到对象的操作。
2)、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
- 查看示例代码。
解释上述代码中,"System.out…"两句代码输出完全不同的结果?
"Hello"是一个字符串常量,它存放在内存的常量池中。在第一行代码执行后创建此
- 如何将int型变量转换为String类型的变量?如何将String类型变量转换成int类型变量?
- 加法运算符+可以施加于原始数值类型(比如int)的变量,但我们发现一些对象类型(比如Integer)的变量,也支持+运算,请看代码。
这看上去好像Integer类型重载了"+"运算符,一些编程语言比如C++可以重载运算符,但Java本身并不支持这一特性,依照你的理解或猜测,Java采用什么方法处理两个Integer对象直接"+"的语句?
- 通过正则表达式判断一个字符串:首位是字母,后面可以是字母、数字或者下划线,总长度6-18位?
- 请写出中国身份证号的正则表达式。
- Java中字符串转换到数字的API。
将String类型变量Byte、Short、Integer、Long、Float、Double的API如下显示。
- Anonymous Inner Class(匿名内部类)是否可以extends(继承)其他类?是否可以implements实现interface接口。
匿名内部类可以继承其他类或实现其他接口,在Java编程中常用此方式。
- 内部类可以引用其他包含类的成员吗?有没有什么限制。
- 内部类的实现方法。
- Checked Exception和Unchecked Exception是什么以及他们的区别。
- 在Java语言中,如何引发异常,对异常处理的两条途径是什么?
- 异常分几种类型?有什么区别?写出几个常见异常。
异常(Exception)分为两类:运行时异常和非运行时异常。
运行时异常和非运行时异常时运行时异常(RuntimeException)又称为非检查异常,非运行时异常指的是检查异常。运行时异常是指直接或间接继承RuntimeException的异常。非运行异常是除了RuntimeException以外的其他异常,是程序有逻辑错误,程序员应该积极避免其出现的异常。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出来未捕获的运行时异常。
常见的运行时异常:
- NullPointerException:当操作一个空引用时出现的异常。
- NumberFormatException:试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
- ClassCastEcception:强制类型转换不匹配时出现此异常。
- ArrayIndexOutOfBoundsException:当使用一个不存在的数组下标时出现此异常。
- ArithmeticException:当出现异常的运算条件时出现此异常。
常见的非运行时异常:
1)、SQLException:提供关于数据库访问错的异常。
2)、IOException:当发生某种I/O异常时,抛出此异常。
3)、ClassNotFoundException:当应用程序试图使用Class类中的forName方法、loadClass方法时,抛出的异常。
- Java中的一场处理机制的简单原理。
- try中又一个return语句,那么紧跟在try后的finally里的代码块会不会执行,什么时候被执行,在return之前还是之后。
会,在return之前。
- 当使用多个catch语句捕获多个异常时,Java规定捕获Exception的catch语句必须排在最后。如下所示,为什么有此限制,谈谈你的理解。
为什么会有这个限制?谈谈你的理解。
- Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表是什么意思?在try语句块中可以抛出异常吗?
- final,finally,finalize的区别?
final是一个修饰符。如果一个类被生命为final,意味着它不能再派生出新的子类,不能作为父类被继承,因此一个类不能既被声明为abstract的,又被声明为final的;将变量或方法声明为final,可以保证他们在使用中不被改变;被声明为final的变量必须在声明时就给定初始值,而在以后引用中只能读取,不可修改;被声明为final的方法也同样只能使用,不能重载。
finally用在异常处理时提供finally块来执行任何清除操作;如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果由的话)
finalize是方法名,Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是Object类中定义的,因此所有的类都继承它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。
- 阐述一下IndexOutOfBoundsException通常在什么情况下发生。
指示某排序索引(例如对数组、字符串等)超出范围时抛出。例如:当使用一个不存在的数组下标时出现ArrayIndexOutOfBoundsException。
- 阐述一下NullPointerException通常在什么情况下发生。
通常在操作一个空引用时会产生NullPointerException,例如:空引用调用属性或方法时。
- 阐述一下ClassCastException通常在什么情况下发生。
- 画出集合的框架图。
- 编写一段程序,用来创建和迭代一个List
- 编写一段程序,用来创建和迭代一个Set
- 编写一段程序,用来创建和迭代一个Map
- Collection和Collections的区别。
Collection是java.util下的接口,它是各种集合的父接口,继承于它的接口主要有Set和List;Collections是个java.util下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
- 说说Java集合类:HashMap是如何设计的?是如何解决什么冲突的。
1)、HashMap是基于哈希表的Map接口的非同步实现。在Java编程语言中,最基本的结构就是两种,一个是数组,另一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际是一个“链表的数组”的数据结构,每个元素存放链表头结点的数组,即数组和链表的结合体。HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。Entry就是数组中的元素,每个Map.Entry其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。
2)、HashMap的存储。当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将钙元素放到此数组中的该位置上。
3)、HashMap的存储。当我们往HashMap中put元素的时候,先根据key的hashCode,找到数组中的对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
4)、HashMap的resize(rehash):当HashMap中的元素越来越多时,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询效率,就要对HashMap的数组进行扩容,数据扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据
- 简述HashTable原理,并说明它和HashMap区别?
- HashMap和HashSet有什么关系。
- Vector和ArrayList有什么差异。
- List、Set、Map是否继承自Collection接口。
List,Set继承于Collection接口,而Map没有继承自Collection接口
- List底层是怎么实现的?双向链表和数组的区别。
在Java中List是一个接口,继承于Collection接口,并定义了添加元素,删除元素,取出元素等对集合操作的抽象方法。
双向链表和数组的区别:
1)、数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
2)、链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入,删除数据项;而数组中插入、删除数据项时,需要移动其他数据项,非常繁琐。
- 说出ArrayList,Vector,LinkedList的存储性能和特性。
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,他们都允许直接按照序号索引元素,到那时插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用的是synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据只需记录本项的前后项即可,所以插入速度较快。
- 请通过一次循环,清除掉一个ArrayList中的每个元素。
- 设计一个程序基于Map泛型完成10个英文单词的翻译。
- Set里的元素是不能重复的,用什么方法来区分重复与否,用==还是equals,他们有什么区别。
- 编写一个List集合,存储通讯录。(同学姓名和电话)并输出通讯录
- 有两个List<Integer>,写一个方法要求合并这两个结合,不能有重复的,不能用集合的sort等方法,而且要求中间的数字最大,两边逐渐减小。例如(m是集合的size)(get(0)<get(m-1),get(1)<get(m-2))。
- 将文件夹a(包括其下所有子文件夹和文件)复制到文件夹b下。要求:使用10个线程同时进行,每一个线程独立处理一个文件。
- 请说明什么是线程安全?
- 为什么要使用多线程编程?
- 启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使得线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。但并不意味着线程就会立即运行,run()方法可以产生必须退出的标识来停止一个线程。
- sleep()和wait()有什么区别?
sleep方法:是线程类(Thead)的方法,导致此线程暂时执行指定的时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才能进入到锁定池准备获得对象锁进入运行状态。
- sleep()和yield()有什么区别?
yield方式只是让出分配给自己的cpu时间片,并且会立刻进入Runnable状态参与cpu时间的竞争,若程序中没有其他线程,那么该线程马上就会开始往下执行,sleep会进入Blocked状态,等待时间结束时间的发生,然后进入Runnable状态参与cpu时间的竞争。
- 当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法?
其他线程只能访问该对象的其他非同步方法,同步方法则不能进入。
- 请说出你所知道线程同步的方法?
- 同步和异步有何异同,在什么情况下分别使用它们?举例说明?
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
- 分别用Java中多线程的两种方法实现:输出字符串"Hello",要求每间隔1s输出一个字母。
- 线程池是什么?
当一个程序中若创建大量线程,并在任务结束后销毁,会给系统带来过度消耗资源,以及过度切换线程的危险,从而可能导致系统崩溃。为此我们应使用线程池来解决这个问题,
首先创建一些线程,他们的集合称为线程池,当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务结束后不关闭该线程,而是将该线程还回到线程池中,子线程池的编程模式下,任务是提交给线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有误空闲的线程,再把线程提交给内部某个空闲的线程,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
- 写一个简单的socket实现聊天功能的例子(不要求界面,只实现数据传输)一个主服务端,一个客户端。
- Java Socket编程,从服务器读几个字符,再写入本地控制台。
- 什么时候Java序列化,如何实现Java序列化。
序列化就是一种个用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题;序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有要实现的方法,只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话用输入流。
- Java中有几种类型的流?jdk为每种类型的流提供一些抽象类以供继承,请说出分别是哪些类。
Java中有字节流,字符流。
字节输入流的父类为InputStream、字节输出流的父类为OutputStream;字符输入流的父类为Reader、字符输出流的父类为Writer。
- 字节流与字符流的区别?
- 文件和目录(IO)操作
- 如何列出某个目录下的所有文件?
- 如何列出某个目录下的所有子目录?
- 如何判断一个文件或目录是否存在?
- String s = new String("xyx"); 创建了几个String Object?
- 是否可以继承String类?
- 说出"==" 和"equals()"方法在字符串变量操作中的不同?
- 数组有没有length()这个方法?String有没有length()方法?
- String, StringBuffer, StringBuilder的区别?
String的长度是不可变的;StringBuffer的长度是可变的,如果对字符串中的内容经常进行操作,特别是内容要修改时,则使用StringBuffer,如果最后需要String,那么使用StringBuffere的toString()方法转换成String类型的数据;
StringBuffer是线程安全的;StringBuilder是从JDK1.5开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
- 编写程序将由数字及字符组成的字符串中的数字截取出来被按顺序输出,例如:"ABC127GMNQQ2049PN5FFF"输出的结果应该为01234579。
- String s = "abcdefghigklmnopqrstuvwxyz"; 编写一段程序,实现"mnop"输出。
- 在Java代码中有一个字符串String ss = "abc,efgAA,12q,456,zA,KJD";在不使用split方法的情况下写一段代码实现按"," 拆分字符的功能,并输出结果。
- 从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排,最后把已处理的字符串(应不含标点符号)扔按行重新存入字符串数组xx中,最后把结果xx输出到文件out.dat中。
- Class.forName(String class) 的功能?
如果没有加载给定字符串对应的类,要加载这个类,然后返回与带有给定字符串名的类或接口相关联的Class对象。
- 谈谈对反射技术的理解。
- 如何获得当前日期时间。
- 如何将日期时间转换成想要的格式。
- 编写程序,计算任意两个日期之间的天数。
- 什么是标识接口(Mark Interface),它与接口的区别在什么地方,并简单列举你知道的标识接口。
- 请使用Java语言定义一个具备栈功能的类,实现以下接口。
public interface StackInterface{
void push(Object value):
Object pop();
Boolean isEmpty();
}
- 编写一个程序,用户输入任何一个字符串以后,反转输出其结果。其运行结果如下所示:
- 请输入一个字符串:我在学习Java程序设计
- 您输入了:计设序程avaJ习学在我。
- 请用面向对象的思想设计一个计算机程序,请写出程序框架(主要使用的类和方法)
- 写一个函数,2个参数,1个字符串,1个字节数,返回截取的字符串,要求字符串中的中文不能出现乱码:如("我ABC",4)应该截为"我AB", 输入(“我ABC汉DEF”, 6)应该输出为"我ABC"而不是"我ABC+汉的半个"
- 日期和时间
- 如何取得年月日、小时分秒
- 如何取得从1970年到现在的毫秒数
- 如何取得某个日期的当月的最后一天
- 如何格式化日期
- 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数?
- 写一个函数,要求输入一个字符串和一个字符的长度,对该字符串进行分割?
- Java类实现序列化的方法?在collection框架中,实现比较要实现什么样的接口?
- 设计4个线程,其中两个县城每次对j增加1,另两个县城对j每次减少1;写出程序?
- 请写出线程的实现方式?
- 字符串"sh24sdgf909sdf8",不改变原字符串对象,写一个方法,返回"shsdgfsdf"?
- "driver|name|id|"写一个函数,分别获取driver,name,id并输出。
- 剔除下面字符的","。例如:字符串"A, B, C, D, E, F" ,剔除的返回结果为"ABCDEF"
- 编写一个命令行程序,提示输入2个字符串,找出2串字符串中是否存在相同的长度为3的字符串,比如字符串"abc12uwks"和字符串"q72bnabc00",则把abc找出来。
- 现有一个数组int data_arr[]={12,31,56,23,277,1,43,65,4,99},已完成如下代码,请在注释处增加一段代码,实现这样的功能:将data_arr数组的内容先写入一个名为"temp.dat"文件中,再重写将该文件的内容读出,能逆序将文件的内容输出至控制台(形如99,4,65,1,27,23,56,31,12)
答案:
- 现有一个程序需要记录运行中的关键信息,要求在内存中保留最近的n条信息供查询。保存的信息不需要做持久化处理,要求提供一个独立的日志类,负责对日志的写入和读取,请列出该类所应具有的方法并写出大致的实现代码。
注:持久化指的是将数据存入数据库或存为文件。读取日志时只要求能一次性读出现有的所有记录。
- 数学中,一个复数包容着一个实部(Real)和一个虚部(Imaginary),请设计一个Complex类,它的实例代表一个复数,并且用户可以这样使用它:
//创建一个实部为3,虚部为4的复数
Complex obj = new Complex(3,4);
//Complex对象具备按照数学中复数的习惯表示形式输出的能力
System.out.println(obj);//输出:3+41
- 我们可以调用Integer.parseInt()方法将一个字符串转化为int类型,但当要转换的字符串不是一个有效的数字时(比如a123),此方法会抛出一个NumberFormatException?要求编写一个程序,当程序运行时让用户从键盘上输入一个字符串,代表考试成绩,然后调用Integer.parseInt()方法将其转换为int类型,并给出是否通过的提示,控制台交互过程如下:
- 请输入您的考试成绩:76
- 恭喜您通过了考试
由于无法控制用户的输入,因此会出现两种情况
- 用户输入一个无法转换为int的字符串;
- 用户输入的数字不在[0-100]区间内。
请设计一个自定义的异常类InvalidScoreException,当出现上述异常情况时抛出此异常对象。要求程序运行时,对用户的错误输入能给以明确的提示。
首先,自定义异常处理类InvalidScoreException,代码如下:
然后,当用户输入了一个无法转换为int类型的字符串或用户输入的数字不在[0,100]区间内时抛出自定义异常InvalidScoreException,代码如下所示:
- 设计一个类,实现如下图所示的状态机?
提示:上图说明,当使用new关键字创建此类对象时,对象居于Created状态(这是初始状态),这时,调用对象的open()方法,对象转换到Opened状态,再调用对象的close()方法,对象转入"Closed"状态,这是终止状态
- 一个图书管理系统的面向对象设计方案如下图所示。
Book代表书,有Name(书名)、Author(作者名)、Price(单价)和IsBorrowed(是否被借出)四个属性。
类Library代表图书馆,其内部字段books用于保存图书馆中所有的书。它的FindBook()方法依据书名查找同名的书(可能有多本),另一个GetAllBooks()方法获取图书馆所有的详细信息
类Reader代表读者,Name字段代表其姓名,读者可以ReturnBook(还书)和BorrowBook(借书)
请编写完成以下工作:
- 用java编程实现上述三个类。
- 在main()方法中书写以下的测试代码:
- 创建一个Library类的实例myLittleLibrary,其中预存3本书
- Java程序设计,张三著,45元
- Java核心技术,李四著,50元。
- Java程序设计,王五著,38元
- 显示图书馆中所有图书的信息,输出样例如下
- Java程序设计,张三著,45元,可借
- Java核心技术,李四著,50元,可借
- Java程序设计,王五著,38元,未还
- 创建一个Reader类的实例oneBeautifulGirl,她先在myLittleLibrary中查找《Java程序设计》
- oneBeautifulGirl借了张三著的那本书,现在显示图书馆中所有图书的信息。
- oneBeautifulGirl把书还了,再次显示图书馆中图书的信息。
注意:在满足题目要求实现功能的前提下,你可以依据自己的考虑修改系统设计方案(比如给某个类添加或修改类的方法,甚至是添加新的类)
- 读取txt文件内容
- 文件内容大致如下:
- 00001 张三 计算机系 男
- 00002 李四 外语系 女
- 读取文件后对内容进行整合,按院系分类输出,格式为:
- 计算机系
- 00001 张三 男…
- 外语系
- 00002 李四 女…
- 文件内容大致如下:
- 采用Java多线程技术(wait和notify),设计实现一个符合生产者和消费者问题的程序,对一个对象(枪膛)进行操作,其最大容量是20颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹?
- 写一个线程,每隔10秒钟标准输出到屏幕一个"hello world"打印10此以后退出。
- 下面两个方法有什么区别?
public synchronized void method(){}
public void method2(){
synchronized(obj){}
}
- 如何取1970到现在的毫秒数?
- 如何格式化日期?
- 给SomeInputStream类的skip函数添加Java注释,需要添加函数本身功能(流指针向后偏移指定长度),作者(答题者姓名),异常,参数,函数返回,函数定义最早出现的版本。
答案:
- 有数组[5,0,-5,2,-4,5,10,3,-5,2,-4,3,4,9,1],请写出代码输出每个数的频率数(正负数算一个数),如下面结果
- 5出现4次
- 0出现1次
- 请写出一个Test类包含divide方法,该方法实现两个整数相除精确返回四舍五入到百分位的数值。
- 将某网页评论提交给后台的字符串str中,如果包含有"\", "<", ">" , "=" 四中符号的,过滤掉以后放置系统被执行恶意代码,写出Java代码。
- 现在给你一个新一代的身份证号,默认为18位号码:如果该号码是15位的话,请在第6位后面加上19,并在末尾加上x;如果是18位则保持不变。
- 编写一个方法:一个字符串数组String s[]={"A","B","C","D","E","F"},请随机生成一个数,比如:生成的数为2,则输出数组中随机两个元素的组合B、E或者A、C等;生成数为3,就为是哪个随机元素组合。
- 请编写一个对于Java例外处理的完整的程序。
首先新建自定义异常类NotNumberException,该异常可以在某个字符串不为数字组成的情况下抛出,代码如下。
然后,新建类ExceptionDemo,在类中添加parseInt方法,该方法用户将字符串转换成整数类型,当该字符串不是由数字组成时,使用throw抛出上面自定义异常NotNumberException,并且在方法声明处,使用throws声明抛出该异常,然后在main方法中调用parseInt方法时,使用try-catch处理异常,代码如下。
- 编写自定义异常,处理输入字符串abc抛出异常,其他不抛出。