1、Java反射机制
A: 概念以及优缺点:
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。
优点:反射可以动态创建对象和编译,最大限度发挥了java的灵活性。
缺点:对性能有影响。反射基本上是一种解释操作,告诉JVM我们要做什么并且满足我们的需求,这类操作总是慢于直接执行java代码。
B:如何反射一个类:
C:得到class类对象如何使用
Class 类与java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了Field,Method,Constructor类(每个类都实现了Member 接口)。这些类型的对象时由JVM 在运行时创建的,用以表示未知类里对应的成员。
这样你就可以使用Constructor 创建新的对象,用get() 和set() 方法读取和修改与Field 对象关联的字段,用invoke() 方法调用与Method 对象关联的方法。另外,还可以调用getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。
2.什么时候用接口什么时候用抽象类
接口是用来定义行为的,抽象类是用来实现行为的,实体类是用来执行行为的.
抽象类中可以包含一些实现,即一些非abstract方法,而接口中所有的方法都是抽象的.所以抽象类可以将子类中共同的逻辑向上提,在抽象类中实现,在一定程度上实现代码的复用.
类可以实现多接口
类只能继承单抽象类
3.统计字符串每个字符出现的次数,并根据出现的次数排序
public static List<Map.Entry<Character, Integer>> countString(String str){
Map<Character,Integer> map = new HashMap<>();
List<Map.Entry<Character, Integer>> resultList= new ArrayList<>();
if(str.length()==0|| str==null){
return resultList;
}
for(int i=0;i<str.length();i++){
if(!map.containsKey(str.charAt(i))){
map.put(str.charAt(i),1);
}else {
int n =map.get(str.charAt(i))+1;
map.put(str.charAt(i),n);
}
}
for(Map.Entry<Character,Integer> m:map.entrySet()){
resultList.add(m);
}
Collections.sort(resultList, new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
int num1=o1.getValue()-o2.getValue();
int num2 = num1==0?o1.getKey().compareTo(o2.getKey()):num1;
return num2;
}
});
return resultList;
}
4. 小字符串在大字符串中出现的次数
public static int countString(String str,String t){
int count=0;
if(str.length()==0 || str==null|| t.length()==0|| t==null || t.length()>str.length()){
return count;
}
int index;
while ((index=str.indexOf(t))!=-1){
count++;
str=str.substring(index+t.length());
}
return count;
}
5.HashSet 和 TreeSet 有什么区别
两者主要在实现方式、百数据是否有序以及是否可以放入null值等三方面存在区别。
一、实现方式
HashSet:HashSet是哈希表实现的。
TreeSet:TreeSet是二差树实现的。
二、数据是否有度序
HashSet:HashSet中的数据是无序的。
TreeSet:Treeset中的数据是自动排好序的。
三、是知否可以放入null值
HashSet:可以放入null,道但只能放入一个null。
TreeSet:不允许放入null值。
6.为什么集合类没有实现Cloneable和Serializable接口?
克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化
7.Enumeration 接口和 Iterator 接口的区别有哪些?
Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。
8.hashmap原理
A:利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
B:存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
C:获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
D:理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。
9. ArrayList为什么是线程不安全的
https://www.jianshu.com/p/41be1efe5d65