面试题

  • 面试题:

数据类型

	1: * 	int是几个字节?4个
	 * 
	2: * 	3 默认是什么类型?int,4个字节
	 * 
	3 :*  3.14默认是什么类型?double
	 * 
	4 :*  java中基本数据类型有哪些?
	 * 分别是以下8种类型
	 * 整数:byte(1)  short(2)  int(4)  long(8)
	 * 小数:float(4)   double(8)
	 *布尔: boolean: true  false 
	 *字符: char

5: System.out.println(5>3 ? 9 : 8.5 ); 输出结果为?(9.0)

6: public static void main(String[] args) {
int i=1;
System.out.println(i);
method(i)
System.out.println(i);
}
public public static void method(int i){
i = 2 ;
}

两次输入的值为多少?
答案 两次都是1

7:重载和重写的区别
相同点:方法名字相同

不同点:
重载:1.在同一个类里
2.参数列表不能相同
3.可以抛出不同的异常
4.可以有不同的修饰符
5.重载与返回值无关,可以存在父类,子类,同类中

		重写:1.不在同一类中
				2.方法名、返回值、参数列表都要相同
				3.不能抛出超过父类的异常
				4.访问权限不能高于父类

8:继承可以多继承吗? interface接口可以多继承,其它都不行。

9:说下final的用法?
修饰数据:把数据变成常量,只能赋值一次不能改变
修饰方法参数: 整个方法中,不能改变参数的值
修饰方法:表示这个方法不能被重写
修饰类:表示该类无法被继承

:10:说下final finally finalize的区别?

final :修饰数据:把数据变成常量,只能赋值一次不能改变
修饰方法参数: 整个方法中,不能改变参数的值
修饰方法:表示这个方法不能被重写
修饰类:表示该类无法被继承

finally :finally 里面的代码一定执行

finalize :一个对象的finalize()方法只会被调用一次
推荐不要使用finalize()方法

:11:一个方法中可以同时存在super() 跟this()吗?
不能 两个代码都要放到方法的第一行,有冲突,所以不能同时存在

12:java的3大特性?
继承 封装 多态

13:说出5个异常?
有两个重要的子类: Error(错误) 和 Exception(异常) 。
Error(错误):是程序无法处理的错误,和运行环境相关

NullPointerException(空指针异常)
UnkownTypeException (不知道类型异常) 有时候不强制转换,会报这个异常。
ArrayIndexOutOfBoundsException (下标越界异常)
IllegalArgumentException (非法参数异常)JDK版本和我们使用的框架版本不匹配会报这个错误
ClassNotFoundException (类)报错是确实是常见的

14:说下堆栈的区别?
栈的优势是,存取速度比堆要快

堆内存:通过new关键字出来的对象放在堆内存中,堆内存可以动态的分配内存大小,垃圾回收器自动回收不再使用的数据,由于动态分配内存所以存取的速度较慢,堆内存先进先出

栈内存:栈内存读取速度快,栈内存中数据可以共享,先进后出;方法中的临时变量

15:抽象类是否一定有抽象方法?
抽象类可以没有抽象方法

16:接口可以写些啥?
1,抽象方法 2,常量属性 3,静态的非抽象方法(JDK1.8+)

17:生成对象有几种方式?
1.用new语句创建对象,这是最常见的创建对象的方法。
2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
3.调用对象的clone()方法
4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

18:==和equals的区别
==” 属于关系运算符,比较的是两个基本数据类型的值是否相等.

equals方法不能作用于基本数据类型的变量,equals继承Object类
比较的是:是否是同一个对象,
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

String

19:、下面的代码将创建几个字符串对象?
String s1 = new String(“Hello”);
String s2 = new String(“Hello”);
答案:3个
解析:因为“Hello ”前面没有声明,直接new 的话“Hello”就自动声明了 String s=“Hello”
所以题目代码等于是
String s=“Hello”
String s1 = new String(“s”);
String s2 = new String(“s”);
所以答案是3个

20、在java中,String s=new String(“xyz”);创建了几个对象?( B)
A 1个 B 2个 C 以上都不对
答案:B 解析:思路和上题一样;

