Java-面试题(1)

文件读取的基本类?
FileReader和FileWriter分别继承自Reader和Writer类。FileReader用于读取文件,FileWriter用于写入文件,两者都需调用自身的构造方法创建对象,然后调用各自的read()和write()方法进行读取写入操作

什么是序列化?
序列化是一种处理对象的流,就是将对象流化。可以对流化的对象进行读写,也可以在网络传输。序列化的实现需要被序列化对象实现serializable接口(该接口没有需要实现的方法,主要是标记该类可以被实例化),然后使用输出流如FileOutputStream类构建ObjectOutputStream对象流,再使用ObjectOutputStream的writeObject()方法进行序列化即可,读取使用输入流

java中statement和preparedStatement的区别?
preparedStatement相较于statement的不同点是它的语句是预编译过的,并且可以使用运行时参数,安全性更高,性能更好。

mybatis执行流程
1.创建SqlsessionFactory
2.通过SqlsessionFactory创建Sqlsession
3.通过Sqlsession执行数据库操作
4.调用Sqlsession.commit()提交事务
5.调用Sqlsession.close()关闭会话

jdbc有何不足?mybatis如何解决的?
1.jdbc与数据库链接频繁创建释放造成系统资源浪费。
mybatis可在sqlmapconfig.xml中配置数据库连接池,用连接池配置数据库连接
2.jdbc频繁修改sql语句,不易维护
mybatis可以把sql语句放到映射xml文件中,与java代码分离。
3.jdbcsql语句不易传参,传参需要修改大量sql。
mybatis自动将java对象映射至sql语句,减少sql变更与占位符调试
4.结果集解析不易
mybatis自动将sql执行结果映射到java对象

mybatis和hibernate有何异同?
1.mybatis不是一个完整的orm框架,因为其需要手动编写sql语句,并经过映射后执行,再把执行结果封装成java对象
2.mybatis简单易学,手动编写sql语句的方式可以严格控制sql执行性能与灵活性。适合对关系型数据模型要求不高的互联网,企业运营类软件,但是mybatis无法做到数据库无关性,如需兼容多款数据库则需要配置大量配置文件
总之能更根据用户需求在有限环境下做出拓展性,维护性好的框架就是好架构,所以框架适合才是最好的

mybatis的一级缓存和二级缓存?
mybatis的一级缓存默认开启,同一个sqlsession执行同样的sql语句时,第一次会到数据库查询数据并放入缓存中,下次执行时直接从缓存取,如果发生了增删改操作便会删除该sqlsession的缓存,不想使用可以在sqlmapconfig.xm中配置一级缓存的作用域为statement。
mybatis的二级缓存默认管关闭,需要在sqlmapconfig.xml中配置开启,主要是同namespace下的查询sql可以到缓存中获取数据,比较鸡肋,推荐使用Redis等缓存数据库。

collection和collections的区别
collection是集合的上级接口,继承它的主要有set和list。collections是针对集合类的一个帮助类,提供了一系列静态方法对集合的搜索排序等操作。

heap和stack的区别
stack是栈,一种线性集合,每个线程包含一个栈区(堆区只有一个所以所有线程共享),栈按照先进先出操作。栈内存会在程序进入一个方法时,分配专属的内存空间,用于存放这个方法的内部局部变量。方法结束时释放。创建的对象会放入堆区,方法结束时不释放。

数组有没有length()方法?string呢?
数组没有length()方法,但是有length属性,string有length()方法

jvm装载class文件的原理?
jvm中类的装载主要依赖classloader和它的子类。java classloader是个重要的java运行时系统组件,它负责在运行时查找并装入文件。

mvc详细?
mvc是model view controller的简写。model是数据 view是视图层 controller是业务

stop和suspend为什么不推荐使用?
stop()方法会使当前线程直接停止,释放获取的所有锁,如果监控的对象处在一种不连贯的状态下时,其他线程可以修改并检查其对象,自然不安全。suspend()会使当前线程停止,但是也会继续持有对象锁,其他线程无法访问,所以容易发生死锁。

wait方法和sleep方法的区别
wait方法会使线程进入等待状态,释放对象锁,并进入等待该对象的等待池,需要notify方法启动。sleep方法会使线程停止运行一段时间,进入睡眠状态,不会释放对象锁,到了设置时间后自动启动。

线程同步方法
wait使一个线程进入等待状态,并释放所持有的对象的锁。sleep使一个线程进入睡眠状态,不释放所持有的锁。notify唤醒一个处于等待状态的线程。allnotify唤醒所有处于等待状态的线程。

string和stringbuffer的区别
string类不可继承,提供的字符串是不可变的。stringbuffer提供的字符串可以修改,换言之,如果知道字符串需要修改,推荐使用stringbuffer

线程的基本状态
线程指在程序运行过程中,执行程序代码的一个程序单元,每个程序最少有一个线程。
四种状态:就绪 运行 挂起 死亡 如果使用sleep就多一个睡眠

gc是垃圾处理的意思,内存处理是程序员最头疼的事。java提供的gc功能可以自动监控对象是否超过作用域,从而达到自动回收。
启动一个线程的方法是start()方法,它会使该线程进入就绪状态,能被jvm调用。run()方法是该线程关联的方法。j2ee服务器启动时会建立定量连接,并始终检测不少于此数量。客户端需要时,连接池就会寻找空闲的连接,标记为忙状态并返回。如果没有空闲的连接,连接池就会根据配置文件新建一定量的连接。调用完成以后会将该连接标记为空闲当java程序违反了java的语义规则,jvm就会把将会发生的错误表示成异常。java语义规则主要有两种,一种是java类库内置的语义规则,比如空指针异常。一种是由程序员定义的,并随时都可以自由通过throw关键字进行引用的异常。所有的异常都是throwable的子类

acid
原子性 事务的操作,要么都执行,要么都失败。
隔离性 当数据库多事务操作时,各个事务间互不干涉,相互隔离。
一致性 事务修改前的数据和事务修改够的数据一致。
持久性 事务对数据库的数据进行的操作是持久性的,就算数据库损坏也是如此。

HashMap是HashTable的轻量级实现(非线程安全的)所以HashMap的速度可能优于HashTable,而且HashMap移除了HashTable的contains方法,更改为了containsvalue与containskey。HashMap继承与dictionary类,HashTable是Map interface的实现。

声明方法的存在而不去实现的叫抽象类,且不能被创建。抽象类不能有抽象构造函数和抽象静态方法。抽象类的子类如果不实现其方法那么这个子类也是抽象类。接口是抽象类的变体,接口都是抽象方法,其实例化方式与抽象类相似。接口只能定义static和final变量即常量。instanceof可以判断某类是否实现了某接口。

集合只能存对象,就算存入int类也是转型成integer类,而且存放的是对对象的引用,还可以存放不定类型不限数量的数据类型。底层数据结构是数组
增加和删除的效率低,查询和修改的效率高
能够存储null 值
线程不安全,效率高
有索引,能够方便检索
元素可重复,我们自己可以通过 选择排序去重复
不可以排序,但是可以通过Collection.sort() 方法排序

自己总结的一点面试题,觉得不对请务必指教。

猜你喜欢

转载自blog.csdn.net/qq_36008278/article/details/114906660