Java 基础:
- &和&&都可以用作逻辑与的运算符
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
- Collection 和 Collections的区别
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
- String s = new String(“xyz”);创建了几个String Object
答:两个,一个字符对象,一个字符对象引用对象
- Math.round(11.5)等於多少? Math.round(-11.5)等於多少
答: Math.round(11.5)12;Math.round(-11.5)-11;round方法返回与参数最接近的长整数,参数加1/2后求其floor
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)
- Java有没有goto
答:java中的保留字,现在没有在java中使用
- 数组有没有length()这个方法? String有没有length()这个方法
答:数组没有length()这个方法,有length的属性。String有有length()这个方法
- Overload和Override的区别。
Overloaded的方法是否可以改变返回值的类型
方法的重写Overriding和重载Overloading是Java多态性的不同表现。果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型
- error和exception有什么区别
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况
- List, Set, Map是否继承自Collection接口
答: List,Set是,Map不是
- Set 和 List 的特点跟区别?
(1) List:
- 是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引来访
问 List 中的无素,这类似于 Java 的数组。 2)凡是可以操作索引的方法都是 List 接口特有方法。
(2) Set: - 接口存储一组唯一,无序的对象(存入和取出的顺序不一定一致)。 2) 操作数据的方法与 List 类似,Set 接口不存在与索引相关的方法。
- 构造器Constructor是否可被override
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading
- 是否可以继承String类
答:String类是final类故不可以继承
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
答:会执行,在return前执行
- 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
答:不对,有相同的hash code
- 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
答:是值传递。Java 编程语言只有值传递参数。
- swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
答:witch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich
- char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的
- float型float f=3.4是否正确?
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
- 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以。必须只有一个类名与文件名相同。
- List、Map、Set三个接口,存取元素时,各有什么特点?
答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。
- 说出一些常用的类,包,接口,请各举5个
答:常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的接口:Remote List Map Document NodeList
- 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
- Sting与StingBuffer的区别。
答:Sting的长度是不可变的,StingBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
- Java 的跨平台是通过什么实现的?
通过在不同平台上安装相应的 Java 虚拟机实现的;虚拟机可以将字节码文件(class)解释成相应平台的机器 语言并执行。
- public class 的类名必须跟文件名保持一致吗?
public class 的类名必须跟文件名保持一致
- 一个 Java 源文件可以写多个 class 吗?编译后,会不会生成多个 class 文件?
一个 Java 源文件可以写多个 class 编译后会生成多个 class 文件
- 标识符能不能使用汉字开头?为什么?
可以,字母的含义包括:英文、汉字等(不建议大家使用汉字来定义标识符)
- byte,short,int,long 类型,分别占用几个字节?表数范围多大?
byte: 1个字节 -128~127
short: 2个字节 -215~215-1
int: 4个字节 -231~231-1
long: 8 个字节 -263~263-1
float:4 个字节
double:8 个字节
- 字符型变量几个字节? 这种写法对不? char c = “d”;
字符型变量占 2 个字节 写法不对,应该为 char c=‘d’;
- 布尔型变量占用空间是一位还是一个字节?
布尔型变量占一位
- 这种写法好不好? if(b==true)
不好,但是正确的写法。为了避免不小心写错成 if(b=true),一般程序员都直接写为 if(b)
- 类名的命名规则是? 方法名、变量名的命名规则是否一致? 常量的命名规则是?
类的命名规则:每个英文单词的首字母都大写 方法名、变量名的命名规则:第一个单词首字母小写,从第二个单词后,每个单词的首字母大写 常量的命名规则:字母全部大写
- 引用类型是占用几个字节?
引用数据类型占 4 个字节,用于存储对象的引用
- 算术运算符中类型提升是怎么回事?
a+b 返回什么类型? int a=3; long b=3;
- 关系运算符中,能不能这么写:“1<a<3”?
不能,应该写为 a>1&&a<3
- int 能否自动转换成 byte,short,char? 是否有一定条件才能转换?
不能 需要强制类型转换
- long 能自动转换成 int 吗?long 能自动转换成 float 吗?
Long 不可以自动转成 int long 可以自动转成 float
- 强制类型转换中,是否可能发生数据丢失?
可能发生数据丢失
- 布尔类型能否自动转换为 int? 如果不能,简述理由。
不能 因为类型不匹配
- switch 中的表达式的结果需要是什么类型?
byte,char,short,int jdk1.5 加入了枚举 jdk1.7 加入了 String
- 循环中,break 的作用是?continue 的作用是?
break 用于强行退出循环,不执行循环中剩余的语句
continue 用于跳过本次循环, 不执行 continue 后的语句, 继续下一次循环
- 方法的定义中,return 是否必须?它有什么作用?
不是必须
return 语句终止方法的运行并指定要返回的数据
- Java 中,参数的传递使用值传递还是引用传递?
值传递
- String 类的 trim()方法是什么作用?
返回字符串的副本,去掉字符串前后的空格
- StringBuffer 和 StringBuilder 的联系是?区别是?
StringBuffer 和 StringBuilder 都是可变字符序列,底层数组结构都是 char 类型的数组 区别:
StringBuffer:jdk1.0 版,线程安全,但是效率低
StringBuilder:jdk1.5 版,线程不安全,但是效率高
-
System.currentTimeMillis()表示什么意思?
返回以毫秒为单位的当前时间
-
File 类的方法 mkdir 跟 mkdirs,有什么区别?
mkdir:只能在已经存的目录中创建文件夹
mkdirs:可以在不存的目录中创建文件夹
- 说出 ArrayLIst、LinkedList、Vector 的区别。
ArrayList、LinkedList 两者都实现了 List 接口,都具有 List 中元素有序、不唯一的特点。
ArrayList 实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;
LinkedList 采用链表存储方式。插入、删除元素时效率比较高
- 我有一些数据,需要频繁的查询,插入和删除操作非常少,并且没有线程之间的共 享,使用 List 下面的哪个实现类好一些?
ArrayList。ArrayList 实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率 比较高。
- equals 返回 true,hashcode 一定相等吗?
是的。
-
HashSet 和 TreeSet 的区别
HashSet:
(1) 存储结构:采用 Hashtable 哈希表存储结构 (2) 优缺点:
优点:添加速度快,查询速度快,删除速度快
缺点:无序
TreeSet
(1) 存储结构: 采用二叉树的存储结构
(2) 优缺点: 优点:有序(排序后的升序)查询速度比 List 快 (按照内容查询)
缺点:查询速度没有 HashSet 快. -
Map 中,key 能否重复?如果重复,会有什么现象?
key:无序,唯一;
添加重复的 key 不报错,会把之前重复的 key 覆盖了。
- Set 和 Map 的集合类名称相似,有没有内在的联系?
HashMap 和 HashSet 这些集合类采用的是哈希表结构,需要用到 hashCode 哈希码和 equals 方法。
- Collection 和 Collections 有什么区别?
Collection 是 Java 提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口 List 和 Set。
Java 中还有一个 Collections 类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安 全化等操作。
- Vector 和 ArrayList 的区别和联系
实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
两者的主要区别如下
- Vector 是早期 JDK 接口,ArrayList 是替代 Vector 的新接口
- Vector 线程安全,ArrayList 重速度轻安全,线程非安全
- 长度需增长时,Vector 默认增长一倍,ArrayList 增长 50%
- Hashtable 和 HashMap 的区别联系
实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用
两者的主要区别如下
- Hashtable 是早期 JDK 提供的接口,HashMap 是新版 JDK 提供的接口
- Hashtable 继承 Dictionary 类,HashMap 实现 Map 接口
- Hashtable 线程安全,HashMap 线程非安全
- Hashtable 不允许 null 值,HashMap 允许 null 值
- word 文档能使用字符流操作吗?为什么?
不能。因为 word 文档不是纯文本文件,除了文字还包含很多格式信息。不能用字符流操作。可以用字节流操 作。
- 流对象使用完后,一般要调用 close 方法关闭,释放资源。 这种做法对吗?
对。因为绝大多数流对象都打开了底层操作系统的 IO,如果不手动关闭,底层操 作 系统资源会一直使用,造成资源浪费,最终造成宕机。
- InputStream 和 OutputStream 基本特点是?
二者都是【字节】输入输出流的抽象父类。以字节为单位处理数据,每次读取/写入一个字节。适合处理
二进制文件,如音频、视频、图片等。实现类有 FileInputStream 和 FileOutputStream 等
- Reader 和 Writer 的基本特点是?
二者都是【字符】输入输出流的抽象父类。以字符为单位处理数据,每次读取/写入一个字符。适合处理 文本文件。实现类有 FileReader 和 FileWriter 等。
- FileInputStream 和 FileOutputStream 的基本作用是?
二者都是【字节】输入输出流的实现类,其抽象父类是 InputStream 和 OutputStream。以字节为单位
处理数据,每次向/从指定文件读取/写入一个字节。适合处理二进制文件,如音频、视频、图片等。
- FileReader 和 FileWriter 的作用是?
二者都是【字符】输入输出流的实现类,其抽象父类是 Reader 和 Writer。以字符为单位处理数据,每次向/从指定文件读取/写入一个字符。适合处理文本文件。
- BufferInputStream 和 BufferedOutputStream 的特点是?
BufferInputStream 和 BufferedOutputStream 分别是【缓冲】字节输入输出流,还有【缓冲】字符输入输出流
(BufferReader 和 BufferedWriter)。 缓冲流是处理流,它不直接连接数据源/目的地,而是以一个节点流为参数,在节点流的基础上,提供一些简单操作。
先说不带缓冲的流的工作原理吧:它读取到一个字节/字符,就向用户指定的路径写出去,读一个写一个,所以就慢了。 带缓冲的流的工作原理:读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从而提高了工作 效率
优点:减少对硬盘的读取次数,降低对硬盘的损耗。
- unicode 字符集是几个字节表示一个字符?为什么需要 utf-8?
Unicode 字符集中 2 个字节表示一个字符。
- 说说:sleep、yield、join 方法的区别。
sleep():在指定时间内让线程暂停执行,进入阻塞状态。
在指定时间到达后进入就绪状态。线程调用 sleep()方法时,释放 CPU 当不释放对象锁(如果持有某个
对象的锁的话)。
join(): 当前线程等待调用此方法的线程执行结束再继续执行。如:在 main 方法中调用 t.join(),那 main
方法在此时进入阻塞状态,一直等 t 线程执行完,main 方法再恢复到就绪状态,准备继续执行。 yield(): 调用该方法的线程暂停一下,回到就绪状态。所以调用该方法的线程很可能进入就绪状态后马
上又被执行。
- wait、notify、notifyAll 是在 Object 类中定义的方法吗?作用分别是什么?
wait(),notify(),notifyAll()不属 于 Thread 类,而是属于 Object 类,也就是说每个对象都有 wait(),notify(),notifyAll()的功能。因为每个对像都有锁,锁是每个对像的基 础,而 wait(),notify(),notifyAll()都是跟锁有关的方法
- wait 方法被调用时,所在线程是否会释放所持有的锁资源? sleep 方法呢?
wait:释放 CPU,释放锁; sleep:释放 CPU,不释放锁。
- 谈谈对java多态的理解
同一个消息可以根据发送对象的不同而采用多种不同的行为方式,在执行期间判断所引用的对象的实际类型,根据其实际的类型调用其相应的方法。
作用:消除类型之间的耦合关系。实现多态的必要条件:继承、重写(因为必须调用父类中存在的方法)、父类引用指向子类对象
- final,finally,finalize的区别
- final:变量、类、方法的修饰符,被final修饰的类不能被继承,变量或方法被final修饰则不能被修改和重写。
- finally:异常处理时提供finally块来执行清除操作,不管有没有异常抛出,此处代码都会被执行。如果try语句块中包含return语句,finally语句块是在return之后运行;
- finalize:Object类中定义的方法,若子类覆盖了finalize()方法,在在垃圾收集器将对象从内存中清除前,会执行该方法,确定对象是否会被回收。
- 序列化Serializable 和Parcelable 的区别
- 序列化:将一个对象转换成可存储或可传输的状态,序列化后的对象可以在网络上传输,也可以存储到本地,或实现跨进程传输;
- 为什么要进行序列化:开发过程中,我们需要将对象的引用传给其他activity或fragment使用时,需要将这些对象放到一个Intent或Bundle中,再进行传递,而Intent或Bundle只能识别基本数据类型和被序列化的类型。
- Serializable:表示将一个对象转换成可存储或可传输的状态。
- Parcelable:与Serializable实现的效果相同,也是将一个对象转换成可传输的状态,但它的实现原理是将一个完整的对象进行分解,分解后的每一部分都是Intent所支持的数据类型,这样实现传递对象的功能。
- 区别:Serializable在序列化时会产生大量临时变量,引起频繁GC。Serializable本质上使用了反射,序列化过程慢。Parcelable不能将数据存储在磁盘上,在外界变化时,它不能很好的保证数据的持续性。
- 选择原则:若仅在内存中使用,如activity\service间传递对象,优先使用Parcelable,它性能高。若是持久化操作,优先使用Serializable