最近在面试java,总结下遇到的面试题,包括java和mysql数据库方面,持续更新中

Java六大设计原则

1.     依赖倒置原则-Dependency Inversion Principle (DIP)

2.     里氏替换原则-Liskov Substitution Principle (LSP)

3.     接口分隔原则-Interface Segregation Principle (ISP)

4.     单一职责原则-Single Responsibility Principle (SRP)

5.     开闭原则-The Open-Closed Principle (OCP)

java的基本数据类型有八种:

  1. 四种整数类型(byte、short、int、long):byte8 位。 short16 位。int:32 位

long:64 位。

  1. 两种浮点数类型(floatdouble)  float32 位。 double64
  2. 一种字符类型(char)char16
  3. 一种布尔类型(boolean)true   false 假。

String是最基本的数据类型吗?

String是类代表字符串,属于引用类型,所谓引用类型包括:类,接口,数组

Overload和Override的区别?

1、综述

  重写(Override)也称覆盖,它是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现。 override从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。overload它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。

2、override(重写,覆盖)

(1)方法名、参数、返回值相同。

(2)子类方法不能缩小父类方法的访问权限。

(3)子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

(4)存在于父类和子类之间。

(5)方法被定义为final不能被重写。

(6)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

3、overload(重载,过载)

(1)参数类型、个数、顺序至少有一个不相同。

(2)不能重载只有返回值不同的方法名。

(3)针对于一个类而言。

(4)不能通过访问权限、返回类型、抛出的异常进行重载;

(5)方法的异常类型和数目不会对重载造成影响;

4、override应用:

(1)最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。

(2)除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。

5、总结

override是在不同类之间的行为,overload是在同一个类中的行为。

注:子类继承父类重写的方法只是父类中的抽象方法或者是接口,并不是全部的方法,别的方法也可以重写。但不是必须

 

面向对象的特征:

- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。

抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段

- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。

面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。

可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。

- 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。

简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。

方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:

1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);

2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

Mysql语法顺序,即当sql中存在下面的关键字时,它们要保持这样的顺序:

select[distinct] 

from 

join(如left join) 

on 

where 

group by 

having 

union 

order by 

limit 

Mysql执行顺序,即在执行时sql按照下面的顺序进行执行

from 

on 

join 

where 

group by 

having 

select 

distinct 

union 

order by

Mysql增删改查语句

增加:INSERT INTO 表名(字段名1,字段名2) VALUE(字段值1,字段值2)

例:INSERT INTO a(id,name) VALUE(2,'李四');

删除:DELETE FROM 表名 WHERE 条件

例:DELETE FROM a WHERE id=1;

修改:UPDATE 表名 SET 字段名=字段值 WHERE 条件

例:UPDATE a SET id=1,name='张三' WHERE id=2;

查询:SELECT (字段名,*代表全部) FROM 表名 WHERE 条件

例:SELECT id,name FROM a WHERE id=1;

Java中栈(stack)和堆(heap)的异同

差异

1.堆内存用来存放由new创建的对象和数组。

2.栈内存用来存放方法或者局部变量等

3.堆是先进先出,后进后出

4.栈是后进先出,先进后出

相同

1.都是属于Java内存的一种

2.系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它

JAVA语言对于标识符定义要求:

Ⅰ.可以由字母,数字,”_”或者”$”符组成,但是不能以数字开头; Ⅱ.中文可以作为变量名,但是不提倡使用; Ⅲ.Java大小写敏感,严格区分大小写,命名时需要注意; Ⅳ.不能使用Java保留字(一些java语言规定好的,有特殊意义的字符如break,if等)。

Java中创建线程的两种方式

创建线程的第一种方式:

创建一个类继承Thread

重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)

创建子类对象,其实就是在创建线程

启动线程start()

这种方式的特点(缺陷):线程任务和线程是绑定在一起的。

创建线程的第二种方式:

创建实现了Runnable接口的子类

重写Runnable接口中的run方法

创建实现了Runnable接口的子类的对象

创建Thread类的对象,也就是在创建线程

把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法

这种方式的特点是:把线程任务进行了描述,也就是面向对象,从而实现了线程任务和线程对象的分离。线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法,此方式较为灵活。

mysql中死锁的产生原因及解决办法

死锁的第一种情况

一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。

解决方法:

这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进 行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。

死锁的第二种情况

用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但在稍大点的项 目中经常发生。如在某项目中,页面上的按钮点击后,没有使按钮立刻失效,使得用户会多次快速点击同一按钮,这样同一段代码对数据库同一条记录进行多次操 作,很容易就出现这种死锁的情况。

解决方法:

1、对于按钮等控件,点击后使其立刻失效,不让用户重复点击,避免对同时对同一条记录操作。

2、使用乐观锁进行控制。乐观锁大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是 通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数 据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。乐观锁机制避免了长事务中的数据 库加锁开销(用户A和用户B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。Hibernate 在其数据访问引擎中内置了乐观锁实现。需要注意的是,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户更新操作不受我们系统的控制,因此可能会造 成脏数据被更新到数据库中。

3、使用悲观锁进行控制。悲观锁大多数情况下依靠数据库的锁机制实现,如Oracle的Select … for update语句,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。如一个金融系统, 当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户账户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读 出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对成百上千个并发,这 样的情况将导致灾难性的后果。所以,采用悲观锁进行控制时一定要考虑清楚。

死锁的第三种情况

如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。类似的情 况还有当表中的数据量非常庞大而索引建的过少或不合适的时候,使得经常发生全表扫描,最终应用系统会越来越慢,最终发生阻塞或死锁。

解决方法:

SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。

5.小结

总体上来说,产生内存溢出与锁表都是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。有的人认为先把功能实现,有BUG时再在测试阶段进 行修正,这种想法是错误的。正如一件产品的质量是在生产制造的过程中决定的,而不是质量检测时决定的,软件的质量在设计与编码阶段就已经决定了,测试只是 对软件质量的一个验证,因为测试不可能找出软件中所有的BUG。

final, finalize和finally的不同之处

final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

Mysql中having的意思

having跟where一样,HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

数据库的 一对多、多对一、一对一、多对多 关系

一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系

一对多可以建两张表,将一这一方的主键作为多那一方的外键

多对多可以多加一张中间表,将另外两个表的主键放到这个表中

关于外键的设置:

首先,外键引用的那个列在主表中必须是主键列或者唯一列。

所以1:n的肯定把外键建立在n的那张表上。

1:1,一般要看谁是主表,谁是附属表,外键当然建立在附属表中。

n:m的情况,需要建立一个关系表,两个原表和其关系分别是1:n,1:m

什么叫多线程:

一个进程中有多个线程,称为多线程。

多线程的优势:

解决了多部分同时运行的问题,提高效率

线程的弊端:

线程太多会导致效率的降低,因为线程的执行依靠的是CPU的来回切换。

实现多线程的方法:

实现多线程可以通过继承Thread类和实现Runnable接口。

mysql查询 怎么使用 in

in作为查询条件,一般典型有两种用法:

一是IN常量,例如下面语句查询一、三年级的学生:

SELECT * FROM student WHERE grade IN ('一','三');

二是使用子查询,也就是IN(SQL语句),例如下面的语句查询不及格的班级的所有学生:

SELECT * FROM student WHERE classno IN (

select classno from scores where score<60

);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值