2018年12月11日java开发实习生准备面试

1、string、stringbuffer和stringbuilder的区别
string:字符串的内容是不可变的,也就是说字符串一旦生成,它得值和它分配的空间就不能改变的。
boolean equals(object anObject):区分大小写的
boolean equalsIgnore(Oject anobject)是不区分字符串大小写的
**stringBuffer:**字符串序列,可以改变其长度和内容,在进行插入和删除等操作的时候,得到的结果会存放在stringbuffer中,不会产生新的对象,非常适合大型的文本处理。而且具有线程安全性,由于采用了同步的机制,不予许多个线程对stringbuffer同时操作,效率比较低。
stringbuilder:和stringbuffer差不多,同样是一个可变的字符序列化。但是他是线程不安全的,没有同步机制,实现于多个线程,相对于stringbuffer来说,单个线程的效率会比stringbuffer的高。
2、math类中的应用
math.e:输出e的值
math.PI:输出PI的地址
math.random:随机产生0——1随机数
math.sqrt:求10的平方根
math.pow:计算2的3次方
math.round:四舍五入的值
3、super的使用
在子类继承超类的时候,除了超类中的私有成员不能被子类继承外,超类中的构造方法也不能被子类继承。如果想在子类中继承父类的构造方法使用super关键字。
在子类中使用super调用超类中的方法时,super语句放在子类的构造方法中,并作为子类构造方法中的第一句。
格式:super(参数列表)
例如:class people{
string name;
int age;
people(string name,int age){
this.name = name;
this.age=age;
}

}
class employee extends People(
string position
Employee(string name ,int age,string position){
super(name,age);
this.position=position;
s./

}
)
4、final、finally和finalize的区别
**final:**1、阻止类的继承。2、阻止方法的重写。3、阻止修改常量的值,但是必须事前声明好常量的值
例:1、final class A{
public void f(){
System.out.println(f());}
//不能继承class A

}
final也是创建常量方法;
所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变。

语法:final 常量名 = 值;
public class HelloWorld{
public static void main(String[] args) {
final double PI = 3.14;
System.out.println(PI);

}

}

程序中使用常量可以提高代码的可维护性。例如,在项目开发时,我们需要指定用户的性别,此时可以定义一个常量 SEX,赋值为 “男”,在需要指定用户性别的地方直接调用此常量即可,避免了由于用户的不规范赋值导致程序出错的情况。