21、下面的代码输出什么?
//String s1 = new String(“abc”);
String s2 = new String(“abc”);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
//
答案:第一条:false
第二条:true
解析: 每new一次都会在堆内存里开辟一个新的空间 所以这2个String在各自的区间,地址值不同 返回false;
String字符串用equals比较只要是值一样都返回true

22、下面的代码输入什么?
String s1 = “abc”;
String s2 = new String(“abc”);
s2.intern();
System.out.println(s1 ==s2);
答案:false
解析:s2.intern();没有改变原s2的值,所以一个是对象一直是常量 存放的地址值不同:返回false;
如果把s2.intern();改成 s2=s2.intern(); 就返回true;
intern();:返回字符串对象的规范化表示形式。

23、下面的代码输出什么?
String s1= “abc”;
String s2= “abc”;
String s3 = new String(“abc”);
String s4 = new String(“abc”);
System.out.println(s3s4);
System.out.println(s3.equals(s4));
System.out.println(s1
s3);
System.out.println(s1.equals(s3));
System.out.println(s1==s2);
答案:1.false 2.true 3.false 4.true 5.true
解析: 1、s3和s4对象都是新new的 在各自的区间 地址值不同 返回true ;
2、String用equals比较只要里面的值相同就是true
3、s1和s3 一个常量一个对象 用 存放的地址值不同 返回false
4、String用equals比较只要里面的值相同就是true
5、s1和s2都是常量 存放地址相同(都在常量池),且值相同 返回true(String比较建议使用equals)

24、下面的代码输出什么?
String str1 = “ab” + “cd”;
String str11 = “abcd”;
System.out.println(str1 == str11);
答案:true
解析:String str1 = “ab” + “cd”;是两个常量相加,常量值是固定的 程序在运行前就可以算出来了 其实就是
String str1 = “abcd”; 2个常量相比较 地址一样(都在常量池)且值一样 返回true;

25、下面的代码输出什么?
String str2 = “ab”;
String str3 = “cd”;
String str4 = str2+str3;
String str5 = “abcd”;
System.out.println(str4==str5);
答案:false
解析:str2 ,str3 是已经声明的变量 String str4 = str2+str3; str4就等于是两个变量相加
因为是两个变量相加运行前不知道具体值,运行时才能运算得到具体的值 变量运算后存放在栈内存
常量存放在常量池 地址值不同 所以返回false;

26、下面的代码输出什么?
final String str2 = “ab”;
final String str3 = “cd”;
String str4 = str2+str3;
String str5 = “abcd”;
System.out.println(str4==str5);
答案:true
解析:str2 ,str3在声明的时候用final 修饰了 变量变成了常量 str4 等于是两个常量相加,常量相加
程序运行前就得到了具体值,存放在常量池里,str5 为常量 2个常量比较,地址一样(都在常量池),且值相同 返回 true;

27、下面的代码输入什么?
String str6 = “b”;
String str7 = “a” + str6;
String str67 = “ab”;
System.out.println(str7 == str67);
答案:false
解析:str6是变量 str7 = “a” + str6; 运算里有变量 所以程序运行后才能得到值,
常量存放在常量池,运算后的值存放在栈内容 地址值不一样 返回false

28、下面的代码输入什么?
final String str8 = “b”;
String str9 = “a” + str8;
String str89 = “ab”;
System.out.println(str9 == str89);
答案:ture;
解析:str8声明是被final 修饰变成常量 str9 = “a” + str8 就等于是两个常量相加,
两个常量相加程序运行前就得到了值(因为常量不会变,运行前就可以得出结果),存放在常量池,str89 也是常量 存放在常量池
地址值相同,值相同所以返回ture;

