Java基础面试提
java反射
Java中的反射机制是指在运行时,动态地获取类的信息,并操作类的成员(方法、 属性、构造器等)
Java中的反射机制使得程序可以在运行时根据需要,获取和操作类的信息,而无需在编译时确定具体的类
Java中的反射API主要包括以下三个类
一:Class类
该类表示Java中的类和接口,通过Class类可以获取类的名称、修饰符、父类、实现的接口、方法、属性等信息
二、Constructor类
该类表示类的构造方法,通过Constructor类可以创建对象实例
三、Method类该类表示类的方法
通过Method类可以调用类的方法,
反射机制主要应用于以下场景
动态加载类
Java中的类通常需要在编译时确定,但有些情况下,需要在程序运行时才能确定需要加载的类
这时就可以使用反射机制动态加载类
动态创建对象
通过反射可以在运行时根据类的信息创建对象实例,这种方式常用于框架和插件的开发,因为插件和框架的使用者并不知道具体的类名
动态调用方法
通过反射可以在运行时根据类的信息调用方法,这种方式常用于JavaBean的属性操作和事件处理等
动态访问属性
通过反射可以在运行时根据类的信息动态获取和修改类的属性值,这种方式常用于框架和插件的开发
例如Spring框架中的依赖注入
需要注意的是:反射机制在一定程度上会影响程序的性能和安全性
- 集合数组类
集合类型主要有3种:set(集)、list(列表)和map(映射)。
1.List(有序、可重复) List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所以插入数据慢,查询数据快
2.Set(无序、不能重复) Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
3.Map(键值对、键唯一、值不唯一) Map集合中存储的是键值对,键不能重复,值可以重复
ArrayList遍历
/*第一种遍历方式*/
System.out.print("for循环的遍历方式: ");
for (int i = 0; i < lists.size(); i++) {
System.out.print(lists.get(i));
}
/*第二种遍历方式*/
System.out.print("foreach的遍历方式:");
for (Integer list : lists) {
System.out.print(list);
}
/*大第三种遍历方式*/
System.out.print("Iterator的遍历方式:");
for (Iterator<Integer> list = lists.iterator(); list.hasNext(); ) {
System.out.print(list.next());
}
遍历HashMap的四种方法
//第一种:普通使用,二次取值(性能差)
System.out.println("\n通过Map.keySet遍历key和value:");
for(String key:map.keySet())
{
System.out.println("Key: "+key+" Value: "+map.get(key));
}
//第二种:推荐,尤其是容量大时
System.out.println("\n通过Map.entrySet遍历key和value");
for(Map.Entry<String, String> entry: map.entrySet())
{
System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
}
- 请写出线程(不)安全的类
Vector是线程安全的,ArrayList、LinkedList是线程不安全的
Properties是线程安全的,HashSet、TreeSet是不安全的
StringBuffer是线程安全的,StringBuilder是线程不安全的
HashTable是线程安全的,HashMap是线程不安全的
- 说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,
Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差
LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
总结:
ArrayList,Vector都是使用数组方式存储数据,索引数据快而插入数据慢,Vector由于使用了synchronized(线程安全)所以效率比ArrayList差
LinkedList使用双向链表实现存储, 索引数据慢而插入数据快
- arraylist和hashset的区别
arraylist有顺序,
hashset没有顺序。
set没有键值和属性值,那是map
- hashmap和hashtable的区别
- hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。2.hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。
3.hashMap允许空键值,而hashTable不允许。