考研狗找工作日常面试sad
1.Java底层编码用的哪种规范?
编码规范:unicode 具体实现:utf-16,utf-8等
2.一个char类型能存一个汉字吗?为什么?
可以啊,一个char类型占2个字节,而一个汉字也是2个字节
补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是 Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如 InputStreamReader 和 OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于 C 程序员来说,要完成这样的编码转换恐怕要依赖于 union(联合体/共用体)共享内存的特征来实现了。
3.set,list,collection区别。
Collection是List和Set两个接口的基接口,List和Set的区别,List是有序的且可重复,但Set是无序的且不可重复
4.arraylist与linkedlist区别
a.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
b.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
c.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
5.具体谈谈面对对象的特征
抽象继承封装多态
抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处。包括状态抽象与行为抽象。状态抽象:人有不同属性 。行为抽象:出行可以有走路,坐车
继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要
封装:封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。目标就是要实现软件部件的“高内聚、低耦合”。
多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定.多态分为运行时多态和编译时多态。
编译时多态:泛型,重载与重写,
运行时多态:a。通过继承超类对象引用变量引用子类对象来实现
b。通过接口类型变量引用实现接口的类的对象来实现
6.向上转型与向下转型
向上转型:男人是人 Person p=new Man()
向下转型:人是男人 Man m= Person(p);l
向上转型为了提高扩展性并限制特有方法,访问父类的属性和方法;向下转型为了使用子类特有方法;对于转型自始至终都是子类对象做着类型的变化:
具体讲解:JAVA 多态(运行时多态和编译时多态)及其内存图解
7.面对对象的原则?
六原则一法则:单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口隔离原则,合成聚合复用原则,迪米特法则
单一职责原则:一个类只做一件事 ,高内聚,低耦合,方便模块化
开放封闭原则:软件实体对扩展开放,对修改关闭 添加功能不需要修改原来代码,只需新增
里氏替换原则:任何一个子类应都能替换父类 检查继承关系是否有问题
依赖倒置原则:面向接口编程,声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型
接口隔离原则:接口要小而专
合成聚合复用原则:优先使用聚合或合成关系复用代码
迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。
补充:类与类之间简单的说有三种关系,Is-A关系、Has-A关系、Use-A关系,分别代表继承、关联和依赖。其中,关联关系根据其关联的强度又可以进一步划分为关联、聚合和合成,但说白了都是Has-A关系,合成聚合复用原则想表达的是优先考虑Has-A关系而不是Is-A关系复用代码
8.数据库的范式
第一范式(1NF):属性不可分。
第二范式(2NF):符合1NF,并且,非主属性完全依赖于码。
第三范式(3NF):符合2NF,并且,消除传递依赖
BC范式(BCNF):符合3NF,并且,主属性不依赖于主属性
具体讲解:[数据库] 理解数据库范式-通俗易懂
9.Servlet的生命周期:
1 加载classLoader
2 实例化 new
3 初始化 init(ServletConfig)
4 处理请求 service doGet doPost
5 退出服务 destroy()
具体讲解:Servlet运行原理以及生命周期
10.forward和redirect的区别
forward(转发):
是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.
redirect(重定向):
是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
转发是服务器行为,重定向是客户端行为。
补充:
1. 从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2. 从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3. 从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
4. 从效率来说
forward:高.
redirect:低.