伙计们注意啦:常量名一般使用大写字符
例2:
class A{
public final void f(){
System.out.println(f());}
//不能重写f()方法}
finally:就是不管程序是否有没有抛出异常,finally代码能保证特定的操作总是会被执行格式:
public void ReadFile(){
try{
}
catch{
}
finally(关闭文件)
}
就是是finally语句不管异常是否被抛出,都要执行的。如果try中没有抛出异常,那么catch的语句就会跳过执行finally语句。但是如果try抛出异常,那么
程序会挑选适合的catch语句执行,然后执行finally语句。同样,如果在try和catch中执行了return语句,finally语句同样也是要执行的。
finalize:
这个方法就是垃圾收集器在确定这个对象从内存清除出去之前的做必要的工作,就是对垃圾收集器对这个对象没有被引用的时候,对这个对象进行调用使用的方法
5、对象的序列化和反序列化的实现
ObjectInputStream(InputStream in):以字节输入流为参数,创建对象输入流。也就是字节形式读取对象。
ObjecOutputStream(OutputStream out):以字节输出为参数,创建对象的输出流,也就是以字节形式写入对象。
主要读写方法:
(1):Object readObject();从对象输入流中读取对象
(2):writeObject(Object obj):从对象输出流中写入对象
代码:
**1、**ObjectOutputStream oo =new ObjectOutputStream(new FileOutputStream(new File(“E:/person.txt”)))
oo.writeObject(person);//把对象的数据写入person.txt中
**2、**ObjectIutputStream ois =new ObjectIutputStream(new FileIutputStream(new File(“E:/person.txt”)))
Person person = (Person) ois.readObject()//从person.txt中读取数据
6、int和integer的区别
(1)integer是int的包装类;int是基本数据类型
(2)integer变量必须实例化后才能使用,int变量不需要
(3)integer实际上是对象的引用,指向new的integer对象,int是直接存储数据值。
(4)integer的默认值为null,int的默认值为0.
代码显示:
integer i =new integer(100);
int i=100;
7、泛型的概念
泛型的本质是参数化类型,也就是说将所操作的数据类型指定为一个参数。这种参数类型可以应用在类、接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法,
好处:在编译的时候检查类型是否安全,并且所有的强制转换都是自动的和隐式的,以提高代码的重用率。**可以更换多个数据类型,解决单一类型的困难。**但是与方法的参数不同,泛型的类型参数只能是类类型(包括自定义类),不能使简单的类。
缺点;泛型类中的静态方法不能访问泛型类中的类型参数。
代码;
clas foo{
private string information
public foo(){
}
public foo(String info){
this.informationinfo;
}
public void setinfo(){
this.information
info;
}
public void getinfo(){
retrun this.information;
}
后面方法;
}
使用泛型的方法
class Foo{
private information;
public Foo(){}
public Foo(T info){
this.informationinfo;}
public void setInfo(T info){
this.information
info;
}
public T getInfo(){
return this.information;
}
public static void main(String[] args){
Foo f1=new Foo(“Apple”);//设置数据类型
System.out.println(f1.getInfo());
Foo f2=new Foo(new Integer(100));
System.out.println(f2.getInfo());
Foo f3=new Foo(new Double(22.58));
System.out.println(f3.getInfo());

}
}
8、java集合框架的三个类型set(集)、list(队列)、Map(映射)
set(集):最主要的特征是集合中对象无特定的顺序,并且没有重复的对象。
主要实现类有:
1、Hashset类按照哈希算法来存取集合中的,速度比较快
2、LinkedHashset:不仅实现了哈希算法,而且实现了链表的数据结构,提供了插入和删除的功能。
3、Tree类:实现SortedSet接口,具有排序的功能。
list(队列):主要的特征是其元素以线型方式存储,集合中可以存放重复对象。
1、**Arraylist类:**代表长度可变的数组,系统可以对元素快速的随机访问,但是arraylist对于插入和删除元素的速度比较慢。
随机读取的方法:get(index)所以快
代码:
public E get(int index) {
rangeCheck(index);

  return elementData(index);

}
E elementData(int index) {
return (E) elementData[index];//直接通过数组的下标来读取元素
}
ArrayList插入时候要判断容量,删除时候要将数组移位,有一个复制操作!
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 判断是否要增容
elementData[size++] = e;
return true;
}
2、linkedlist类:在实现中使用双向链表的数据接口,对顺序访问进行优化,系统对随机访问速度比较慢。向Linkedlist中插入和删除速度比较快。
随机访问的时候:而LinkedList则采用size/2 ,二分法去加速一次读取元素!
Node node(int index) {
// assert isElementIndex(index);

    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}

在插入和删除的时候:LinkedList直接插入,不用判断容量,删除的时候也是直接删除跳转指针节点,没有复制的操作!
代码:
public boolean add(E e) {
linkLast(e);
return true;
}

void linkLast(E e) {
final Node l = last;
final Node newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}

