1、基本类型变量在栈里面储存,随着方法的弹出栈(方法执行完毕),基本类型变量而从栈溢出,打印时原值不变
1.1、引用类型变量在堆里面储存,当该变量不被引用时,引用类型变量会从堆移除。
1.2、引用类型在堆中保存,基本类型在栈中保存
2、单例:在java内存中,只有一个对象
规则:1.不能在类的外部随意new对象-->>构造方法私有化
2.对外提供一个方法获取单例对象-->>静态方法获取对象
懒汉式:用到了在创建对象
饿汉式:开始就创建对象
3、如果两张及两张以上的表:里面的字段重复太多,通常设计为一张表
4、java数组去重
5、实际开发时尽量避免创建成员变量
普通方法的锁对象:类的实例化对象(this也可以),那个实例独享调用普通方法,那么普通方法的锁对象就是那个实例化对象
静态方法的锁对象:类本身,不管怎么调用静态方法,静态方法锁对象依然是当前类
6、面向对象与面向过程区别
面向对象优点:程序便于维护,后期重构 缺点:性能差 用途:企业系统级开发
面向过程优点:性能执行效率高 缺点:后期不易维护 用途:嵌入式开发、游戏
7、Java语言特点
局部变量在栈存放,成员变量在堆中存放有默认值。
一个对象可以有多个引用,一个地址值(相当于引用)只能指定一个对象。
创建对象时,对象在堆中存储,而地址值在栈中存储
8、为什么重写equals的同时需要重写hashcode
1.1实现序列化接口
1.2显示提供无参构造的方法
1.3提供私有属性,对外提供get、set方法
原因:equals方法是默认继承Object方法,底层代码使用的是==号进行比较的,为了让具有相同内容的对象在调用equals比较时,保证返回值是true,所以我们要重写hashcode方法,保证地址值一样。
9、 程序:开发的应用
进程:是程序执行的单位
线程:是进程的基本单位
10、线程五种状态:
1.1:新建线程:new状态
1.2:就绪状态:可运行状态,当前线程正在等待cpu执行权
1.3:运行状态:当前线程正在运行(start()方法就绪状态,run()方法真正运行的方法)
1.4:阻塞状态:当前线程正在执行时,cpu的执行权被占用
当使用wait()阻塞后,需要使用notify()唤醒,sleep睡眠
1.5:死亡状态:调用死亡方法
11、异常
错误无法处理,异常可以处理
异常:运行时、编译时两种异常
两种处理方式try catch throw
实际开发中,需要在数据层抛出异常,异常信息抛给业务层,在业务层抛出异常,异常信息抛到web层,在web层捕获信息。原因是:在web层使用框架自带全局异常处理机制。
自己定义异常的好处:可以快速查找到异常出现的位置
自定义编译异常方式一:继承Exception(这种方式使用较少)
自定义运行异常方式二:需要RunnTimeException......
数据层是mapper,业务层service,控制层是web
12、集合List/Set/Map
顶层接口:Collection(单列集合接口List/Set)
双列集合接口:Map
List:有序、可重复,List集合保存的数据有索引,ArrayList底层保存数据是数组,,LinkeList底层是链表+数组保存数据
相同点都是List下的数组,
查询Arraylist快(底层是数组有索引),删除数据时底层存在数组的拷贝过程。
添加数据(根据指针)LinkeList更新、删除快,删除数据时底层不存在数组的拷贝过程。
Set:无序、不可重复,集合没有索引,HashSet、TreeSet底层保存数据是链表
Map:底层保存数据entry(key-value)实现类:HashMap线程不安全,HashTable线程安全,ConcurrentHashMap线程安全