javase面试题

1. 静态变量和实例变量的区别

(1)语法定义:
静态变量前要加 static 关键字,而实例变量前则不加
(2)在程序运行时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配 空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载 了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量 必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用

2. 重载和重写的区别

重载:
1 方法名相同,参数列表不同的多个方法之间构成重载关系
2 参数列表中参数类型、个数、顺序至少有一个不同
3 重载关系存在于父类,子类和同类中
重写:
当子类从父类继承的方法不足以满足子类的需求时,需要重写该方法
重写原则:
1 方法名,返回值类型,参数列表相同
2 不能抛出更大更多的异常
3 访问权限不能变小
4final修饰的方法表示该不能被重写

3. final关键字的用法

1 修饰类,表示该类不能被继承
2 修饰方法,表示该方法不能被重写
3 修饰变量,表示该变量必须被初始化,而且值不能更改

4. 面向对象的特征

1 抽象:
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关 注对象有哪些属性和行为,并不关注这些行为的细节是什么。 
2 继承:
继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);
得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中 
可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中关于桥梁模式的部 分)。 
3 封装:
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质
就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封 装;
我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编
程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;
我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 
4 多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用 
调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。

5. "=="和 equals 方法究竟有什么区别

==:比较两个数据内存地址是否相同
equals:比较两个数据值是否一样

6. abstract class和interface有什么区别

1)成员特点: 
构造方法:接口没有;抽象类有; 
成员变量:接口中只有常量;抽象类中常量、变量都可; 
成员方法:接口只有抽象方法;抽象类中抽象方法、非抽象方法都可; 
(2)关系特点: 
类与类:只有单继承,但可以多层继承; 
类与接口:实现关系,可以单实现,也可以多实现;
接口与接口:继承关系,可以单继承,也可以多继承; 
(3)设计理念: 
接口是简单工厂设计模式,likea 的关系 ,接口中定义的是该继承体系的扩展功能;
抽象类是模板设计模式,isa 的关系,抽象类中定义的是继承体系的共性功能;

7. Integer 与 int 的区别

1 int 是 java 提供的 8 种原始数据类型之一。
Java 为每个原始类型提供了封装类,Integer 是 java 为 int 提供 的封装类。int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无 法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为 0 的区别,则只能使用 Integer。
在 JSP 开 发中,Integer 的默认为 null,所以用 el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为 0, 所以用 el 表达式在文本框中显示时,结果为 0,所以,int 不适合作为 web 层的表单数据的类型。 
2 在 Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为 null 而判断一个 对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文件中设置其 unsaved-value 属性为 03 另外,Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer 中还定义了 表示整数的最大值和最小值的常量。 

8. String 和 StringBuilder、StringBuffer 的区别

1 String 和 StringBuffer、StringBuider:
(1) String:是不可变字符序列; 
(2) StringBuffer、StringBuider:是可变字符序列; 
(3) String 覆盖了 equals 方法和 hashCode 方法,而 StringBuffer 没有覆盖 equals 方法和 hashCode 方法, 所以,将 StringBuffer 对象存储进 Java 集合类中时会出现问题。 
2 StringBuffer 和 StringBuider: 
(1) StringBuffer:是 JDK1.0 版本的,线程安全,效率低; 
(2) StringBuilder:是 JDK1.5 版本的,线程不安全,效率高; 
(3) 如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了, 则用 StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最 好用 StringBuffer

9. 什么是java序列化,如何实现java序列化

1 序列化是一种处理对象流的机制,所谓对象流也就是将对象的内容进行流化(将对象转换成二进制)
2 实现序列化接口Serializable
3 反序列化是将字节序列恢复成Java对象的过程

10. HashTable和HashMap有什么区别

1.HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口
2.主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高Hashtable
3.HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
4.最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是

11. List和Map有什么区别

list:
- 链表
- 有序
- 继承Collection(set也是)
- 可以有重复的对象值,但是对象下标不能重复
Map:
- key-value
- 无序
- 键不能有重复的 值可以用

12. 如何通过反射创建对象

1 调用无参的构造函数:使用Class类中的newInstance()方法