29、String s1=”Hello”; String s2=”hello”; String s3=s1.toLowerCase(); String s4=s2.toLowerCase();
下面选项结果为true的是:
A.S1= =s3
B.S2= =s3
C.S2= =s4
D.S3= =s4
答案:C
解析:toLowerCase()方法是把字符串变成小写,如果本身就是小写没有改变就不动,
如果改变就把改变的值存在新的内存里,因此
A:S1为“Hello” S3通过toLowerCase()方法把“Hello”变成了“hello” 改变了值,存放在新的内存
有了新的地址值,所以S1和S3的地址值不同 返回false;

    B:S2是常量,存在常量池,S3是通过toLowerCase()方法把“Hello”变成“hello”的,存放位置不在常量池
          虽然值相同,但是地址值不同 返回false  (如果把 == 换成 equals  就返回ture 因为String用equals 比较,只要值相同就返回ture)
	
	C:S2位常量,值为“hello”,因为本身全是小写字母 toLowerCase()对他无效 返回原来的值 用S4接收 
	  所以String s4=s2.toLowerCase(); 等于是 S4=S2; 都是常量,且值相同 返回true;
	  
	D:S3通过toLowerCase()方法得到存放在堆内存,因为S2==S4是常量 存在常量池 地址值不同返回false;

30、StringBuffer、StringBuilder的区别是什么?
StringBuffer多线程安全的,效率低。StringBuilder多线程不安全,效率高。

31、Integer i1 = 12 ;
Integer i2 = 12 ;
Integer i3 = new Integer(10);
Integer i4 = new Integer(10);

	System.out.println(i1 == i2);
	System.out.println(i1 == i3);
	System.out.println(i3 == i4);
	分别返回什么
	true  Integer 自动装箱 范围在 -128~127 之间 则使用静态区初始好的对象 因此两者的地址都在静态区 返回true
	false  一个在静态区 一个在堆内存  地址不同返回false  
	false  2个new的对象都在各自的区间 地址不同返回false

解析:Integer 自动装箱如果范围在-128 ~ 127之间则使用静态区初始化好的对象,如果超出范围则相当于在堆中new

**

集合

**

32、Vector 跟ArrayList的区别是什么?
ArrayList :线程不安全,效率高 , 默认初始容量10 加载因子 1 扩容1.5倍
Vector :线程安全,效率低 ,默认初始容量10 加载因子1 扩容2倍

s
33、List 跟 Set Map的区别?
Set: 不按特定的方式排序,没有重复对象。 Set接口主要实现两类
HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。

List(列表):List的特征是其元素以线性方式存储,集合中可以存放重复对象。 List接口主要实现类包括:
ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。
LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。

Map(映射):
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map利用put(key, value)的形式添加元素。

34、HashSet 存学生对象,M个,请问初始容量设置成多少效率最高?
N*0.75>=M 并且N是2的最小幂次方

35、 Array和ArrayList的区别,什么时候更合适用Array

1 Array是数组,可以容纳基本类型和对象,而ArrayList是集合,只能容纳对象

2 Array是指定大小的,而ArrayList的大小是动态的

3 Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等,

4 适合用Array的情况

             i.          如果列表的大小已经指定,大部分情况下是储存和遍历他们

            ii.          对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上ArrayList的工作也会变得很慢

           iii.          如果你需要使用多维数组,使用[ ][ ]比List<List<>>更简单

36、 ArrayList和LinkedList的区别

1 ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构

2 对于随机访问get和set,ArryList要优于LinkedList,因为LinkedList要移动指针

3 对于新增和删除操作add和remove,linkedList比较占优势,因为ArrayList要移动数据。这一点要看实际情况,如果只对单条数据插入或
删除,ArrayList的速度反而优于LinkedList。但批量随机插入,则考虑LinkedList。因为ArrayList每插入一条数据,要移动插入点及之后 的所有数据

37、 HashMap和HashTable的区别

1 Hashtable是线程安全的,同步的;而hashMap是线程不安全不同步的

2 HashMap允许存在一个null的key,多个null的value;而hashtable的key和value都不允许为null

38、HashMap和TreeMap的区别
1 HashMap是无序的 ,TreeMap是有序的
2 在Map中增加、删除和定位元素,HashMap的最好的选择,但如果要按自然顺序或自定义顺序遍历Map,那么就使用TreeMap
3 使用HashMap要求作为key的类中明确重写了hashCode()和equals()方法

