面试复习题(一)Java系列
(根据自己的理解和根据黑马资料总结—意见不统一我会写上自己的理解)
一、Java面向对象
1.面向对象都有哪些特性以及你对这些特性的理解
继承、封装、多态。(抽象)
2.public,private,protected,默认的区别
3.为什么要用clone?
实际编程中,我们会遇到这种情况,有个对象A,我们需要和对象A参数一样的对象B,并且B的改动不会影响A的值。
clone()方法是最简单最高效的手段。
4.new一个对象的过程和clone一个对象过程的区别
new操作符
执行new操作符时,首先看new后面的类型,确定内存空间。
再调用构造函数,填充对象的域,也就是对象初始化。
构造方法返回后,对象创建完毕,把引用发布到外部,利用引用操纵这个对象。
clone操作符
第一步也是分配内存。
元对象参数通过clone方法进行复制,填充新对象的域、
clone方法返回,一个新对象创建,吧新对象引用发布到外部。
5.clone对象的使用
public LinkedBinaryTree<T> clone() throws CloneNotSupportedException {
LinkedBinaryTree<T> binaryTree=(LinkedBinaryTree<T>)super.clone();//1.强转
binaryTree.setRoot((BinaryNode<T>)binaryTree.getRoot().clone());//2.设置新的深层参数克隆
return binaryTree;//返回克隆对象
}
6.浅克隆和深克隆就是浅拷贝和深拷贝
二、JavaSE语法
1.Java有没有goto语句。
goto是Java的保留字,目前版本Java没有使用。
根据James Gosling编写的The Java Programming Language一书中附录给了一个Java关键字列表,其中有goto和const,但是现在这两个关键字是无法使用的关键字,因此很多地方将其称为保留字,保留字在C程序中表示为系统中有特殊意义的单词或者单词的组合
2.&和&&的区别
&运算符有2种用法,按位与。
&&运算符是短路与运算。
3.Java中,如何跳出当前多重嵌套循环
自带标记法
here:
for(int i=;i<;i++) {
for(int j=;j<;j++) {
System.out.println(j);
break here;
}
}
boolean法标记
try catch强行跳出
4.两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?
不对,重写equals方法首先得重写hashcode方法,hashcode相同直接返回true,因为表示对象相同,如果不同,那么会继续用equals方法比较参数的值,如果相同返回true,不同返回false,利用hashcode加入比较可以提高效率。
5.是否可以继承String
String类是个final类,不可以继承String。如果要对String重用,可以用关联关系(Has-A)和依赖关系(Use-A)、
Has-A关联关系:调用String。
Use-A依赖关系:调用String内部属性。(例如用char[] 数组模拟)
6.当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,name这里到底是值传递还是引用传递?
是值传递,该值为该对象的引用。对象的属性可以在调用中被改变,但对对象引用的改变不会影响到调动着的。
7.重载(overload)和重写(override)的区别。重载的方法能否根据返回类型进行区分?
方法重载和重写都是实现多态的方式。
重载发生在一个类中,参数类型,参数个数或者二者都不一样,蚕食名字一样,叫做重载。
重写则是发生在父类和子类之间,重写要求有相同名字,相同返回类型。
8.为什么函数不能通过返回类型区分重载?(华为面试题)
调用时不能指定返回类型信息,编译器不知道你要调用那个函数、
如float max(int a,int b);
int max(int a,int b);
9.char型遍历能不能储存一个中文汉字,为什么?
可以,因为Java中使用的编码是Unicode编码,一个char类型占2个字节,所以放一个中文是没有问题的。
10.抽象类和接口有什么不同?
抽象类可以定义构造器,接口不能
抽象类可以有抽象方法和具体方法,接口只能有抽象方法
抽象类可以定义成员变量,接口这孩子能定义常量
抽象类有静态方法,接口类不能有
一个类可以继承一个抽象类,但是能实现多个接口
11.抽象方法是否可以同时是静态的,是否可同时是本地方法(native),是否可以同时被synchronized?
都不能,抽象方法需要重写,静态方法不能重写,本地方法是本地代码(如C代码实现),抽象方法没有实现,矛盾。
synchronized和方法实现同步细节有关,抽象方法不涉及实现同步细节,也是矛盾的。
12.阐述静态变量和实例变量的区别?
静态变量:被static修饰的变量,也就是类变量。不管创造多少对象,只有一个拷贝。
实例变量:必须依存一个实例,需要先创建对象然后通过对象访问它。
13.==和equals区别?
equals是方法,==是运算符
==可用于比较基本数据类型是否相等,比较对象是比较对象的地址是否相等。
equals比较对象内容是否相等
14.break和continue区别?
break用于结束一个循环
continue跳过本次循环,执行下一个循环
15.String s="Hello";s=s+" world!";这句话执行完原始对象变了没有?
没有,指向了另一个对象Hello World!,原对象处于游离状态、
16.Java中多态机制是什么?
Java中多态机制实际是一个类似父类引用指向子类对象,通过一个抽象的父类,来实现多个子类的调用,可以调用时才进行动态绑定对象。
这样的好处是不用改变引用,只需要改变引用的对象指向即可。
三、异常处理
1.Java中异常分为哪些种类?
分为CheckedException和RuntimeException,Checked异常不处理无法编译,RuntimeException运行时异常知道处理时可以try-catch,不知道可以throw new RuntimeException()。
CheckedException例如IOException,FileNotFoundException
UnCheckedException例如ArithmaticException,IllegalArgumentException等
2.error和exception的区别
Error类和Exception类的父类都是Throwable类,他们的区别是:
Error一般是指虚拟机相关的问题,例如系统崩溃,虚拟机不足,内存空间不足,方法调用栈溢出等。
Exception表示可以处理的异常,可以捕捉并且回复,这样应该尽可能处理异常,使程序回复运行,而不应该随意终止
3.java异常处理机制
根类 Throwable
子类Error Exception
Exception中分为 ArrayIndexOutOfBoundsException,NullPointerException,ClassCastException
4.易错题
5.写出5个常见的RuntimeException
NullPointerException空指针异常
ClassNotFoundException类找不到异常
NumberFormatExcepion字符串转换异常
IndexOutOfBoundsException数组索引越界异常
IllegalArgumentException数据类型转换异常
NoClassDefFoundException未找到类定义错误
SQLExceptionSQL异常
InstantiationException实例化异常
NoSuchMethodException方法不存在异常
6.throw和throws区别
throw:在语句抛出异常,方法体内,如果出现某情况,throw一下
throws:声明方法时,方法声明时,不一定遇到这种情况,知识先抛出
7.final、finally、finalize区别
final:用于声明属性,方法和类。分别表示属性不可变,方法不可覆盖,被修饰类不可继承
finally:异常处理语句结构的一部分,表示无论运行成功与否,总是执行
finalize:Object类的一个方法,在垃圾收集器执行的时候会调用回收对象此方法,可以覆盖此方法提供垃圾手机时的其他资源回收,例如关闭文件等。
五、JavaSE常用API
1.Math.round(11.5)等于多少,Math.round(-11.5)是多少?
12和-11
四舍五入的原理是在参数上加上0.5或者向下取整
2.swith能否作用在byte上,能否作用在long上,能够作用在String上?
Java5之前,switch只能byte,short,char,int,Java5开始,可以使用Enum,Java7开始,可以使用String,long、floar等是不可以的
3.数组有没有length()方法?String有没有length方法?
数组没有length()方法,String有length()方法,JavaScript中,字符串长度是length属性
4.String,StringBuilder,StringBuffer区别?
String只是字符串,是无法改变的
StringBuffer更安全,因为各方面进行了synchronize修饰
StringBuiler更快
5.什么情况用+运算符进行字符串连接比调用StringBuffer/StringBuilder更好?(华为面试题)
实验表明,当我们使用jdk自带的javap反编译工具,可以发现无论是+还是StringBuiler,根本上都是使用的是StringBuiler进行连接
结果来说,是等效的
运行效率、资源消耗,在反编译时,我们会发现+运算符会出现大量的资源消耗,因为处于一个循环体,每个循环体都需要new出一个StringBuiler,所以消耗大量资源,
所以我们应该直接使用StringBuiler
6.请说出下面的输出
7.Java的日期时间
7.1如何获取年月日、小时分钟秒
7.2如何获得1970年1月1日0时0分0秒到现在的毫秒数?
7.3如何获取每个月最后一天?
调用ca.getActualMaximum(Calendar.Day_OF_MONTH);
7.4如何格式化日期?
SimpleDateFormat类
7.5打印昨天当前时刻?
cal.add(Cakendar.DATE,-1);
或者
LocalDateTime today=LocalDateTime.now();
today.minusDays(1);
7.6Java8日期特性?
客服日期时间实现所有缺陷。
我了解几个LocalDate类,LocalDateTime类,有plus,minus方法,
format方法,传入DateTimeFormatter.ofPattern("")
7.7吐槽Java8之前日期槽点?
(1)year与month,year必须减去1900,month必须加1
(2)Calendar,DateFormat,Date职责分开,3个都不太方便
(3)Date和Calendar属性都是可变的
六、Java的数据类型
1.Java基本数据类型有哪些,占几个字节?
8种,boolean1,byte1,char2,short2,int4,float4,double8,long8
2.String是基本数据类型吗?
String是引用类型,底层是通过char数组实现的。
3.short s1=1;s1=s1+1;有错误么?short s1=1;s1+=1有错么?
前者不正确,后者正确。对于short s1=1;s1+=1;可以正确编译,因为s1+=1相当于s1=(short)(s1+1),而前面不包含强制类型转换。
4.int和Integer有什么区别?
Java是一个近乎纯洁的面向对象的编程语言,每一个基本类型都对应一个包装类。
从Java5开始引入自动拆装箱机制,两者可以相互转换。
5.下面Integer类型输出结果是?
true和false
涉及IntegerCache,看过源码,不过多阐述
6.String类的常用方法?(略)
7.String、StringBuffer、StringBuilder的区别?(略)
8.数据类型之间的转换?
(1)调用对应包装类的方法parseXXX(String)或valueOf(其余类型)返回基本类型
(2)通过+进行连接转换
七、Java的IO
1.Java中有几种类型的流?
按照流的方向:InputStream、OutputStream
按照功能:
节点流:可以向某一个特定的地方读写数据,如FileReader
处理流:对一个已经存在的流进行包装,如BufferedReader
按照处理数据的单位:字节流和字符流
字节流:继承inputStream和outputStream
字符流:继承inputSteamReader和outputSteamWriter
2.字节流如何转换为字符流
字节输入流转字符输入流通过inputSteamReader实现,该类的构造方法可以传入inputSteam对象
字节输出流转字符输出流通过outputSteamWriter实现,该类的构造函数可以传入outputSteam对象
3.如何将一个java对象序列化到文件
能够序列化文件的类必须实现Serializable接口,该接口没有任何抽象方法,只是起到一个标记作用。
4.字节流和字符流的区别
字节流读取的时候,读到一个字节,返回一个字节,字符流使用了字节流,读到一个字节或者多个字节,(
中文对应字节GBK,GB2312是2个,在UTF-8是3个),先去查指定的编码表,能查到的字符返回,字节流
可以处理所有的类型数据,如:图片,MP3,AVI视频文件,字符流智能操作纯文本数据。字节流主要操作byte
型的数据,以byte数组为准,主要操作类就是OutputStream、InputSteam
字符流处理单元为两个字节的Unicode字符,分别操作字符,字符数组和字符串,而字节流处理单元为一个
字节,操作字节和字节数组,所以字符流是有Java虚拟机将字节转化为2个Unicode字符为单位而成的,所以对
多国语言支持也非常好,如果是音频,图片,歌曲的备份,则用字节流比较好。。
5.如何实现对象的克隆?
两种方式:
1.实现Cloneable接口并且重写Object类中的clone()方法;
2.实现Serializable接口,通过对象序列化和反序列化实现克隆,可以实现真正的深度克隆,克隆代码如下:
八、Java集合
1.HashMap排序题(某公司面试)(简单)
2.集合的安全性问题?
请问ArrayList,HashSet,HashMap是线程安全的么?如果不是我想要线程安全的集合怎么办?
只有Vector和HashTable是线程安全的,源码中各自的方法,都有synchronized关键字
Collections.synchronizedCollection(c);
Collections.synchronizedList(list);
Collections.synchronizedMap(m);
Collections.synchronizedSet(s);
上面几个函数都有相应的返回值类型,传入什么函数返回什么类型,源码中实际将集合的方法填上了synchronized关键字
3.ArrayList内部是用什么实现的?
回答这个,不能只是回答皮毛。
回答内部是用Object[]实现的,接下来可以分析ArrayList的构造,增删改查等
4.并发集合和普通集合有什么区别?
并发集合常见的有ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque等。并发集合位于java.util.concurrent包
下,是jdk1.5之后才有的,主要作者是Doug Lea完成的。
ConcurrentHashMap是线程安全的HashMap的实现,默认分成16个segment,每个segment都是线程安全的,所以效率比较高。
5.List的三个子类的特点?
ArrayList底层结构是数组,底层查询快,增删慢。
LinkedList底层结构是链表,增删快,查询慢。
Vector底层是数组,线程安全,增删慢,查询慢。
6.List,Map,Set区别?
List和Set是存单列数据的集合,Map属于存储Key-Value的集合。List存储的数据是有序顺序,并且允许重复。Map存储的数据
是无序数据,键是不能重复的,值是可以重复的,Set存储的是无序的,不允许重复,但是元素在集合中的位置由hashcode决定
,位置是固定的。
7.实现类
List有3个实现类LinkedList,ArrayList,Vector
Map有3个实现类HashMap,HashTable,LinkedHashMap
HashMap基于hash表Map接口,非线程安全,高效,支持null和null键。
HashTable线程安全,不支持null和null键。
LinkedHashMap是HashMap的一个子类,保存了记录数据的顺序。
SortedMap接口TreeMap能够排序,根据键值的升序排序
8.数组和链表简介
8.1数组和链表的区别
8.2数组和链表的应用场景
8.3跟数组有关的面试题
10.List a=new ArrayList()和ArrayList a=new ArrayList()的区别?
前者是list对象,所以有很多ArrayList的属性和方法都不能使用,而后者保留了属性。(比如trimToSize方法)
11.对集合更新操作时,ArrayList和LinkedList哪个更加适合?
ArrayList是实现了基于动态数组的结构,LinkedList基于链表的数据结构
如果集合数据对于集合访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
如果集合数据要频繁进行add和remove,LinkedList比较占优势
12.用2个队列模拟堆栈结构。
两个队列模拟堆栈,队列先进先出,堆栈先进后出,模拟如下
需要一个ArrayList进行中间进行存放
13.Collection和Map的集成体系
14.Map中的key和value可以为null么?
HashMap对象的key,value均可为null
HashTable对象的key,value均不可为null
两者的key均不能重复,若添加key相同的键值对,后面的value会覆盖前面的value不会报错
九、Java的多线程
1.多线程的创建方式
(1)继承Thread类
(2)实现Runnable接口
(3)使用ExecutorService、Callable、Future实现有返回结果的线程:ExecutorService、Callable、Future对象属于Executor框架中
的功能类
2.在java中wait和sleep方法有什么不同?
wait会释放锁,sleep一直持有锁,wait通常被用于线程交互,sleep通常用于暂停执行
3.synchronized和volatile关键字的作用?
一个共享变量(member variable and static variable)被volatile修饰之后,有着2层含义:
(1)保证了不同现场对这个变量进行操作的可见性,一个线程修改了某个变量的值,新值对其他线程来说是立即可见的
(2)禁止进行指令重排序
volatile本质是告诉jvm当前变量在寄存器中是不稳定的,需要在主存中读取
synchronized是锁定当前变量,只有当前线程可以访问该变量,其他线程锁住
2.1.1volatile仅仅用在变量级别;
sychronized可以用在变量,方法,类级别
2.1.2volatile仅仅实现变量修改可见性,不能保证原子性
sychronized可以保证可见性和原子性
2.1.3volatile不会造成线程堵塞
synchronized可能造成线程堵塞
4.分析线程并发访问代码并解释原因
不一定,我运行后是600多,在Java的内存模型中每一个线程运行时都有一个线程栈,线程栈中保存了线程运行时的变量值信息,当访问某一个
对象的值的时候,首先通过对象的引用找到堆内存的变量值,然后把堆内存变量具体值load到线程本地内存中,建立一个变量副本
之后线程就不再和对象变量值有任何关系,而是直接修改变量的值,在修改后某个时刻,自动把线程变量副本值协会堆中
变量,这样堆中对象的值就产生变化了。(所以值一定小于1000,每次运行结果还不一样)
5.什么是线程池,如何使用?
线程池就是把多线程对象放在一个容器中,想使用,不是去new线程,而是直接去池子中拿到线程即可,节省了开辟线程的时间,提高了
代码的执行效率。
常见的线程池?
new SingleThreadExecutor创建单线程线程池,保证所有任务提交顺序进行
new FixedThreadPool可缓存线程池,依赖JVM最大线程的大小
new CachedThreadPool大小无限的线程池,周期性任务
new ScheduledThreadPool单线程线程池,周期性任务
new SingleThreadExecutor单线程的线程池,定时周期性执行任务
7.请叙述下您对线程池的理解?
(1)降低了资源的消耗。
(2)提高了响应的速度
(3)提高线程的可管理性
8.线程池启动策略
(1)池子刚创建时,没有线程
(2)调用execute()方法添加一个任务,线程池会进行如下判断:
a.正在运行的线程数量小于corePoolSize,创建线程运行任务
b.大于等于corePoolSize,这个任务放入队列
c.队列已经满了,运行线程数量小于maximumPoolSize,name还是要创建线程运行这个任务
d. 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告
面试复习题(一)Java系列的更多相关文章
- .net基础学java系列(一)视野
本文目的在于扩展你我视野,求各位大神帮忙补充下表格中的内容,特别是Java的相关内容. 下面的文字纯是为了凑足150个字. 本人作为一名普通的.net程序员,也快混了十年了.在.net方面的知识面较广 ...
- .net基础学java系列(三)徘徊反思
.net基础学java系列(三)徘徊反思 上一篇文章:.net基础学java系列(二)IDE 之 插件 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/1 ...
- .net基础学java系列(二)IDE 之 插件
上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...
- 面试:用 Java 实现一个 Singleton 模式
面试:用 Java 实现一个 Singleton 模式 面试系列更新后,终于迎来了我们的第一期,我们也将贴近<剑指 Offer>的题目给大家带来 Java 的讲解,个人还是非常推荐< ...
- 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token
为什么你学不会递归?告别递归,谈谈我的一些经验 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...
- 【面试突击】- Java面试总则
Java基础 1.Map.Set.List集合差别及联系详解 2.HashSet类是如何实现添加元素保证不重复的 3.HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安 ...
- java 面试题目(java高级架构)
题目信息 java基础: 1. Java 基础 JDK 和 JRE 有什么区别? Java中JDK和JRE的区别是什么?它们的作用分别是什么? == 和 equals 的区别是什么? 两个对象的 ...
- 深度解析互联网大厂面试难题自定义@EnableXX系列
深度解析互联网大厂面试难题自定义@EnableXX系列 其实是一个@Import的设计技巧 创建注解@EnableXX(任何名称注解都行,只是这个名字好一些) XXConfiguration类不能 ...
- 面试中关于Java你所需知道的的一切
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
随机推荐
- JVM内存模型及配置参数
JVM 分为堆.栈.方法区.程序计数器.本地方法栈 栈内存存放局部变量表.操作栈.动态链接.方法出口等信息 1. 局部变量表存放了编译期可知的各种基本数据类型(boolean.byte.char.s ...
- 内存或磁盘空间不足,word无法显示所请求的字体
从百度哪里获得了解决方法,应该是字体没有添加到C盘的fonts目录下面,记录一下解决办法. 在电脑上打开Windows PowerShell ,以管理员身份运行.(可能有的同志不知道怎么以管理员的方式 ...
- Implementing a Dynamic Vector (Array) in C(使用c实现动态数组Vector)
An array (vector) is a common-place data type, used to hold and describe a collection of elements. T ...
- Python深入学习之特殊方法与多范式
Python深入学习之特殊方法与多范式 Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来 ...
- redis安装及遇到的坑-linux
获取Redis安装包“redis-4.0.8.tar.gz”,上传Linux服务器; 使用root用户解压: tar zxvf redis-4.0.8.tar.gz -C /usr/local/; 进 ...
- php配置php-fpm启动参数及配置详
php-fpm 启动参数及重要配置详解 约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/ ...
- DiskSim
1.使用笔记 http://feifei432.blog.163.com/blog/static/140253361201022211949152/ http://feifei432.blog.163 ...
- 2019牛客暑期多校训练营(第二场)-F artition problem
题目链接:https://ac.nowcoder.com/acm/contest/882/F 题意:将2×n个人分成两组,每组n个人,求一个组中所有人和另外一组的所有人的竞争值之和. 思路: 比赛时看 ...
- HighGo瀚高数据库4.3版本安装说明
1. 通过与瀚高同事沟通, 获取到安装文件(点赞一下瀚高的同事, 效率很高并且说明的很完整) 瀚高是基于postgresql数据库做的深度定制开发的国产数据库. 不仅仅支持x86 也支持龙芯等全国产安 ...
- 浅谈Linux du命令
**du(disk usage),顾名思义,查看目录/文件占用空间大小** 1.查看当前目录下的所有目录以及子目录的大小 du -h du -ah #-h:用K.M.G的人性化形式显示#-a:显示目 ...