2 调用有参的构造函数:先获取指定的参数列表构造器,然后通过该构造函数的对象的 newInstance(实 际参数) 进行对象的初始化。

13. 简述一下面向对象设计的"六原则"

1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。

14. 设计模式

设计模式: 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式本质上就是一种固定的套路,使用在固定的场合中。
分类:
创建型模式 - 工厂方法模式、抽象工厂模式、单例设计模式。
结构型模式 - 装饰器模式、代理模式。
行为型模式 - 模板设计模式、观察者模式。

15. 单例设计模式的应用场景

	单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。
单例模式只允许创建一个对象,因此节省内存,加快对象访问速度
单例模式要素: 
    a.私有构造方法 
    b.私有静态引用指向自己实例 
    c.以自己实例为返回值的公有静态方法 
饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法) 
    优点 
        1.线程安全 
        2.在类加载的同时已经创建好一个静态对象,调用时反应速度快 
    缺点 
         资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 
懒汉式:单例实例在第一次被使用时构建,延迟初始化。 
应用场景:
    - 需要频繁实例化然后销毁的对象
    - 创建对象时耗时过多或者耗资源过多,但又经常用到的对象
    - 有状态的工具类对象
    - 频繁访问数据库或文件的对象
    - 网站计数器,一般是采用单例模式实现
    - 由于配置文件一般都是共享资源,即web应用的配置对象的读取,一般采用单例模式来实现。如:spring的配置文件的读取等
    - 多线程的线程池的设计一般也是采用单例模式
    - 数据库连接池的设计

16. TCP和UDP的区别?哪个是三次握手协议

TCP:
全程保持连接
是一种全双工的字节流传输格式
安全性高

17.简述线程的五种状态

1 新建
2 就绪
3  运行
4  阻塞
5  消亡

18. 5种常见的异常

ArithmeticException 算术异常
NullPointException 空指针异常
ClassCastException	类型转换异常
NumberFormatException 数字格式异常
ArrayIndexOutOfBoundsException 数组下标越界异常

19. throw和throws的区别,处理方式

(1) throw用于抛出异常对象,后面跟的是异常对象	;throw用在方法体内
(2) throws用于抛出异常类,后面跟的是异常类名,可以跟多个,用逗号隔开,throws用在方法上
(3) 异常处理方式:异常的捕获-try{}catch{}finally{},异常的抛出throws,自定义异常类,继承Exception
(4) 什么时候定义 try,什么时候定义 throws? ①功能内部如果出现异常,如果可以处理,就用 try; ②如果内部处理不了,就必须声明出来,让调用者处理。 

20. Statement 和 PreparedStatement 有什么区别

(1) PrepareStatement代表预编译语句,主要优势在于减少SQL编译错误并增加SQL语句的安全性
(2) PreparedStatement 中的SQL语句可以带参数
(3) 当批量处理SQL或频繁执行相同的代码查询时,PreparedStatement有着明显的优势,因为数据库可以将编译优化后的SQL语句缓存起来.

21. JDBC连接数据库的步骤

1 加载驱动
Class.forName("数据库驱动"); 
2 创建连接
DriverManager.getConnection("","","");
3 创建语句
conn.Preparestament(sql);
4 执行语句
ps.executeQuery();
5 处理结果
while(rs.next){}
6 释放资源
finally{
	conn.close();
	rs.close();
}

22. 数据库性能优化

1 数据库设计
	数据库表:字段命名、字段长度、类型、注释规范
	数据库索引:外键、关联字段、查询比较高的字段
	数据库视图:相当于临时表,尽量少用
	数据库引擎:根据业务选择相应的引擎
	数据库字符:和页面字符保持一致
	数据库存储过程:尽量少用
	数据库监听器/触发器:一般用于调度任务和备份还原
2 SQL语句优化
	使用xml配置sql语句
	尽量少关联表,效率最高关联四张表
	不建议使用*号
	查询语句where后,最好使用索引字段关联
3 数据库服务器搭建(集群)
	主从配置
	读写分离
	自动化(容器)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值