1.==和equals的区别
==用于基本数据类型时,比较等号两边值是否相同。
==用于引用数据类型时,比较引用是否相同。
equals本质上就是==但是有很多类,比如String和Integer重写了equals方法,把它变成了值比较。一般情况下equals比较的是值是否相等。
2.两个对象的值相等,那么他们的hashCode()也一定相等吗,反之呢?
两个对象相同,hashCode()一定相等,但是,hashCode()相等的两个对象不一定相等。因为在散列表中,hashCode()相等即两个键值对的哈希值相等,但是哈希值相等并不意味着键值对也相等。比如2+3=5.但是1+4=5他们的和相等,并不代表两个数也相等。
3.java中final关键字有什么用。
final修饰类时,这个类不能被继承。
final修饰变量时,这个变量会变成常量,被赋值后,值不可改变。
final修饰方法时,这个方法不能被重写(也叫覆写,覆盖)但是可以被重载。
4.java中的Math.round(-1.5)等于多少。
在Java中Math.round()方法用于四舍五入取整。
如果是0.5的话就向上取整。-0.5则舍弃小数位。
所以Math.round(-1.5)等于-1;
5.String属于基本数据类型吗?
java中只有8种基本数据类型,他们分别是:
整形: long int short byte
(64位8字节)(32位4字节)(16位2字节) (8位1字节)
浮点型:
float double
(32位4字节) (64位8字节)
字符型:
char
(16位2字节)
布尔型:
boolean
(1位)
6.java中有哪些字符串,它们有什么区别?
Java中有Strin、StringBilder、StringBuffer。
String是值不可变的字符串。(字符串的底层实现都是用char[]数组存储,但是String的底层数组是由final修饰的char[]数组,所以String的值不可变)。 每次对String的操作,都会生成新的String对象,然后将指针指向这个新的对象。而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer是线程安全的,但是它的效率缺=却比较低。StringBuilder是非线程安全的,但是效率更高,所以在单线程的情况下推荐使用StringBuilder,多线程推荐使用StringBuffer。
7.如何使字符串反转
使用StringBuilder或者StringBuffer的reverse方法。
8.String类的常用方法有哪些。
indexOf() 返回对应的索引(下标)。
charAt() 返回指定索引处的字符。
replace() 字符串替换。
split() 分割字符串
length() 获取字符串的长度
subString()截取字符串。
equals() 字符串的比较
toLowerCase()转换成小写字母
toUpperCase()转换成大写字母
9.普通类和抽象类的区别
普通类中不能有抽象方法。抽象类中可以有抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
10.抽象类可以用final修饰吗?
不能,抽象类设计的意义就是为了继承,用final修饰就不能被继承。
11.接口和抽象类有哪些区别?
抽象类有构造方法,接口没有。
抽象类有main函数,接口没有。
抽象类中可以有非抽象的方法,接口中的方法都是抽象的。
接口中的的成员变量都是用public final修饰的,而抽象类中出成员变量不用。
接口中的方法都是用public修饰的,而抽象类中的方法可以使用任意修饰符。
一个类只能继承一个抽象类,但是可以实现多个接口。
12.Java中IO流分几种
按照功能来分,分为输入流和输出流,
按照类型来分,分为字节流和字符流。
字节流和字符流的区别是,字节流以字节为单位按照8位传输数据,字符流以字符为单位,按照16位传输数据。
13.Files的常用方法有哪些。
Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。
19.Collection和Collections有什么区别。
java.util.Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,两个主要的实现类是List和Set
Collections则是集合的一个工具类,其中提供了一系列的静态方法,对集合中的元素进行排序、搜索,线程安全等操作。
20.throw和throws的区别。
throws会声明一个方法可能抛出的所有异常信息,但是throws对异常声明但是不处理,而是将异常往上传,谁调用谁处理。
throw则是跑出一个具体的异常类型
21.final、finally、finalize有什么区别?
final修饰类时,这个类不能被继承,服你那里修饰方法,则这个方法不能被重写,final修饰变量时,变量变成常量,只能被赋值一次,赋值后值不可变。
finally则长用在try-cath 代码块中,通常我们把一定会执行的代码放在finally语句块中,不管会不会跑出异常,finally中的代码都会执行。一般用在存放一些关闭资源的代码。
finalize则是Object中的一个方法一般用于垃圾回收。
22.i++和++i的区别
public class HelloWorld {
public static void main(String[] args) {
int i = 5;
System.out.println(i++); //输出5
System.out.println(i); //输出6
int j = 5;
System.out.println(++j); //输出6
System.out.println(j); //输出6
}
}
23.面向对象的三大特性分别是什么?
1.封装
封装是指隐藏对象的属性和实现细节,仅仅提供公共的访问方式。
封装将外界和内部数据隔离开,降低了外界影响,提高了程序的安全性和可维护性。
封装的好处:
·只能通过规定的方法访问数据,比如(get、set方法)。
·隐藏了类的实现细节
·方便膝盖实现。
·方便加入控制语句。
This关键字:
·调用本类中的属性,也就是类中的成员变量。如this.name
·调用本类中的方法。如this.run();
·调用本类中的其他构造方法,调用时必须放在构造方法的第一行。
2.继承
继承就是子类继承了父类的特征和行为,使得子类具有了父类的属性和方法。
继承提高了代码的复用性,同时使类与类之间产生了关系,为多态提供了前提。
java中只支持单继承。父类的构造方法不能被继承,被private修饰的不能被继承。
super关键字
用来访问父类的成员,super只能出现在子类的方法和构造方法中;
用super方法调用父类方法时必须要在第一具有;
super不能访问父类的private对象。
继承关系下的初始化顺序是怎么样的?
父类属性——父类的构造方法——子类属性——子类构造方法。
方法的重写:
重写后的方法不管是方法名,参数类型,参数个数,返回值类型,都要跟被重写的方法相同。
重写后的方法的访问权限不能比被重写的方法严格。
在调用方法时如果子类没有重写,会调用父类的方法,如果子类已经重写了该方法就会优先调用子类方法。
抽象类与普通类的区别:
抽行类中可以有抽象方法,或者说如果类中有抽象方法那么这个类一定是抽象类。
抽象类不能被实例化。
抽象类中的方法只用被定义声明,不用关注具体实现,也就是说抽象类中的方法没有方法体。
3.多态
多态是指,同一种事务,由于条件不同产生不同的结果。
方法的重写和重载就是多态的一种体现。
24.集合
集合的两个接口分别是collection和Map
Collection又有List Queue 和Set三个字接口。
其中List的主要实现类有ArryList、LinkedList、Vector、stack。
Set的主要实现类为HashSet和treeSet
Map的主要实现类为TreeMap和HashMap,HashTable。
(1)说一说list、set和map的区别。
1.list和set继承自Collection接口。
2.list中存放的元素是有序的且可重复的。set中存放的元素是无序的,且可重复的。
3.而map则是用键值对(entry)存放数据,这是一个key-value的映射,他们是一一对应的关系,其中key的值是无序的且不可重复的,value的值是无序的且可重复的。
(2)数组和集合有什么区别。
1.数组的长度是不可变的,集合长度可变。
2.集合中只能存放引用数据类型,而数组中可以存放基本数据类型和引用数据类型。
(3)说一说HashMap的实现原理。
1.HashMap其实相当于一个数组和链表的结合体。
先看一下HashMap的Entry,它的主要属性有 hash key value next
使用HashMap的put方法时,先根据key的hashcode计算hash值,得到这个元素在数组中的下标,如果这个下标对应的位置上已经有元素了,那么这个位置上的元素将以链表的形式存放,后加入的放在链头,前面加入的放在链尾。也就是说先加入的放在后面后加入的放在前面。
具体计算hash的方法为 hash(key.hashCode()%len) 其中len是hashmap的默认数组长度,为16.
如 A的hashcode为12 12%16=12
B的hashCode为28 28%16=12
此时A 和B头存放在下标为12的数组位置上,A先加入,B后加入,A B以链表的方式存在即 B.next=A。
(4)Arraylist和linkedlist的区别是什么。
1.Arraylist的底层实现是数组,Linkedlist的底层实现是双向链表。
2.执行查询操作时,Arraylist直接根据数组下标获取数据Linkedlist则要遍历元素,但是执行删除操作时,Arryalist需要移动数组,比如要删除第一个数据时,第2到第N个数据都得往前移一位。
3.Arraylist对空间的浪费体现在list的末尾会留有一定量的空间,当这个空间不足时,Arraylist会自动扩容 ,Linkedlist对空间的浪费则体现在它除了存储每一个元素外还要存储对应的链头链尾。
(5)Arraylist和Vector的区别
1.Vector是线程安全的,而Arraylist不是线程安全的。
2.Arraylist扩容长度为1.5倍,而Vector的扩容长度为2倍。
(6)hashset的实现
hashset的底层是由hashmap实现的。
hashset的值存放在hashmap的key中。
在hashset中hashmap的value值全部用PRESENT代替。
(7)hashmap和hashtable的区别
1.Hashtable是线程安全的,Hashmap则不是。
2.Hashmap的存储允许空键值,也就是说hashmap的key和value值都能为null而hashtable不可以。
25.Collection中的常用方法
boolean add(E e) - 用于将元素e放入当前集合中。
boolean addAll(Collection extends E> c)
- 用于将参数指定集合中的所有元素放入当前集合中。
boolean remove(Object o)
- 用于从当前集合中删除参数指定的元素。
boolean removeAll(Collection> c)
- 用于从当前集合中删除参数指定集合中的所有元素。
void clear()
- 用于将当前集合中的所有元素移除。
boolean contains(Object o)
- 用于判断当前集合中是否包含参数指定的单个元素。
- (onull ? enull : o.equals(e))
boolean containsAll(Collection> c)
- 用于判断当前集合中是否包含参数指定集合中的所有元素。
boolean isEmpty() - 用于判断当前集合是否为空。
int size() - 用于返回当前集合中元素的个数。
boolean retainAll(Collection> c)
- 用于获取当前集合和参数集合的交集并保留到当前集合中。
- 若当前集合中的内容发生了更改则返回true,否则返回false。
26.List中的常用方法
void add(int index, E element)
- 用于将元素element插入到当前集合中index指向的位置。
boolean addAll(int index, Collection extends E> c)
- 用于将集合c中所有元素插入到当前集合中index指向的位置。
E remove(int index)
- 用于将index位置的元素从当前集合移除。
- 返回被删除的元素值,下标不合理时会产生下标越界异常。
E set(int index, E element)
- 使用element元素替换当前集合中index位置的元素,返回被替换的元素。
E get(int index)
- 用于返回当前集合中下标为index位置的元素。
List subList(int fromIndex, int toIndex)
- 用于返回当前集合中从fromIndex(包含)到toIndex(不包含)之间的部分视图。
- 返回的集合和当前集合共用同一块内存区域。
27.集合遍历的集中主要方式。
List list = new ArrayList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
方法一:
超级for循环遍历
for(String attribute : list) {
System.out.println(attribute);
}
方法二:
对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:
for(int i = 0 ; i < list.size() ; i++) {
system.out.println(list.get(i));
}
方法三:
集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()) {
System.ou.println(it.next);
}