39、 Set里的元素是不能重复,那么用什么方法来区分重复与否呢?是用==还是用equals()?

1 Set里的元素是不能重复的,用equals()方法来区分重复与否;

40、 Collection和Collections的区别:

1 Java…util.Collection是一个接口(集合顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在java类库中有很多集合的实现,其直接继承collection接口有List和Set

2 Collections则是集合类的一个工具类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索及线程安全等操作。

41、 说出ArrayList、linkedList的存储性能和特性

1 ArrayList采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除速度慢

2 LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取的速度快,而中部插入速度慢

42、 Enumeration和iterator接口的区别

1 Enumeration接口作用与iterator接口相似,但只提供了遍历vector和hashTable类型集合元素的功能,不支持元素的移除操作

2 Enumeration速度是iterator的2倍,同时占用更少的内存。但是,iterator远比enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,iterator允许调用者删除底层集合里面的元素。

43、 Listiterator有什么特点,与iterator区别

1 Iterator是ListIterator的父类接口

2 Iterator是单列集合(Collection)公共取出容器中元素的方式,而ListIterator是List集合的特有取出元素方式

3 Iterator中具备的功能只有hashNext(),next(),remove();Listiterator中具备着对被遍历的元素进行增删查改的方法,可以对元素进行逆向遍历。

44、 Java中HashMap的key值要是为类对象,则该类需要满足什么条件?

1 需要重写equals()和hashCode()方法

45、 ArrayList集合加入1万条数据,应该怎么提高效率?

1 直接初始化ArrayList集合的初始化容量为1万。但达到100万以上乃至1000万以上时,初始化容量方法效率会下降

后加的
HashMap实现原理:
HashMap基于hashing原理,通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

java中线程池创建的几种方式
1.Executors工厂方法创建
2.new ThreadPoolExecutor()自定义创建

异常

46、请说出5个运行时异常?
1、ClassCastException(类转换异常)
2、IndexOutOfBoundsException(数组越界)
3、NullPointerException(空指针)
4、ArrayStoreException(数据存储异常,操作数组时类型不一致)
5、BufferOverflowException(IO操作异常)

47、throws跟throw的区别?
throw是语句抛出一个异常。
throws是声明方法可能抛出异常。(用在声明方法时,表示该方法可能要抛出异常)

48、请说下5个异常类?

NullpointException(空指针异常)

ClassNotFoundException(类找不到异常)

ClassCastException(类型转换异常)

IllegalArgumentException(非法参数异常)

ArithmeticException(算术异常)

NumberFormatException(数据格式异常)

IndexOutOfBoundsException(数组下标越界异常)

IllegalStateException(非法语句异常)

49、创建对象有几种方式?
1,new 2,clone 3,反射 4,反序列化

50、servlet转发和重定向的区别:
1.转发在服务器端完成的;重定向是在客户端完成的

2.转发的速度快;重定向速度慢

3.转发的是同一次请求;重定向是两次不同请求

4.转发不会执行转发后的代码;重定向会执行重定向之后的代码

5.转发地址栏没有变化;重定向地址栏有变化

6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

Mysql

50、数据库中where与having区别?
group by:分组
where在sql中是一个约束声明,使用where来约束数据库的数据。
having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作
here在group by之前执行,having 在group by 之后执行。where和having 可以同时存在一个SQL语句中。

经历如此漫长的互联网发展 以本人的拙见 软件开发 粗略的 分为 三个阶段
1 单机版
也就是说把 要做的所有应用程序 放置在一个 项目中 最后 将之后的war 或者jar 部署在你的服务器
这种模式 随着发展 终将会被淘汰 是因为出现的问题 将随之而来 并发 耦合 等 问题 刻不容缓
2 分布式
如何理解 : 专业的事情 交给专业的人去做 尽量降低 耦合度(就是说 每个模块 是不受影响的 )
一个模块你只做一件小事情
3 微服务
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,
每一个微服务提供单个业务功能的服务,一个服务做一件事,
从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁
拥有自己独立的数据库

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值