1.简述 String 和 StringBuffer 的区别。
String
: 字符串常量,属性有fianl
修饰,一经创建就不可变。
StringBuffer
: 字符串变量,方法有synchronized
修饰。
StringBuilder
: 字符串变量,方法没有synchronized
修饰。
总结 从线程安全
上来说 String
和 StringBuffer
是线程安全的,StringBuilder
是线程不安全
的。
另外运行速度、执行速度
StringBuilder> StringBuffer > String(因为String对象创建是不可变的)
String
:适用于少量的字符串操作
的情况
StringBuffer
:适用多线程下在字符缓冲区进行大量操作
的情况
StringBuilder
:适用于单线程下在字符缓冲区进行大量操作
的情况
2.说出 Servlet 的生命周期,并说出 Servlet 与 GCI 的区别。
Servlet 周期顺序:容器加载和实例化 > 初始化 > 处理请求 > 服务结束销毁
加载和实例化 容器负责加载和实例化一个servlet
。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该servlet为客户请求服务的时候。
初始化 servlet加载并实例化后,容器必须在它能够处理客户端请求前初始化它。通过调用它的init方法并给它传递唯一的一个(每个servlet定义一个)ServletConfig对象完成这个过程
。给它传递的这个配置对象允许servlet访问容器的配置信息中的名称-值对(name-value)初始化参数。这个配置对象同时给servlet提供了访问实现了ServletContext接口的具体对象的方法,描述了servlet的运行环境。
处理请求 请求对应的doGet() doPost()
方法,每一个请求由ServletReques
代表,ServletResponse
回应请求
服务结束 将调用destroy()
方法,销毁实例
Servlet处于服务器进程
中,它通过多线程方式
运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁
而CGI对每个请求都产生新的进程
,服务完成后就销毁,所以效率上低于servlet。
3.请简述 Collection 和 Collections 的区别。
Collenction
是集合接口
,提供了对集合对象进行基本的接口通用方法,Collection在Java中有很多具体实现,collection的意义就是为了给集合类提供最大化的统一操作方法。
Collections
是一个包装类
,提供了各种有关集合操作的静态方法,该类不能被实例化,可以理解为工具。
4.& 和 && 的区别。
都是表示与
的逻辑运算符,都表示逻辑运输符and
,当两边的表达式都为true的时候,整个运算结果才为true,否则为false
。&&
的短路功能,当第一个表达式的值为false
的时候,则不再计算第二个表达式
;&
则两个表达式都执行
。
5.sleep() 和 wait() 有什么区别?
从使用角度看:
sleep()
是Thread线程类
的方法,而wait()
是Object顶级类
的方法。
sleep()
可以在任何地方
使用,wait()
只能在同步方法或者同步块中
使用。
cpu及资源释放:
sleep(),wait()
调用后都会暂停当前线程并让出cpu的执行时间
但不同的是sleep()不会释放当前持有的对象的锁资源,到时间后会继续执行
。而wait()会放弃所有锁并需要notify/notifyAll后重新获取到对象锁资源后才能继续执行
。
异常捕获:
sleep()需要捕获或者抛出异常
,而wait()/notify()/notifyAll()不需要
。
6.GC 是什么?为什么要有 GC?
GC 垃圾收集
,Java是从C++衍生来的,在C/C++中创建对象使用结束后,需要自己手动释放内存
,在Java中是不需要的,因为垃圾回收器会自动管理
,如果需要请求垃圾回收
可以调用System.gc()
或Runtime.getRuntime().gc()
。
因为显式声明
是做堆内存全扫描
,也就是 Full GC,是需要停止所有的活动的(Stop The World Collection),而其显示调用System.gc() 只是给虚拟机一个建议
,不一定会执行,因为System.gc()
在一个优先级很低的线程中执行。
7. short s1 = 1;s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
s1 = s1 + 1
编译不能通过, s1 += 1
正常运行,因为 s1+1
运算时会自动提升表达式的类型,所以结果是int型
, +=
是Java语言规定的运算符,Java编译器 会对它进行特殊处理
8.Math.round(11.5) 等于多少? Math.round(-11.5) 等于多少?
Math.round(11.5) = 12, Math.round(-11.5) = -11
Math.round()
四舍五入,float
时返回int
值,double
时返回long
值
Math.abs()
计算绝对值
Math.sqrt()
计算平方根
Math.cbrt()
计算立方根
Math.random ()
取得一个大于或者等于0.0小于不等于1.0的随机数
9.设计4个线程,其中两个线程每次对j加1,另外两个线程每次减1,写出程序。
public class Data {
private int j = 0;
public synchronized void syncAdd() {
j++;
System.out.println("j 的值为:" + j);
}
public synchronized void syncSub() {
j--;
System.out.println("j 的值为:" + j);
}
static class AddThread extends Thread {
private Data data;
public AddThread(Data data) {
this.data = data;
}
@Override
public void run() {
data.syncAdd();
}
}
static class SubThread extends Thread {
private Data data;
public SubThread(Data data) {
this.data = data;
}
@Override
public void run() {
data.syncSub();
}
}
public static void main(String[] args) {
Data data = new Data();
Thread add1 = new AddThread(data);
Thread add2 = new AddThread(data);
Thread sub1 = new SubThread(data);
Thread sub2 = new SubThread(data);
add1.run();
add2.run();
sub1.run();
sub2.run();
}
}
10.String s = new String("xyz"),创建了几个String Object?
两个
。一个是编译时决定的,最后放在常量池中
。一个是运行时放在堆里面的
。s 只是一个引用,本身不是对象。
String s= "xyz"
这样的,s 这个引用就会直接指向常量池
的"xyz"
第一个对象是
字符串常量"xyz"
, 第二个对象是new String("xyz")的时候
产生的,在堆中分配内存给这个对象
,只不过这个对象的内容
是指向字符串常量"xyz"
另外还有一个引用s,指向第二个对象
。这是一个变量,在栈中分配内存
。
11.java有没有goto?
goto
是java语言中的保留字
,目前还没有在java中使用。goto
这个词是C语言
中的,goto语句通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能
。而在结构化程序语言
中一般不主张使用goto
语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。但是在java语言中,goto
这个词只是作为了保留字,还没有使用
。那是因为java语言讲究简单,方便
。
12.EJB 包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行
。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise Java Beans)是J2EE(javaEE)的一部分
,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务中心中心支持和核心开发工具(SDK)
。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)
。在EJB3.0推出以后,实体Bean被单独分了出来,形成了新的规范JPA
。
SessionBean
是无状态的,生命周期由容器决定,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机
。当客户机第一次调用一个Stateful(有状态) Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上
,以后此客户机调用Stateful Session Bean
的方法时容器会把调用分派到与此客户机相关联的Bean实例
。
EntityBean
Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活
。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entity beans也是存活的
。Entity Beans生命周期能够被容器或者 Beans自己管理
。
13.接口是否可以继承(extends)接口,抽象类是否可以实现(implements)接口?抽象类是否可以继承实体类(concrete class)?
接口
可以继承(extends)接口
。
抽象类
可以实现(implements)接口
。
抽象类
可以继承实体类
,但前提是实体类必须有明确的构造函数
。
14.怎么理解Java面向对象?
可以从四个方面封装,继承,抽象,多态
逐一说明:
封装:指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
优点良好的封装能够减少耦合。类内部的结构可以自由修改。可以对成员变量进行更精确的控制。隐藏信息,实现细节
抽象:用关键字
abstract
修饰,面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
继承:使用
extends
,一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
多态:同一个行为具有多个不同表现形式或形态的能力
优点消除类型之间的耦合关系 ,可替换性,可扩充性, 接口性, 灵活性,简化性
实现方式重写,接口,抽象类和抽象方法
存在的必要条件继承,重写,父类引用指向子类对象
。
15、MYSQL 三范式,五约束
- 第一范式(1NF):表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性
- 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系
- 第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)
五约束
- primary key 设置主键约束;
- UNIQUE 设置唯一性约束,不能有重复值;
- DEFAULT 默认值约束;
- NOT NULL 设置非空约束,该字段不能为空;
- FOREIGN key 设置外键约束。
16、List,Map ,Set 的区别
从形式来说map 是key-value的形式,list和set是单个元素存储。
List和Set的区别:
List:
有序可重复
ArrayList(查找快)和LinkedList(删除添加快) 是按存放顺序排列(不是自然顺序)
Set:
“无序”,不重复
HashSet:是没有存放顺序
LinkedHashSet:是按照存放顺序排列的
TreeSet:是按照自然顺序排列的
17、怎么理解AOP,IOC,DI?
AOP面向切面,是将程序功能 中的频繁出现或者与主业务逻辑代码相关度不高的代码抽离出来,通过切面编程的方式在想要调用的时候引入调用的思想。AOP(面向切面)和OOP(面向对象)一样都是一种编程思想,这种思想的实现机制在Spring中便是应用了java的动态代理和java的反射。在实际编程中,我们通常会遇到一些交叉业务逻辑(比如:日志,事务,安全等等),实际开发中可以使用切面做很多业务方面的逻辑处理,例如:
谋充值活动 充100,反 50,使用切面编程 可以将充值和返利解耦,返利活动利用切面
IOC(Inversion of Control)控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的bean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。
DI(Dependency Injection)依耐注入,将相互依赖的对象分离,在Spring的配置(注解)中描述它们之间的依赖关系,这些依赖关系也只在使用时才被建立。
MySQL几种索引类型
四种索引类型,五种使用方法(全文索引,唯一索引,主键索引,普通索引)组合索引。
- 主键索引:创建主键时自动创建,不允许为空,一般设为int,且自增。
- 唯一索引:要求字段值唯一,可以为空。
建表时:UNIQUE INDEX IndexName(字段名
(length))
建表后:CREATE UNIQUE INDEX IndexName ONTableName
(字段名
(length))
或ALTER TABLE TableName ADD UNIQUE INDEX IndexName(字段名
(length)) - 全文索引:假设字段的数据类型是长文本,文本字段上(text等)建立了普通索引,我们需要查找关键字的话,那么其条件只能是where column like '%xxxx%' ,但是,这样做就会让索引失效,这时就需要全文索引了。
- 普通索引:创建一个普通索引时,不需要加任何UNIQUE、FULLTEXT或者SPATIAL参数 ,语句 ALTER TABLE {table_name} ADD INDEX index_name ( {column} )
索引资料
是用索引原则
- 装载数据后再建立索引。
- 频繁搜索的字段可以作为索引。
- 在联接属性上建立索引(主外键)。
- 经常排序分组的字段。
- 删除使用频率较低的索引
- 指定索引块的参数,如果将来会在表上执行大量的insert操作,建立索引时设定较大的ptcfree
如何避免索引失效-口诀
- 全职匹配我最爱,最左前缀要遵守;
- 带头大哥不能死,中间兄弟不能断
- 索引列上少计算,范围之后全失效
- like百分写最右,覆盖索引不写星
- 不等空值还有or,索引失效要少用
- var引号不可丢,SQL高级也不难
参考文献
Java8新特性
参考文献 腾讯云社区
HTTP与 HTTPS的区别
- HTTP需要到CA申请证书,需要花费一定的金钱,因此在成本上比HTTP要高
- HTTP是超文本传输,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
- HTTP和HTTPS使用完全不同的连接方式,使用的端口也不一样,http是80,Https是443。
- HTTP连接简单,是无状态的,HTTPS协议是
SSL+HTTP
协议构建的,可进行加密传输,身份认证的网络协议,比http协议安全
网友评论