1 面向对象的特征有哪些?
抽象 将一些对象的共同特征行为抽离出来,归纳为类
封装 将一些方法功能的代码打包起来,使用者不需要知道如何实现,只需要调用 接口,具体体现:setter/getter方法、设计模式、jar包、ssm框架等等
继承 将同类对象的共同属性、共同方法,抽离出来形成父类,然后子类直接继承 父类。好处:减少重复代码
多态 不同对象对同一消息做出的不同响应。
分为编译时多态 和运行时多态。
编译时多态 具体表现是 方法的重载;
运行时多态 具体表现是 方法的重写;
2 访问修饰符 public /protected/default/private的区别?
被public修饰的属性、方法、类,能被本类、子类、同包、其他包访问。
被protected修饰的,能被本类、同包、子类访问。不能被其他包访问
被default修饰的,能被本类、同包访问。不能被子类、其他包访问
被private修饰的,只能被本类访问。不能被子类、同包、其他包访问。
3 String是基本数据类型吗?
不是。基本数据类型有:
整型(short/int/long)、浮点型(单精度float、双精度double)
、布尔型(boolean)、字符型(char)、字节型(byte)
1字节=8位 ,单精度是指数字存储占用4个字节
双精度是指数字存储占用8个字节
String 是引用数据类型,还有枚举、数组
4 float f=3.14是否正确?
不正确,编译器默认是双精度(double),double型的3.14赋值给单精度float 需要强转,可写成:float f=(float)3.14或者 float f=3.14F
5 short s=1;s=s+2 正确吗?
short s=1 s=+2 正确吗?
不正确, 2是int型,s+2是int型,int型赋值short型,需要强转,int占4个字节
short类占2个字节
正确, s=+2,编译器帮助强转;等价于 s=(short)(s+1)
6 Java有没有goto?
goto在java中是保留字,没有被使用;
c语言中使用,表示直接跳出外循环;
7 int 和Integer的区别?
int 是基本数据类型
Integer是包装类型
java 是一门面向对象的语言,设计者为每个基本数据类型引入了对应的包装类。
java5 引进了自动装箱拆箱机制,两者可以自动转换。
包装类可以调用属性和方法
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);//true
System.out.println(f3 == f4);//false
}
/* String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
System.out.println(s1 == s2);//false
System.out.println(s1 == s5);//true
System.out.println(s1 == s6);//false
System.out.println(s1 == s6.intern());//true
System.out.println(s2 == s2.intern());//false
*/
String s1 ="abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
看csdn收藏夹中的文章
8 &与&&的区别?
&& 是短路与,左边为false是产生短路,不需要在看右边
9 解释内存中的堆(stack)、栈(heap)和方法区(method area)的用法?
String str= new String("hello");
str 存放在栈中 ;new String ("hello")存放在堆里;"hello"存放在方法区
10 Math.round(1.6)等于多少? Math.round(-1.6)等于多少?
round 是四舍五入,规则: 数值+0.5,,然后调用floor()方法
1.6+0.5 等于2.1 ,向下取值2
-1.6+0.5 等于-1.1. 向下取值-2
11 switch(key)中的key是哪些类型?
java5 之前 byte char short int
java5 是 byte char short int enum
java7 是 byte char short int enum String
12 数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length属性;而String有length()方法
13 java中如何跳出多重循环?
使用带标签的break,类似c语言中的goto,但是要慎用。
14 构造器能否被重写?
构造器是不能被继承的,因此不能被重写。但是可以重载。
15 两个对象 x y 若x.equals(y)==true的话,但却有不同hashcode,对吗?//重点:主要按equals()方法有没有被重写
不对,若是equals比较的是引用,若是为true的话,hashcode 一定相同。
若是hashcode不同,equals()一定不为true
若是 hascode相同,equals()两个对象的引用可以相同,也可能不同
java默认的 equals()方法 比较的是 对象引用;
== 比较的是 对象的赋值。
特例,String类型的equals()方法被重写,比较的不是对象的引用,而是对象的赋值。
17 String类是否可以被继承?
String类是final类,不能被继承。
18 String与StringBuffer/StringBuilder的区别?
String是只读字符串类型
StringBuffer/StringBuilder是读写字符串类型
StringBuffer与StringBuilder功能一样,但是Builder没有被synchronized修饰, 线程是不安全的,一般在单线程中使用。buffer是线程安全的。
19 重载和重写的区别?
重载和重写都是多态的表现。
重载发生在同一类中,方法的参数列表不同,方法名相同,与返回类型无关。
重写发生在子类与父类之间,访问修饰符范围不小于被重写的方法,参数列表、方法名、返回类型都要相同。方法体重写。
20 描述一下JVM加载class文件的原理机制?
定义:JVM 是内存中的虚拟机
组成:
类加载器 Class Loader 将类文件从外存加载到内存中,加载方式
运行数据区Runtime data area
执行引擎 ExecutionEngine
本地接口 Native Interface
23 抽象类和接口的异同?
同 都不能实例化;
异 抽象类中可以同时包含抽象方法和普通方法,而接口中必须都是抽象方法。
抽象类中可以没有抽象方法,但是接口中必须要有抽象方法。
抽象类中可以定义成员变量,而接口中的成员变量其实是常量。
抽象类与子类有继承关系。而接口的实现类没有继承关系。
24 静态嵌套类(Static Nested Class)和内部类(Inner Class)的区别?
内部类 需要在外部类实例化后 才能实例化
静态嵌套类 不依赖外部实例化后才能实例化
25 内存泄漏(memory leak)与内存溢出(out of memory)区别?
内存泄漏 :程序使用完占用的内存后,不能释放该内存,自己和其他程序也都不
能使用该内存,该内存资源就浪费掉了。
打比方:你向系统租了一个带锁的柜子,你使用完柜子后,钥匙丢了,自己
和系统都不能使用这一柜子,也不能被垃圾回收器回收。或者是冰箱里装鸡蛋,但是鸡蛋永久占位,不释放空间。
内存溢出 :程序向系统申请内存空间装不下程序,产生内存溢出。
打比方: 你向系统租了一个带锁的柜子,你向放一辆汽车进去,就产生内存
溢出现象。或者是 冰箱里装大象。
25. java中存在内存泄漏吗?
理论上不会,但是实际上有些对象不被gc回收,比如hibernate中的一级缓存Session中的对象属于持久态,不被Gc回收。
26.抽象方法可以是静态的吗?
不可以,因为抽象方法需要被重写,静态方法是不能被重写的。
抽象方法可以是本地方法(native)吗?
不可以,本地方法是通过c代码实现的,抽象方法是没有实现的
抽象方法可以被synchronized修饰吗?
不可以,抽象方法是没有方法体的,同步synchronnized修饰的是具体实现的方法体。
27 静态变量和实体变量的区别?
静态变量是属于类,通过类名直接调用;
同时在内存中只分配一个共享空间;
应用场景:上下文类和工具类,这样节省内存消耗。
28 静态方法中是否可以调用非静态方法?
不可以。
29 如何实现对象克隆?
法一;实现接口Cloneable,并重写Object类中clone()方法
法二:实现Serializable接口,对对象进行序列化和反序列化实现复制
30 为什么要有GC机制?
防止内存泄漏,缺点:垃圾回收的不可预知性。
31 抽象类可以实现接口或者继承具体类或者继承抽象类吗?
都可以,比如一个被abstract修饰的类,称为抽象类,抽象类中可以实现接口方法,可以重写抽象方法。
33 java 格式文件中是否可以包含多个类?有什么限制?
可以,但是只有一个类是public修饰,文件名同该public类名
34 匿名内部类 anonymous inner class 可以继承类和实现接口吗?
可以,SWing编程和android开发常用到,实现事件的监听和回调
35 内部类可以调用外部类的成员吗?
可以
36 静态成员和构造器的运行顺序(java类加载机制)
创建对象时构造器的调用顺序:
先初始化静态成员,然后调用父类构造器和非静态方法,然后调用子类构造器
37 如何字符串转换成基本数据类型?
解析成xxx(String) parsexxx(String)
或 valueOf(String). ???是怎么转换
38 如何通过递归实现字符串的反转?
public static String reverse (String originStr){
if(originStr==null || originStr.length()<=1)
Return originStr;
return reverse(originStr.substring(1))+originStr.charAt(0);
}
40 如何将字符串编码格式进行转换?
String str=new String("abc".getBytes("gb2312"),"utf-8");
42 如何取得年月日时分秒?
Calendar.getInstance().get(Calendar.YEAR)
Calendar.getinstance().get(Calendar.MONTH)
如何取得1970年1月1日000 到现在的毫秒数?
Calendar.getInstance().getTimeInMillis()
如何取得某月的最后一天?
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH)
如何格式化日期?
new SimpleDateFormat("YYYY-MM-DD hh:mm;ss").format(new Date());
打印昨天的当前时间?
cal=Calendar.getInstance();
cal.add(Calendar.DATE,-1)
system.out.println(cal.getTime())
43 编写recursive function 递归方法注意什么?
注意收敛条件。例如
main(){
main(null);}
例如 生活中的例子 一个男人既是父亲也是儿子
循环体是方法
44 try{ return 语句}finally{} 执行顺序是什么?
Return 语句执行完后不会直接向调用者返回值,而是保持在内存中,等finally{}执行完后再返回值,若是finally{}语句修改了返回值,返回修改后的返回值。这样容易产生混乱,实际编程过程要避免。
45 final 、 finally、 finalize() 区别?
finalize()方法是在system.gc()回收垃圾之前进行准备工作。
46 异常catch顺序?B继承A, A继承Exception
Try{
throw new B("b");
}catch(A e){sysou("a");
}catch(Exception e){
sysou("Exception");}
输出 b。此题出自 Java thinking
47 Thread.sleep() / wait() yield() 的区别是什么?
48。如何进行线程同步编程(银行存款)
法一:对共享资源(共同方法)前加 synchronized修饰
法二:在线程类中调用共享方法的时候,使用同步代码块进行同步
run(){
synchronized(account){account.deposit(money);}
}
法三:在共享资源所处的类中,添加一个Lock成员变量
private Lock accountLock=new ReentrantLock();
法四:Semaphore实现同步
法五:CountdownLatch实现同步
49 编写线程类有几种实现方式?
法一:继承Thread类 ,是单继承,不推荐
法二:实现runnable接口,接口更灵活
法三:实现Callable
50 启动一个线程是调用run()还是start()?
是调用start(),使jvm运行,jvm调用run()
51 什么是线程池?
设计背景
创建和销毁对象是非常消耗时间和内存资源的,每创建一个对象,jvm就要一直跟踪它,当对象不是需要了,jvm进行垃圾回收。这样就产生了“池化资源”技术
线程池
事先创建多个线程对象放入一个容器中,需要时直接从容器中获得,用完再放入池中。这样减少了创建对象和销毁对象对内存资源的开销
线程池接口
Executor ExecutorService--
Executors工具类提供了创建线程池的静态工厂方法
newSingleThreadExecutor()
newFixedThreadPool()
newCachedThreadPool()
newScheduledThreadPool()
52. Synchronized 与 lock的异同是什么?
Syn自动释放锁
Lock需要手工释放锁
53 Statement /PreparedStatement /CallableStatement 区别?
Prepared可以对sql语句进行预编译,减少sql语句编译错误;
Pre 使传入sql语句中参数是占位符,减少用字符串拼接sql语句注入带来的不安全;
Pre 具有缓存sql语句作用,对频繁执行的相同查询,不需要重复查询数据库,性能好
CallableStatement提供对存储过程的调用。存储过程是指数据库中可以实现特定功能的sql语句集合。存储过程优点减少网络传输的开销,缺点数据库迁移,不同数据库之间存储过程的书写不一致,
54 jdbc操作数据库时,如何提升读取数据的性能?更新数据库的性能?
读:通过ResultSet的setFetchSize()方法指定每次抓取的记录数,抓取越多,查询越快,用空间换时间;
更新:使用Preparedstatement构建批量处理。
55
事务的四种属性是什么?
原子性 atomic
一致性
隔离性
持久性
56 数据并发访问操作,会产生哪些问题?
脏读: A事务读取B事务未提交的数据,若B事务执行回滚,那么A事务读取的就是脏数据
不可重复读:A事务前后两次读取的数据不相同,在读取前后数据被B事务修改过
幻读:A事务查询的结果集比之前查询多处一些数据,原因是B事务添加了新数据
第一类丢失更新:(A回滚,B事务更新的数据丢失)事务A回滚,事务B提交的更新数据都丢失;
第二类丢失更新:(A提交,B事务更新的数据丢失)事务A的提交覆盖事务B已经提交的数据,造成事务B所做的操作丢失
57 如何解决数据并发访问问题?
锁机制,数据库为用户提供了自动锁机制;用户通过选择隔离级别给数据加上不同类型的锁。
隔离级别
READ UNCOMMITED 不允许第一类丢失更新。注明:A事务回滚(uncommitted),B事务更新的数据不丢失。
READ COMMITED 注明:当A事务提交成功时,B事务更新的数据不丢失。
REPEATALE READ 注明: 当A事务重复读取数据时,事务前后保持一致。
SERIALIZABLE 隔离级别最高
58JDBC 如何进行事务处理?
将JDBC连接数据的一系列代码操作当作一个事务,连接过程中若是出现异常,进行回滚。
Connection提供了处理事务的方法
setAutoCommit(true/false),可以实现系统自动提交和用户手动显式提交。
用户手动显式提交 使用 commit();
出现异常时,使用rollback();
jdk 3.0以后,引入了 savepoint保存点概念,可以设置保存点,实现回滚到指定保存点处
59 JDBC 能处理Blob和Clob数据类型吗?
Blob是Binary large object Clob 是 Character large object
可以处理,InputStream in = new FileInputStream("test.jpg")
ps.setBinaryStream(2, in)
60 获得类的类对象有哪些方式?
String str="hello";
类型.class 例如 String.class
对象.getClass() 例如 “hello”.getClass()
Class.forName() 例如 Class.forName("java.lang.String")
61 反射这方面需要恶补
62 面向对象的 六原则一法则是什么?
1单一职责原则:一个类只做它该做的事情,实现高内聚原则
2开闭原则:对扩展开放,对修改关闭
3依赖倒转原则:面向接口编程,声明方法的参数类型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类型
4里氏替换原则:任何时候都可以用子类型来替换掉父类型
5接口隔离原则:接口要小而专,不要大而全
6合成聚合复用原则:多用组合少用继承实现代码复用(将狗继承宠物改成狗类有一个宠物成员变量)
类之间的三种关系:继承/组合/依赖 ,比如学生是人类,学生有姓名/年龄(成员变量),学生使用文具学习(方法参数)
迪米特法则:低耦合原则
63 简述一下你知道的设计模式?
工厂模式
代理模式
适配器模式
双亲模式
64 线程安全和线程不安全的单例模式?
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}
65 什么是UML?
UML是统一建模语言,常用的建模工具:Viso PowerDesign等
面试题整理(中)