map(映射):是一种键对象和值对象进行的集合,它的每一个元素都包括一个键对象和一个值对象。 键对象是值对象的索引,而且值对象依然可以是map类型
1、Hashmap类:按照Hash算法来存取对象,有很好的存取性能;为了保证HashMap能正常工作,和Hashset一样,需要键对象要覆盖equals()方法和hashCode方法。
Vector是数组实现的,是一个矢量队列,是线性安全的。是适合于有多线程对集合元素进行操作的时候。
他们的用法:
private static ArrayList arrayList = new ArrayList()
private static LinkList arrayList = new ArrayList()
private static Vector vector = new Vector();
private static Stack stack=new Stack
private static void main(String[] args){
///
insertData(arrayList,“ArrayList”);
insertData(linkedist,“LinkedList”);
/
/
/
}
9、error和execption error的区别
error :表示系统级的错误和程序不必处理的异常,是java运行环境的内部错误或者硬件问题,比如,内存资源不足,对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的
exception error表示需要捕捉或者程序进行处理的异常,他处理的是因为程序设计的问题而引起的问题。或者在外的输出等引起的一般性问题。
exception一般分为运行时异常和受检查是异常
10、单例模式通用即是懒汉式的代码:
private class singleton{
private static final Singleton singleton = new singleton()
private singleton(){
//限制产生多个对象}
public static singleton getsingleton(){
return singleton;
}
public static void dosomething(){
}
}
}
10、数据库的三大范式
第一范式:数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即是实体中的某个属性不能有多个值或者不能有重复属性的存在传递函数关系。
第二范式:完全依赖于主键,消除非主属性对主码的部分函数依赖、
第三范式:每个非关键字列独立于其他非关键字列,并依赖于主关键字,第三范式指数据库表中的任何非主键之间都不产生依赖关系,全部依赖于主键字段。例如:将学员的姓名和所属班级名称放在同一张表中是不科学的。因为学员依赖于班级,可将学员信息和班级信息单独存放。
11、什么是索引
根据数据库的功能,可以在数据库设计器中创建四种索引:普通索引唯一索引主键索引聚集索引
索引:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
12、简单说一下struts2。
Struts2是基于MVC模式的web应用框架,struts2作为控制器来建立模型与视图的交互。利用拦截器处理用户请求。
Struts.Xml的程序运行流程
在这里插入图片描述
Web.xml主要配置于struts的核心控制器。
Struts.xml核心配置文件,主要配置于和管理定义动作包、动作、和拦截器action。然后应用include标记将这些文件整合到struts.xml文件中
Struts项目的一般组成:
控制组件:核心控制器和业务逻辑控制器(action)
模型组件:javabeans,ejb
视图组件:jsp,html
配置文件:web.xml、struts.xml
拦截器是struts2框架的基石,框架许多功能的完成都是构建在拦截器的基础之上的比如
类型转换,数据校验等
就是动态的拦截action
Struts主要使用了struts标签库和OGNL
Strurs2提供了一个标签库:struts_tags标签库,几乎所有struts标签都整合到其中。
在jsp中使用struts2标签的时候,需要使用一下代码引入标签库。
<%@taglib prefix=”s” uri=”/struts-tags”%>
<>
13、简单说一下hibernate
Hibernate是轻量级javaEE应用的持久层解决方案。它对JDBC轻量级的封装,不仅管理java类到数据库表的映射,还能提供数据查询和获取数据的方法。
使用hibernate可以大幅度减少开发时人工使用sql和jdbc处理数据时间
Hibernate的使用的持久化类的编写规范;
必须具有无参构造方法
具有一个主键属性
非final类,否则无法使用懒加载以及代理
使用javaBean的编写规范来编写属性的setter和getter方法。
Select max(age) from user 获取最大的年龄
Select avq(u.sge) from user.u 获取平均年龄
Select sun(u。age) from user u
Select count(*) from user
Inner join/join:内连接
Left outer join/left join左外连接
Right outer join/right join:右外连接
Select name from where age in(30.90)
Select name from where name=“黎明”and age>20
14、简单说一下Spring
它是一个开源的以控制反转和面向切面为核心的内容框架,用于简化企业级的开发。
依赖对象不再由调用者来创建,而是由外部容器负责,此时对依赖对象的控制权就由应用转移带外部容器,这种控制权的转移就称为控制反转。实例化调用者是,可通过依赖注入的方式将依赖对象注入到应用组件中。
15、超级管理员和普通的管理员的权限。
16、字符串的反转和替换
17、数据库中的两表关联和两表查询
18、分页的方式和分页查询
19、分级列表
20、在数据类型中实现类型的转换
public class test{
public static void main(String args[]){

int i = 200;
long lng = (long)i;
system.out.println(lng);}//强制性的转换
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值