java注解底层是怎么实现的
注解的底层也是使用反射实现的
你写过springboot吗,他里面有哪些注解
使用注解的优势:
1.采用纯java代码,不在需要配置繁杂的xml文件
2.在配置中也可享受面向对象带来的好处
3.类型安全对重构可以提供良好的支持
4.减少复杂配置文件的同时亦能享受到springIoC容器提供的功能
@SpringBootApplication:申明让spring boot自动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
@ResponseBody:表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。
@Controller:用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。
@RestController:用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。
https://blog.csdn.net/weixin_40753536/article/details/81285046
java日志框架用过哪个
Log4j
Slf4j
Commons Logging
java顶级父类有哪些方法
protected Object clone() 创建并返回此对象的一个副本。
boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”。
protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
Class<? extendsObject> getClass() 返回一个对象的运行时类。
int hashCode() 返回该对象的哈希码值。
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
String toString() 返回该对象的字符串表示。
void wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的 notify()
方法或 notifyAll() 方法,或者超过指定的时间量。
void wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的 notify()你们公司的java书写规范
我们公司参考阿里巴巴开发规范进行代码书写。
MySQL的执行计划
Explain
hashmap和treemap的区别知道吗
HashMap 非线程安全 TreeMap 非线程安全
HashMap 是基于哈希表的 Map 接口的实现,TreeMap:基于红黑树实现
HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的
HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap
有哪些方法可以遍历一个hashmap
大约有5种方式
//1.使用增强for 和 keySet()方法
//先使用Map接口中的keySet()方法 获取返回值set<k>对象,或者叫数组
Set<Integer> s=h.keySet();
//此时获得key值
//遍历使用增强for
for(Integer i:s)
{
//i为key
//使用Map接口中的get(key) 方法,返回值为对应的value
system.out.println(h.get(i));
}
//2.使用增强for和Iterator,keyset遍历
//先使用Map接口中的keySet()方法 获取返回值set<k>对象,或者叫数组
Set<Integer> s=h.keySet();
//使用Iterator接口中的iterator()方法,返回值为Iterator<E>对象,set继承了Collection
//所以拥有iterator()方法,可以直接使用
Iterator i=s.iterator();
//使用增强for遍历
while(i.hasnext())
{
system.out.println(s.get(i.next()));
}
//3.使用entrySet()和增强for
Set<Map.Entry<Integer,
String>> s3=h.entrySet();
for(Map.Entry<Integer, String>
m:s3)
{
System.out.println(m.getValue()+m.getKey());
}
//4.使用entrySet()和Iterator
Set<Map.Entry<Integer,
String>> s4=h.entrySet();
Iterator<Map.Entry<Integer,
String>> i2=s4.iterator();
while(i2.hasNext())
{
Map.Entry<Integer,
String> a=i2.next();
System.out.println(a.getValue()+a.getKey());
}
//5.只能遍历到内容的方法
//Collection<String> c2=new
ArrayList<String>();
Collection<String> c=h.values();
//ArrayList<String>
a=(ArrayList<String>)c;
for(String s:c)
{
System.out.println(s);
}*/
list和arraylist的关系
List是一个接口,而ArrayList是List接口的一个实现类。 ArrayList类继承并实现了List接口。 因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。
List a=new ArrayList();
则a拥有List的所有属性和方法,不会拥有其实现类ArrayList的独有的属性和方法。 如果List与ArrayList中有相同的属性(如int
i),有相同的方法(如void f()), 则a.i是调用了List中的i
,a.f()是调用了ArrayList中的f();
hashmap是怎么get和put的,就是它怎么是实现的
get方法调用
1.当调用get方法时会调用hash函数,这个hash函数会将key的hashCode值返回,返回的hashCode与Entry数组长度-1进行逻辑与运算得到一个index值,用这个index值来确定数据存储在Entry数组当中的位置
2.通过循环来遍历索引位置对应的链表,初始值为数据存储在Entry数组当中的位置,循环条件为Entry对象不为null,改变循环条件为Entry对象的下一个节点
3.如果hash函数得到的hash值与Entry对象当中key的hash值相等,并且Entry对象当中的key值与get方法传进来的key值equals相同则返回该Entry对象的value值,否则返回null
put方法调用
1.调用hash函数得到key的HashCode值
2.通过HashCode值与数组长度-1逻辑与运算得到一个index值
3.遍历索引位置对应的链表,如果Entry对象的hash值与hash函数得到的hash值相等,并且该Entry对象的key值与put方法传过来的key值相等则,将该Entry对象的value值赋给一个变量,将该Entry对象的value值重新设置为put方法传过来的value值。将旧的value返回。
4.添加Entry对象到相应的索引位置