Java基础习题库
目录
1.JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些
5.一个”.java”源文件中是否可以包括多个类?有什么限制(明*数据)
7.常用的几个命令行操作都有哪些?(至少4个)(北京数字**)
8.Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)
3.Java变量按照数据类型怎么划分?并指出Java的基本数据类型有哪8种,并指出各自占用的内存空间大小
5. 说明基本数据类型变量之间强制类型转换的使用规则和强转可能出现的问题。
3. Java中的基本类型有哪些?String 是最基本的数据类型吗?(恒*电子)
byte、short、int、long、float、double、char、boolean
5. Java开发中计算金额时使用什么数据类型?(5*到家)
6. char型变量中能不能存储一个中文汉字,为什么?(*通快递)
8. int i=0; i=i++执行这两句化后变量 i 的值为(*软)
11. 为什么Java中0.1 + 0.2结果不是0.3?(字*跳动)
3. 谈谈你对三元运算符、if-else和switch-case结构使用场景的理解
4. 如何从控制台获取String和int型的变量,并输出?使用代码实现
5. 使用for循环遍历100以内的奇数,并计算所有的奇数的和并输出。
2. if分支语句和switch分支语句的异同之处(智*图)
3. 什么时候用语句if,什么时候选用语句switch(灵伴*来科技)
4. switch语句中忘写break会发生什么(北京*蓝)
6. while和do while循环的区别(国*科技研究院)
1. 循环结构是如何最后退出循环的,有哪些不同的情况请说明。
3.一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程 找出1000以内的所有完数。(因子:除去这个数本身的其它约数)
4. 说明break和continue使用上的相同点和不同点
4. 使用线性查找,从上述数组中查找22是否存在。存在,返回所在位置的索引。不存在,输出提示信息。
1. 数组有没有length()这个方法? String有没有length()这个方法?(*蓝)
2. 有数组int[] arr,用Java代码将数组元素顺序颠倒(闪*购)
3. 面向对象思想的体现一:类和对象的创建和执行操作有哪三步?
5. 类的方法内是否可以定义变量?是否可以调用属性?是否可以定义方法?是否可以调用方法?
3. 成员变量和局部变量在声明的位置上、是否有默认初始化值上、是否能有权限修饰符修饰上、内存分配的位置上有何不同?
2.关于类的属性的赋值,有几种赋值的方式。谈谈赋值的先后顺序
3.this关键字可以用来调用哪些结构,简单说明一下其使用。
4. 创建Circle类,提供私有的radius属性,提供相应的get和set方法,提供求圆面积的方法。
4. 面向对象,你解释一下,项目中哪些地方用到面向对象?(燕*金融)
1. Java虚拟机中内存划分为哪些区域,详细介绍一下(神**岳、数*互融)
1. private 、缺省、protected、public的表格化作用区域(爱*信、拓*思、中*瑞飞)
2. main方法的public能不能换成private?为什么?(凡*科技、顺*)
1. 构造方法和普通方法的区别(凡*科技、软*动力、中*软)
2. 构造器Constructor是否可被overload?(鸿*网络)
2. 变量赋值和构造方法加载的优先级问题(凡*科技、博*软件)
3.方法的重写(override/overwrite)的具体规则有哪些?
5.在下面的代码结构中:使用关键字:this,super;方法的重写;继承;
1. 父类哪些成员可以被继承,属性可以被继承吗?可以或者不可以,请举下例子。(北京明**信)
1. 什么是Override,与Overload的区别(顺*、软**力、明*数据、阳*科技、中*软)
2. Overload的方法是否可以改变返回值的类型?(新*陆)
3. 构造器Constructor是否可被override?(鸿*网络、深圳德**技、航**普)
4. 为什么要有重载,我随便命名一个别的函数名不行吗?谈谈你是怎么理解的。(腾*)
2. this、super关键字分别代表什么?以及他们各自的使用场景和作用。(北京楚*龙)
1. 谈谈你对多态的理解(三*重工、江*智能、银*数据、君*科技)
2. 多态new出来的对象跟不多态new出来的对象区别在哪?(万*智能)
3. Java中所有类的父类是什么?他都有什么方法?(阿*校招)
1. static 修饰的属性,相较于实例变量,有哪些特别之处(>=3点)
6.abstract 能修饰哪些结构? 修饰以后,有什么特点?
7.接口是否能继承接口? 抽象类是否能实现(implements)接口? 抽象类是否能继承非抽象的类?
8. 声明抽象类,并包含抽象方法。测试类中创建一个继承抽象类的匿名子类的对象
1. 静态变量和实例变量的区别?(保*丰、*软国际、*软华*、北京明**信)
2. 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?(*度)
3. 是否可以从一个static方法内部发出对非static方法的调用?(同*顺)
4. 被static修饰的成员(类、方法、成员变量)能否再使用private进行修饰?(联*优势)
2. 开发中都用到了那些设计模式?用在什么场合? (久*国际物流)
1. main()方法的public能不能换成private,为什么(凡*科技、顺*)
2. main()方法中是否可以调用非静态方法?(浩*科技)
2. 静态代码块,普通代码块,构造方法,从类加载开始的执行顺序?(恒*电子)
1. 判断题:使用final修饰一个变量时,是引用不能改变,引用指向的对象可以改变?(*米)
4. final或static final 修饰成员变量,能不能进行++操作?(佳*贸易)
2. 为什么不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法?(止**善)
3. 接口与抽象类的区别?(字*跳动、阿*校招、*度校招、**计算机技术及应用研究所、航*拓普、纬*、招**晟、汇*云通、数信**科技、北京永*鼎力、上海*连科技)
4. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实现类(concrete class)?(航*拓普、*蝶、深圳德*科技)
2. 什么是元注解?说说Retention和Target元注解的作用
3. 说说你所理解的集合框架都有哪些接口,存储数据的特点是什么
5. 谈谈你对同步代码块中同步监视器和共享数据的理解及各自要求
2. 面向对象的特征有哪些方面? (北京楚*龙、深圳德*科技、直*科技、米*奇网络、航*拓普)
3. 异常的两种类型,Error和Exception的区别(上海冠*新创、北京中**译、*度)
1. 说说final、finally、finalize的区别(北京中**译、艾*软件、拓*思、*科软)
2. 如果不使用try-catch,程序出现异常会如何?(上海冠*新创科技)
3. try ... catch捕捉的是什么异常?(北京亿*东方)
4. 如果执行finally代码块之前方法返回了结果或者jvm退出了,这时finally块中的代码还会执行吗?(恒*电子)
5. 在try语句中有return语句,最后写finally语句,finally语句中的code会不会执行?何时执行?如果执行是在return前还是后(拓*思、华**为)
6. 捕获异常在catch块里一定会进入finally吗?catch里能return吗?catch里return还会进finally吗?在try里return是什么情况?(*蓝)
1. throw和throws的区别?(北京亿**方、北京新*阳光)
2. 子类重写父类抛出异常的方法,能否抛出比父类更高级别的异常类(顺*)
2.同步代码块中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解,以及注意点。
2. 线程和进程有什么区别(*团、腾*、*云网络、神**岳、言*有物、直*科技)
1. 如何在Java中出实现多线程?(阿*校招、当*置业、鸿*网络、奥*医药、*科软、慧*、上海驿*软件、海*科)
2. Thread类中的start()和run()有什么区别?(北京中油**、爱*信、神*泰岳、直*科技,*软国际,上海*学网络)
3. 启动一个线程是用run()还是start()?(*度)
4. Java中Runnable和Callable有什么不同?(平*金服、银*数据、好*在、亿*征信、花儿**网络)
3. 线程的生命周期?(中国**电子商务中心、*科软、慧*)
5. stop()和suspend()方法为何不推荐使用?(上海驿*软件)
1. 你如何理解线程安全的?线程安全问题是如何造成的?(*软国际)
3. 多线程保证线程安全一般有几种方式?(来*科技、北京*信天*)
5. synchronized加在静态方法和普通方法区别(来*科技)
6. Java中synchronized和ReentrantLock有什么不同(三*重工)
7. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(鸿*网络)
8. 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?(阿*校招、西安*创佳*)
1. Java中notify()和notifyAll()有什么区别(汇*天下)
2. 为什么wait()和notify()方法要在同步块中调用(北京*智)
3. 多线程:生产者,消费者代码(同步、wait、notifly编程)(猫*娱乐)
4. wait()和sleep()有什么区别?调用这两个函数后,线程状态分别作何改变?(字*、*东)
1. 手写一个单例模式(Singleton),还要安全的(*通快递、君*科技)
2. 手写一个懒汉式的单例模式&解决其线程安全问题,并且说明为什么这样子去解决(5*)
1.将字符串”2017-08-16”转换为对应的java.sql.Date类的对象。
3. 自定义Person类如下,如何实现自然排序(按姓名从小到大排序),代码说明
4. 提供定制排序涉及到的接口的实现类对象,并按Person类的年龄从大到小排序
5. JDK8之前和JDK8中日期、时间相关的类分别有哪些?
1. 以下两种方式创建的String对象有什么不同?(*团)
2. String s = new String("xyz");创建了几个String Object? (新*陆)
3. String a="abc" String b="a"+"bc" 问a==b?(网*邮箱)
5. Java中String是不是final的?(凡*科技)
7. String 可以在 switch中使用吗?(上海*睿)
2.2 String、StringBuffer、StringBuilder
1. Java中操作字符串有哪些类?他们之间有什么区别。(南*电网)
3. StringBuilder和StringBuffer的线程安全问题(润*软件)
1. 简单说说 Comparable 和 Comparator 的区别和场景?(软**力)
2. Comparable 接口和 Comparator 接口实现比较(阿*)
1.集合Collection中存储的如果是自定义类的对象,需要自定义类重写哪个方法?为什么?
2.ArrayList,LinkedList,Vector三者的相同点与不同点?【面试题】
3.List 接口的常用方法有哪些?(增、删、改、查、插、长度、遍历)
4.如何使用Iterator和增强for循环遍历List。举例说明
5.Set存储数据的特点是什么?常见的实现类有什么?说明一下彼此的特点。
1. List,Set,Map是否继承自collection接口?(北京中*译咨询、思*贸易)
3. 写出list、map、set接口的实现类,并说出其特点(华**为)
2. ArrayList与LinkedList区别?(O**O、滴*、汇*天下、拓*软件、博纳**软件、上海*进天下,北京永生**信息、*联、在*途游)
3. ArrayList与Vector区别呢?为什么要用ArrayList取代Vector呢?(湖**利软件)
4. Java.util.ArrayList常用的方法有哪些?(华**为)
5. Arraylist 是有序还是无序?为什么?(蜜*信息)
2. List集合和Set集合的区别?(亚*科技、*海*翼科技,*华电*系统,达*贷)
3. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?(鸿*网络)
4. TreeSet两种排序方式在使用的时候怎么起作用?(拓*软件)
2. final怎么用,修饰Map可以继续添加数据吗?(*深蓝)
5. HashMap和Hashbable的区别?(银*数据、阿**巴芝麻信用、*众银行、爱*信、杭州*智公司)
6. Hashtable是怎么实现的,为什么线程安全?(迪*创新)
7. HashMap和LinkedHashMap的区别(北京*晨阳光)
8. HashMap 和 TreeMap 的区别(*度,太极**、*线途游、阿*校招)
10. HashMap的key存储在哪里?和value存储在一起吗?那么value存储在哪里?说具体点?(湖**利软件、天*伟业)
2. Collection 和 Collections的区别?(平*金服、*软)
4. HashMap是否线程安全,怎样解决HashMap的线程不安全(中*卫星)
1. ArrayList的默认大小是多少,以及扩容机制(顺*、凡*科技)
3. 在ArrayList中remove后面几个元素该怎么做?(惠*、中*亿达)
2. HashMap初始值16,临界值12是怎么算的(软**力)
4. HashMap怎么计算哈希值和索引?扩容机制?怎么解决hash冲突?(*软国际、中软*腾)
5. HashMap底层是数组+链表,有数组很快了,为什么加链表?(润*软件)
6. HashMap为什么长度达到一定的长度要转化为红黑树(*度)
7. HashMap什么时候扩充为红黑树,什么时候又返回到链表?(汉*)
8. 在 JDK1.8中,HashMap的数据结构与1.7相比有什么变化,这些变化的好处在哪里?(海*科)
1. hashcode和equals区别?(海*供应链管理)
2. hashCode() 与 equals() 生成算法、方法怎么重写?(阿*校招)
3. 说一下equals和==的区别,然后问equals相等hash值一定相等吗?hash值相等equals一定相等吗?(南*电网、上海*智网络)
1.如何遍历Map的key集,value集, key-value集,使用上泛型
2. 写出使用 Iterator 和 增强for 循环遍历List的代码,使用上泛型
3. 提供一个方法,用于遍历获取HashMap中的所有value,并存放在List中返回。考虑上集合中泛型的使用。,string>
4. 创建一个与a.txt文件同目录下的另外一个文件b.txt
6. Java 的泛型是什么?有什么好处和优点?JDK 不同版本的泛型有什么区别?(软*动力)
5.转换流是哪两个类,分别的作用是什么?请分别创建两个类的对象。
1. 谈谈Java IO里面的常用类,字节流,字符流(银*数据)
2. Java 中有几种类型的流?JDK为每种类型的流提供一些抽象类以供继承,请说出他们分别是哪些类?(上海*厦*联网、极*科技)
3. 流一般需不需要关闭?如果关闭的话用什么方法?处理流是怎么关闭的?(银*数据)
4. OutputStream里面的write()是什么意思?(君*科技)
1. BufferedReader属于哪种流?他主要是用来做什么的?(国*电网)
1. 字节流和字符流是什么?怎么转换?(北京蓝*、*海*供应链管理)
1. 什么是Java序列化,如何实现(君*科技、上海*厦物联网)
2. Java有些类中为什么需要实现Serializable接口?(阿*校招)
6. 简单说说TCP协议的三次握手与四次挥手机制 (*科软)
3.创建Class对应运行时类的对象的通用方法,代码实现。以及这样操作,需要对应的运行时类构造器方面满足的要求。
1. 对反射了解吗?反射有什么好处?为什么需要反射?(微*银行)
1. Class类的作用?生成Class对象的方法有哪些?(顺*)
2. Class.forName("全路径") 会调用哪些方法 ? 会调用构造方法吗?加载的类会放在哪?(上*银行外包)
1. 说一下创建对象的几种方法?(华油***集团、*科软、凡*科技)
3. Java反射创建对象效率高还是通过new创建对象的效率高?(三*重工)
2. 说一下Java反射获取私有属性,如何改变值?(阿****麻信用项目组)
1. 谈谈java8新特性(京*旗下、时代*宇,信必*、招*信诺,中*外包,金*软件、阿**巴)
2. JDK1.8在数据结构上发生了哪些变化 ?(银*数据)
3. 你说的了解 Java的新特性 ,你说说JDK8改进的地方?(银*科技)
1. Lambda表达式有了解吗,说说如何使用的(O**O)
2. 你讲讲stream表达式是咋用的,干啥的?(中*国际,上海**网络)
一、Java基础之概述
1.JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些
JDK = JRE + Java的开发工具(javac.exe,java.exe,javadoc.exe)
JRD = JVM + Java核心类库
2.为什么要配置path环境变量?如何配置?
JAVA_HOME = bin的上一层目录
path = %JAVA_HOME%\bin
3.创建如下的类,使得运行的话可以输出:
创建java文件:ChairMan.java
public class ChairMan{
public static void main(String[] args){
System.out.println("姓名:\n");//
//System.out.println();
System.out.println("性别:男");
System.out.println("家庭住址:");
}
}
4.编译和运行上述代码的指令
编译:javac ChairMan.java
运行:java ChairMan
5.一个”.java”源文件中是否可以包括多个类?有什么限制(明*数据)
是!
一个源文件中可以声明多个类,但是最多只能有一个类使用public进行声明。 且要求声明为public的类的类名与源文件名相同。
6.Java 的优势(阿**巴)
跨平台型
安全性高
简单性
高性能
面向对象性
健壮性
7.常用的几个命令行操作都有哪些?(至少4个)(北京数字**)
cd
md
rd
del
cd..
cd/
8.Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)
存在!
不能举例。
9. 如何看待Java是一门半编译半解释型的语言(携*)
二、Java基础之变量
1.标识符的命名规则有哪些? à不遵守,编译不通过。
2.标识符的命名规范有哪些?à不遵守,编译运行都可以通过
包名:xxxyyyzzz
类名、接口名:XxxYyyZzz
变量名、方法名:xxxYyyZzz
常量名:XXX_YYY_ZZZ
3.Java变量按照数据类型怎么划分?并指出Java的基本数据类型有哪8种,并指出各自占用的内存空间大小
byte short int long
char
float double
boolean
引用数据类型:类、接口、数组
4. 说明基本数据类型变量之间自动类型提升的运算规则。
5. 说明基本数据类型变量之间强制类型转换的使用规则和强转可能出现的问题。
容量大的转换成容量小的
使用强转符:()
精度损失。
1. 高效的方式计算2 * 8的值 (文**辉、轮*科技)
使用 <<
答案:2 << 3 、 8 << 1
2. &和&&的区别?(恒*电子、*度)
区分“&”和“&&”:
相同点:如果符号左边是true,则二者都执行符号右边的操作
不同点:& : 如果符号左边是false,则继续执行符号右边的操作
&& :如果符号左边是false,则不再继续执行符号右边的操作
建议:开发中,推荐使用 &&
区分“|”和“||”:
相同点:如果符号左边是false,则二者都执行符号右边的操作
不同点:| : 如果符号左边是true,则继续执行符号右边的操作
|| :如果符号左边是true,则不再继续执行符号右边的操作
建议:开发中,推荐使用 ||
3. Java中的基本类型有哪些?String 是最基本的数据类型吗?(恒*电子)
8种基本数据类型。
byte、short、int、long、float、double、char、boolean
String不是,属于引用数据类型。
4. Java中的基本数据类型包括哪些?(*米)
类似问题: > Java的基础数据类型有哪些?String是吗?(贝壳)同上
5. Java开发中计算金额时使用什么数据类型?(5*到家)
不能使用float或double,因为精度不高。
使用BigDecimal类替换,可以实现任意精度的数据的运算。
6. char型变量中能不能存储一个中文汉字,为什么?(*通快递)
可以的。char c1 = '中';
char c2 = 'a'。
因为char使用的是unicode字符集,包含了世界范围的所有的字符。
7. 代码分析(君*科技、新*陆)
short s1=1; s1=s1+1; //有什么错? =右边是int类型。需要强转short s1=1; s1+=1; //有什么错? 没错
8. int i=0; i=i++执行这两句化后变量 i 的值为(*软)
0。
9. 如何将两个变量的值互换(北京*彩、中外*译咨询)
String s1 = "abc"; String s2 = "123"; String temp = s1; s1 = s2; s2 = temp;
10. boolean 占几个字节(阿**巴)
编译时不谈占几个字节。 但是JVM在给boolean类型分配内存空间时,boolean类型的变量占据一个槽位(slot,等于4个字节)。 细节:true:1 false:0 >拓展:在内存中,byte\short\char\boolean\int\float : 占用1个slot double\long :占用2个slot
11. 为什么Java中0.1 + 0.2结果不是0.3?(字*跳动)
在代码中测试0.1 + 0.2,你会惊讶的发现,结果不是0.3,而是0.3000……4。这是为什么?
几乎所有现代的编程语言都会遇到上述问题,包括 JavaScript、Ruby、Python、Swift 和 Go 等。引发这个问题的原因是,它们都采用了IEEE 754标准
。
IEEE是指“电气与电子工程师协会”,其在1985年发布了一个IEEE 754计算标准,根据这个标准,小数的二进制表达能够有最大的精度上限提升。但无论如何,物理边界是突破不了的,它仍然
不能实现“每一个十进制小数,都对应一个二进制小数”
。正因如此,产生了0.1 + 0.2不等于0.3的问题。
具体的:
整数变为二进制,能够做到“每个十进制整数都有对应的二进制数”,比如数字3,二进制就是11;再比如,数字43就是二进制101011,这个毫无争议。
对于小数,并不能做到“每个小数都有对应的二进制数字”。举例来说,二进制小数0.0001表示十进制数0.0625 (至于它是如何计算的,不用深究);二进制小数0.0010表示十进制数0.125;二进制小数0.0011表示十进制数0.1875。看,对于四位的二进制小数,二进制小数虽然是连贯的,但是十进制小数却不是连贯的。比如,你无法用四位二进制小数的形式表示0.125 ~ 0.1875之间的十进制小数。
所以在编程中,遇见小数判断相等情况,比如开发银行、交易等系统,可以采用四舍五入
或者“同乘同除
”等方式进行验证,避免上述问题。
三、Java基础之流程控制
//定义三个int型变量并赋值,使用三元运算符或者if-else获取这三个数中的较大数的实现
int num1 = 10,num2 = 21,num3 = -21;
int max;
if(num1 >= num2 && num1 >= num3){
max = num1;
}else if(num2 >= num1 && num2 >= num3){
max = num2;
}else{
max = num3;
}
System.out.println("三个数中的最大值为:" + max);
//编写程序,声明2个double型变量并赋值。判断第一个数大于10.0,且第2个数小于20.0,打印两数之和。否则,打印两数的乘积。
double d1 = 12.3;
double d2 = 32.1;
if(d1 > 10 && d2 < 20){
}else{
System.out.println("ok了");
}
//交换两个变量值的代码的实现
String s1 = "北京";
String s2 = "南京";
System.out.println(s1 + s2);
String temp = s1;
s1 = s2;
s2 = temp;
System.out.println(s1 + s2);
1.switch后面使用的表达式可以是哪些数据类型的。
byte 、 short 、char 、int 、枚举类型变量、String类型。
2. 使用switch语句改写下列if语句:
int a = 3;
int x = 100;
if(a==1)
x+=5;
else if(a==2)
x+=10;
else if(a==3)
x+=16;
else
x+=34;
int a = 3;
int x = 100;
switch(a){
case 1:
x+=5;
break;
case 2:
x+=10;
break;
case 3:
x+=16;
break;
default:
x+=34;
//break;
}
3. 谈谈你对三元运算符、if-else和switch-case结构使用场景的理解
结论:凡是使用switch-case的结构都可以转换为if-else结构。反之,不成立。
开发经验:如果既可以使用switch-case,又可以使用if-else,建议使用switch-case。因为效率稍高。
4. 如何从控制台获取String和int型的变量,并输出?使用代码实现
import java.util.Scanner; //导包
Scanner scan = new Scanner(System.in); // 实例化
String info = scan.next(); //键盘输入String
int id = scan.nextInt(); //键盘输入Int
5. 使用for循环遍历100以内的奇数,并计算所有的奇数的和并输出。
int sum = 0;
for(int i = 1;i <= 100;i++){
if(i % 2 != 0){
Sysout(i);
sum += i;
}
}
syout(sum);
1. break和continue的作用(智*图)
2. if分支语句和switch分支语句的异同之处(智*图)
if-else语句优势
if语句的条件是一个布尔类型值,if条件表达式为true则进入分支,可以用于范围的判断,也可以用于等值的判断,
使用范围更广
。switch语句的条件是一个常量值(byte,short,int,char,枚举,String),只能判断某个变量或表达式的结果是否等于某个常量值,
使用场景较狭窄
。switch语句优势
当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用if和switch都可以,习惯上使用switch更多。因为
效率稍高
。当条件是区间范围的判断时,只能使用if语句。使用switch可以利用
穿透性
,同时执行多个分支,而if...else没有穿透性。
3. 什么时候用语句if,什么时候选用语句switch(灵伴*来科技)
同上
4. switch语句中忘写break会发生什么(北京*蓝)
case穿透
5. Java支持哪些类型循环(上海*睿)
for;while;do-while
增强for (或foreach),放到集合中讲解
6. while和do while循环的区别(国*科技研究院)
-
do-while至少会执行一次。
1. 循环结构是如何最后退出循环的,有哪些不同的情况请说明。
① 循环条件返回false
② 在循环体内,一旦执行到break,跳出循环
continue;return
2.指出如下程序输出的结果:
结果:123123123123 |
label: for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 10; j++) {
if (j % 4 == 0) {
continue label;
}
System.out.print(j);
}
System.out.println();
}
3.一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程 找出1000以内的所有完数。(因子:除去这个数本身的其它约数)
//int factor = 0;
for(int i = 1;i <= 1000;i++){
int factor = 0;
for(int j = 1;j <= i/2;j++){
if(i % j == 0){
factor += j;
}
}
if(i == factor){
System.out.println(i);
}
//重置factor
//factor = 0;
}
4. 说明break和continue使用上的相同点和不同点
break:s witch-case 和 循环结构(结束当前循环),其后不可以声明执行语句
continue: 循环结构(结束当次循环),其后不可以声明执行语句
5. 从控制台输出如下结构:
******
*****
****
***
**
*
外层循环控制行数
内层循环控制列数
for(int i = 1;i <= 6;i++){
for(int j = 1;j <= 7 - i;j++){
System.out.print("*");
}
System.out.println();
}
或
for(int i = 0;i < 6;i++){
for(int j = 0;j < 6 - i;j++){
System.out.print("*");
}
System.out.println();
}
IDEA安装与使用
1. 开发中你接触过的开发工具都有哪些?
IDEA、Eclipse
2. 谈谈你对Eclipse和IDEA使用上的感受?
IDEA(集成功能强大、符合人体工程学(设置人性化))
Eclipse不够人性化。
四、Java基础之数组
1.写出一维数组初始化的两种方式
int[] arr = new int[5];//动态初始化
String[] arr1 = new String[]{"Tom","Jerry","Jim"};//静态初始化
数组一旦初始化,其长度就是确定的。arr.length
数组长度一旦确定,就不可修改。
2.写出二维数组初始化的两种方式
int[][] arr = new int[4][3];//动态初始化1
int[][] arr1 = new int[4][];//动态初始化2int[][] arr2 = new int[][]{{1,2,3},{4,5,6},{7,8}};//静态初始化
3.如何遍历如下的二维数组
int[] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
4.不同类型的一维数组元素的默认初始化值各是多少
整型 : 0
浮点型:0.0
char:0
boolean :false
引用类型:null
5.一维数组的内存解析:
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];
1.使用冒泡排序,实现如下的数组从小到大排序。
int[] arr = new int[]{34,5,22,-98,6,-76,0,-3};
for(int i = 0;i < arr.length - 1;i++){
for(int j = 0;j < arr.length - 1 - i;j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
快排时间复杂度:O(nlogn)
冒泡时间复杂度:O(n^2)
堆排序、归并排序
2.如何反转上面的数组。请代码实现
//数组的反转
/* // 方式1
for(int i= 0;i<arr.length/2;i++){
String temp = arr[i];
arr[i] =arr[arr.length -i-1];
arr[arr.length-i-1] = temp;
}*/
/* // 方式2
for(int i =0,j=arr.length-1; i<j; i++,j--){
String temp1 = arr[i];
arr[i] = arr[j];
arr[j] = temp1;
}*/
3. 复制上述数组,得到一个新的数组
vs 赋值操作
array2 = array1;int[] arr1 = new int[arr.length];
for(;;)...
4. 使用线性查找,从上述数组中查找22是否存在。存在,返回所在位置的索引。不存在,输出提示信息。
int dest = 22;
boolean isFlag = true;
for(int i = 0;i < arr.length;i++){
if(dest == arr[i]){
sysout(i);
isFlag = false;
break;
}
}
if(isFlag){
sysout("未找到");
}
或
int dest = 22;
for(int i = 0;i < arr.length;i++){
if(dest == arr[i]){
sysout(i);
break;
}
}
if(i == arr.length){
sysout("未找到");
}
5. 数组中常见的异常有哪些?请举例说明
ArrayIndexOutOfBoundsException:数组角标越界异常:
合理范围:[0,arr.length -1]
越界:arr[-1],arr[arr.length]NullPointerException:空指针异常
int[] arr = null;
arr[0];
1. 数组有没有length()这个方法? String有没有length()这个方法?(*蓝)
数组没有length(),是length属性。
String有length()
2. 有数组int[] arr,用Java代码将数组元素顺序颠倒(闪*购)
3. 为什么数组要从0开始编号,而不是1(中*支付)
数组的索引,表示了数组元素距离首地址的偏离量。因为第1个元素的地址与首地址相同,所以偏移量就是0。所以从0开始。
4. 数组有什么排序的方式,手写一下(平*保险)
冒泡。
快排。
5. 常见排序算法,说下快排过程,时间复杂度?(5*到家)
快排:O(nlogn)
6. 二分算法实现数组的查找(神舟*天软件)
//二分法查找:要求此数组必须是有序的。
int[] arr3 = new int[]{-99,-54,-2,0,2,33,43,256,999};
boolean isFlag = true;
int value = 256;
//int value = 25;
int head = 0;//首索引位置
int end = arr3.length - 1;//尾索引位置
while(head <= end){
int middle = (head + end) / 2;
if(arr3[middle] == value){
System.out.println("找到指定的元素,索引为:" + middle);
isFlag = false;
break;
}else if(arr3[middle] > value){
end = middle - 1;
}else{//arr3[middle] < value
head = middle + 1;
}
}
if(isFlag){
System.out.println("未找打指定的元素");
}
7. 怎么求数组的最大子序列和(携*)
/*
* 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
* 求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
* @author 尚硅谷-宋红康
*/
public class ArrDemo {
public static void main(String[] args) {
int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
int i = getGreatestSum(arr);
System.out.println(i);
}
public static int getGreatestSum(int[] arr){
int greatestSum = 0;
if(arr == null || arr.length == 0){
return 0;
}
int temp = greatestSum;
for(int i = 0;i < arr.length;i++){
temp += arr[i];
if(temp < 0){
temp = 0;
}
if(temp > greatestSum){
greatestSum = temp;
}
}
if(greatestSum == 0){
greatestSum = arr[0];
for(int i = 1;i < arr.length;i++){
if(greatestSum < arr[i]){
greatestSum = arr[i];
}
}
}
return greatestSum;
}
}
五.面向对象 (上)
1.面向对象思想编程内容的三条主线分别是什么
① 类及类的成员:属性、方法、构造器;代码块、内部类
② 面向对象的三大特征:封装、继承、多态
③ 其它关键字:this,super,abstract,interface,static,final,package,import
面向对象的编程思想?
(类、对象;面向对象的三大特征;。。。)
2.谈谈你对面向对象中类和对象的理解,并指出二者的关系?
类:抽象的、概念上的内容
对象:实实在在存在的一个个体。
对象是由类派生出来的。
3. 面向对象思想的体现一:类和对象的创建和执行操作有哪三步?
① 创建类
② 类的实例化(创建new对象)
③ 调用对象的结构:”对象.属性” “对象.方法”
4. 画出如下代码在执行时的内存分配情况
class Car{
String color = "red";
int num = 4;
void show(){
int a = 10;
System.out.println("color="+color+",num="+num);
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car();
c1.color = "blue";
c1.show();
c2.show();
} }
5. 类的方法内是否可以定义变量?是否可以调用属性?是否可以定义方法?是否可以调用方法?
是;是;否;是
1. 什么是方法的重载?
“两同一不同”:同一个类、相同方法名;参数列表不同。
如何调用确定的方法:方法名à参数列表
2. 说明Java方法中的参数传递机制的具体体现?
基本数据类型:数据值
引用数据类型:地址值 (含变量的数据类型)
eg:Person p1 = new Person(); eat();age
User u1 = p1;//编译错误 (逆向思维、反证法)
u1.eat() u1.age
3. 成员变量和局部变量在声明的位置上、是否有默认初始化值上、是否能有权限修饰符修饰上、内存分配的位置上有何不同?
4. 谈谈return关键字的使用
① 结束方法
② 针对于有返回值的方法,return + 返回数据
5. 提供如下代码的内存解析
1. 内存结构:栈(局部变量)、堆(new出来的结构:对象(非static成员变量)、数组)
2. 变量:成员变量 vs 局部变量(方法内、方法形参、构造器内、构造器形参、代码块内)
1.构造器的作用是什么?使用中有哪些注意点(>=3条)
①创建对象
②初始化对象结构
2.关于类的属性的赋值,有几种赋值的方式。谈谈赋值的先后顺序
默认初始化-显式初始化-构造器中初始化-对象.方法 或 对象.属性 给属性赋值
3.this关键字可以用来调用哪些结构,简单说明一下其使用。
this:属性、方法、构造器
this:理解为当前对象,当前正在创建的对象
4. 创建Circle类,提供私有的radius属性,提供相应的get和set方法,提供求圆面积的方法。
private double radius;
public void setRadius(double radius){
this.radius = radius;
}
public double getRadius(){
return radius;
}
public double findArea(){
return 3.14 * getRadius() * radius;
}
2.1 类与对象
1. 面向对象,面向过程的理解?(平*金服、英**达)
2. Java 的引用类型有哪几种(阿*校招)
类、数组、接口;枚举、注解、记录
3. 类和对象的区别(凡*科技、上*银行)
4. 面向对象,你解释一下,项目中哪些地方用到面向对象?(燕*金融)
“万事万物皆对象”
2.2 Java内存结构
1. Java虚拟机中内存划分为哪些区域,详细介绍一下(神**岳、数*互融)
2. 对象存在Java内存的哪块区域里面?(阿*)
堆空间。
2.3 权限修饰符(封装性)
1. private 、缺省、protected、public的表格化作用区域(爱*信、拓*思、中*瑞飞)
2. main方法的public能不能换成private?为什么?(凡*科技、顺*)
能。但是改以后就不能作为程序的入口了,就只是一个普通的方法。
2.4 构造器
1. 构造方法和普通方法的区别(凡*科技、软*动力、中*软)
编写代码的角度:没有共同点。声明格式、作用都不同。
字节码文件的角度:构造器会以
<init>()方法
的形态呈现,用以初始化对象。
2. 构造器Constructor是否可被overload?(鸿*网络)
可以。
3. 无参构造器和有参构造器的的作用和应用(北京楚*龙)
初始化属性信息
2.5 属性及属性赋值顺序
1. 成员变量与局部变量的区别(艾*软件)
2. 变量赋值和构造方法加载的优先级问题(凡*科技、博*软件)
变量显式赋值先于构造器中的赋值。
如何证明?我看的字节码文件。
六.面向对象 (中)
1.什么是多态性?什么是虚拟方法调用?
对象的多态性:父类的引用指向子类的对象。
Person p = new Man();
p.eat();
调用方法时,编译时看左边,运行时看右边。
2.一些概念
一个类可以有几个直接父类?(只有一个)
一个父类可有多少个子类?(多个)
子类能获取直接父类的父类中的结构吗?(可以)
子类能否获取父类中private权限的属性或方法?(可以的)
3.方法的重写(override/overwrite)的具体规则有哪些?
方法名、形参列表相同
权限修饰符
返回值
抛出的异常
4.super调用构造器,有哪些具体的注意点
this(形参列表):本类重载的其它的构造器
super(形参列表):调用父类中指定的构造器
5.在下面的代码结构中:使用关键字:this,super;方法的重写;继承;
1.如何实现向下转型?需要注意什么问题?如何解决此问题?
Person p = new Man();
使用强转符:()
Man m = (Man)p;
可能ClassCastException异常。使用instanceof在进行向下转型前判断。
if(p instanceof Man){
Man m = (Man)p;
}
2.== 和 equals()有何区别?
一、回顾==的使用:
==:运算符
1.可以使用在基本数据类型变量和引用数据类型变量中
2.如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体
二、equals()法:
1.是一个方法,而非运算符
2.只能适用于引用数据类型
3.Object类中equals()的定义:
public boolean equals(object obj){
return (this =obj);
}
说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体
4. 像string、Date、File、包装类等都重写了object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的”实体内容”是否相同。
5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,就需要对object类中的equals()进行重写.重写的原则:比较两个对象的实体内容是否相同,
3.重写
class User{
String name;
int age;
//重写其equals()方法
public boolean equals(Object obj){
if(obj == this){
return true;
}
if(obj instanceof User){
User u = (User)obj;
return this.age == u.age && this.name.equals(u.name);
}
return false;
}
}
4. 写出8种基本数据类型及其对应的包装类
int Integer
char Character
5. 基本数据类型、包装类与String三者之间如何转换
自动装箱、自动拆箱
Integer i = 10;
基本数据类型、包装类--->String: valueOf(Xxx xx)
String--->基本数据类型、包装类:parseXxx(String s)
2.1 继承性
1. 父类哪些成员可以被继承,属性可以被继承吗?可以或者不可以,请举下例子。(北京明**信)
父类的属性、方法可以被继承。构造器可以被子类调用。
2.2 重写
1. 什么是Override,与Overload的区别(顺*、软**力、明*数据、阳*科技、中*软)
2. Overload的方法是否可以改变返回值的类型?(新*陆)
public void method(int i){}
public int method(int j,int k){} 和那没关系
3. 构造器Constructor是否可被override?(鸿*网络、深圳德**技、航**普)
不能!构造器可以重载
4. 为什么要有重载,我随便命名一个别的函数名不行吗?谈谈你是怎么理解的。(腾*)
见名知意。
2.3 super关键字
1. super和this的区别(蚂**服)
把两个关键字各自的特点说清楚。
2. this、super关键字分别代表什么?以及他们各自的使用场景和作用。(北京楚*龙)
2.4 多态
1. 谈谈你对多态的理解(三*重工、江*智能、银*数据、君*科技)
类似问法: > Java中实现多态的机制是什么(国*电网) > 什么是多态?(上*银行) > Java中的多态是什么意思?(贝*)
2. 多态new出来的对象跟不多态new出来的对象区别在哪?(万*智能)
Person p = new Man(); //虚方法调用。屏蔽了子类Man类特有的属性和方法。
Man m = new Man();
3. 说说你认为多态在代码中的体现(楚*龙)
无处不在!
2.5 Object类
1. ==与equals的区别(拓*思)
类似问法: > 两个对象A和B,A==B,A.equals(B)有什么区别(华油**普)
2. 重写equals方法要注意什么?(安**网络科技)
明确判定两个对象实体equals()的标准。是否需要所有的属性参与。
对象的属性,又是自定义的类型,此属性也需要重写equals()
3. Java中所有类的父类是什么?他都有什么方法?(阿*校招)
相关问题: > Object类有哪些方法?(恒*电子)
七.面向对象 (下)
1. static 修饰的属性,相较于实例变量,有哪些特别之处(>=3点)
随着类的加载而加载;
早于对象的创建;
只要权限允许,可以通过”对象.static属性”的方式进行调用;
存在于方法区的静态域
2. final 可以用来修饰哪些结构,分别表示什么意思
3. 代码实现单例模式的饿汉式
4. 代码实现单例模式的懒汉式 -目前还是线程不安全的。
5. 类的属性赋值的位置有哪些?先后顺序为何?
默认初始化
显式初始化 、代码块中初始化
构造器中初始化
通过”对象.属性” 或”对象.方法”的方式赋值
6.abstract 能修饰哪些结构? 修饰以后,有什么特点?
类、方法。
类不能实例化,提供子类
抽象方法,只定义了一种功能的标准。具体的执行,需要子类去实现。
7.接口是否能继承接口? 抽象类是否能实现(implements)接口? 抽象类是否能继承非抽象的类?
能,能,能(object为非抽象的父类)
8. 声明抽象类,并包含抽象方法。测试类中创建一个继承抽象类的匿名子类的对象
abstract AA{
public abstract void m();
}
main(){
AA a = new AA(){
public void m(){
}
};
a.m();
}
class Person{
String name;
public void eat(){}
}
main(){
Person p = new Person(){
public void eat(){}
};
p.eat();
}
9. 抽象类和接口有哪些共同点和区别?
相同点:不能实例化,都可以被继承
不同点:抽象类:有构造器。 接口:不能声明构造器
多继承vs 单继承
10. 如何创建静态成员内部类和非静态成员内部类的对象?
Person static Dog Bird
Person.Dog dog = new Person.Dog();
Person p = new Person();
Person.Bird bird = p.new Bird();
2.1 static关键字
1. 静态变量和实例变量的区别?(保*丰、*软国际、*软华*、北京明**信)
类似问题: > 说明静态变量和实例变量之间的区别和使用场景(上海*动)
2. 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?(*度)
类似问题: > 在java中,可以重载一个static方法吗?可以覆盖一个static方法吗?(Vi*o)
静态方法不能被重写。不存在多态性。
3. 是否可以从一个static方法内部发出对非static方法的调用?(同*顺)
只能通过对象来对非静态方法的调用。
4. 被static修饰的成员(类、方法、成员变量)能否再使用private进行修饰?(联*优势)
完全可以。除了代码块。
2.2 设计模式
1. 知道哪些设计模式?(*通快递、蚂**服)
单例模式、模板方法、享元设计模式
2. 开发中都用到了那些设计模式?用在什么场合? (久*国际物流)
2.3 main()
1. main()方法的public能不能换成private,为什么(凡*科技、顺*)
可以改。但是改完以后就不是程序入口了。
2. main()方法中是否可以调用非静态方法?(浩*科技)
只能通过对象来对非静态方法的调用。
2.4 代码块
1. 类的组成和属性赋值执行顺序?(航*拓普)
类似问题: > Java中类的变量初始化的顺序?(*壳)
2. 静态代码块,普通代码块,构造方法,从类加载开始的执行顺序?(恒*电子)
类似问题: > 类加载成员变量、静态代码块、构造器的加载顺序(*科软、软**力、同*顺) > static代码块(静态代码块)是否在类的构造函数之前被执行(联*优势)
静态代码块 --> 普通代码块 --> 构造器
2.5 final关键字
1. 判断题:使用final修饰一个变量时,是引用不能改变,引用指向的对象可以改变?(*米)
引用不能改变。
引用指向的对象实体中的属性,如果没有使用final修饰,则可以改变。
2. 判断题:final不能用于修饰构造方法?(联*优势)
是的。
4. final或static final 修饰成员变量,能不能进行++操作?(佳*贸易)
不能。
2.6 抽象类与接口
1. 什么是抽象类?如何识别一个抽象类?(易*支付)
使用abstract修饰。
2. 为什么不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法?(止**善)
略。 为了语言的自洽。
3. 接口与抽象类的区别?(字*跳动、阿*校招、*度校招、**计算机技术及应用研究所、航*拓普、纬*、招**晟、汇*云通、数信**科技、北京永*鼎力、上海*连科技)
4. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实现类(concrete class)?(航*拓普、*蝶、深圳德*科技)
类似问题: > 接口A可以继承接口B吗?接口A可以实现接口B吗?(久*国际物流)
是;是;是;
5. 接口可以有自己属性吗?(华*中盛)
可以。必须是public static final的
6. 访问接口的默认方法如何使用(上海*思)
使用实现类的对象进行调用。而且实现还可以重写此默认方法。
2.7 内部类
1. 内部类有哪几种?(华油**普、来*科技)
2. 内部类的特点说一下(招通**)
类似问题: > 说一下内部类的好处(北京楚*龙) > 使用过内部类编程吗,有什么作用(软**力)
8.匿名类说一下(阿*校招、上海立*网络)
2.8 枚举类
0. 枚举可以继承吗?(顺*)
使用enum定义的,其父类就是Enum类,就不要再继承其他的类了。
1. 什么是枚举类?枚举类的对象声明的修饰符都有哪些?
枚举类:类中的对象的个数是确定的,有限个。
private final (No)
public static final (Yes)
2. 什么是元注解?说说Retention和Target元注解的作用
元注解:对现有的注解进行解释说明的注解。
Retention:指明所修饰的注解的生命周期。SOURCE CLASS RUNTIME
Target:
3. 说说你所理解的集合框架都有哪些接口,存储数据的特点是什么
4. 比较throw 和 throws 的异同
throw:生成一个异常对象,并抛出。使用在方法内部 <-> 自动抛出异常对象
throws:处理异常的方式。使用在方法声明处的末尾<->try-catch-finally
“上游排污,下游治污”
5. 谈谈你对同步代码块中同步监视器和共享数据的理解及各自要求
同步监视器:俗称锁。①任何一个类的对象都可以充当锁。② 多个线程共用同一把锁。
共享数据:多个线程共同操作的数据,即为共享数据。
需要使用同步机制将操作共享数据的代码包起来。不能包多了,也不能包少了。
2.9 包装类
1. Java基本类型与包装类的区别(凡*科技)
2.10 综合
1. 谈谈你对面向对象的理解(君*科技、航*拓普、...)
面向对象的两个要素:类、对象 ---> 面向对象编程。“万事万物皆对象”。
面向对象的三大特征
接口,与类并列的结构,作为一个补充:类可以实现多个接口。
2. 面向对象的特征有哪些方面? (北京楚*龙、深圳德*科技、直*科技、米*奇网络、航*拓普)
类似问题: > 面向对象核心是什么?(平**服)
继承、封装、多态
异常处理
1.1 异常概述
1. Java的异常体系简单介绍下(网*)
包含问题: > 4.异常的顶级接口是什么(软**力) > 异常类的继承关系,exception下都有哪些类?(上海*冉信息)
2. Java异常处理机制(*科软)
两种处理方案:try-catch-finally ;throws
3. 异常的两种类型,Error和Exception的区别(上海冠*新创、北京中**译、*度)
|---java.lang.Error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。
一般不编写针对性的代码进行处理。
|---java.lang.Exception:异常。我们可以编写针对性的代码进行处理。
4. 运行时异常与一般异常有何异同?(华*思为)
运行时异常:RuntimeException
编译可以通过。在运行时可能抛出。出现的概率高一些;一般针对于运行时异常,都不处理。
一般异常:Exception
编译不能通过。要求必须在编译之前,考虑异常的处理。不处理编译不通过。
5. 说几个你常见到的异常(华油**普)
类似问题: > 请列出Java中常见的几种异常?(百*园) > 给我一个你最常见到的runtime exception。(*蝶) |----编译时异常:(受检异常)在执行javac.exe命令时,出现的异常。 |----- ClassNotFoundException |----- FileNotFoundException |----- IOException |----运行时异常:(非受检异常)在执行java.exe命令时,出现的异常。 |---- ArrayIndexOutOfBoundsException |---- NullPointerException |---- ClassCastException |---- NumberFormatException |---- InputMismatchException |---- ArithmeticException
1.2 try-catch-finally
1. 说说final、finally、finalize的区别(北京中**译、艾*软件、拓*思、*科软)
类似问题: > 1. finally和final的区别(*科软)
finally:不论在try代码块中是否发生了异常事件,catch语句是否执行,catch语句是否有异常,catch语句中是否有return,finally块中的语句都会被执行。
2. 如果不使用try-catch,程序出现异常会如何?(上海冠*新创科技)
对于当前方法来讲,如果不使用try-catch,则在出现异常对象以后会抛出此对象。如果没有处理方案,就会终止程序的执行。
3. try ... catch捕捉的是什么异常?(北京亿*东方)
Exception。非Error
4. 如果执行finally代码块之前方法返回了结果或者jvm退出了,这时finally块中的代码还会执行吗?(恒*电子)
特别的:System.exit(0); 除此之外,都执行!
5. 在try语句中有return语句,最后写finally语句,finally语句中的code会不会执行?何时执行?如果执行是在return前还是后(拓*思、华**为)
会执行,在return前执行。
6. 捕获异常在catch块里一定会进入finally吗?catch里能return吗?catch里return还会进finally吗?在try里return是什么情况?(*蓝)
都会执行finally
1.3 throw与throws
1. throw和throws的区别?(北京亿**方、北京新*阳光)
角度1:"形",即使用的格式
throw:使用在方法内部,“throw 异常类的对象” throws:使用在方法的声明处,"throws 异常类1,异常类2,..."角度2:"角色"或作用不同。
上游排污,下游治污。 过程1:“抛” > throw 过程2:“抓” > try-catch ; throws
2. 子类重写父类抛出异常的方法,能否抛出比父类更高级别的异常类(顺*)
不能!
1.4 自定义异常
1. 如何自定义一个异常?(*软国际)
Java高级编程
一、多线程
1.画图说明线程的生命周期,以及各状态切换使用到的方法等
状态,方法
2.同步代码块中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解,以及注意点。
synchronized(同步监视器){
//操作共享数据的代码 (不能包括多了,也不能包括少了)
}
3. sleep()和wait()的区别
1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
2.不同点:1)两个方法声明的位置不同:Thread类中声明sleep(),Object.类中声明wait()
2)调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用在同步代码块或同步方法中
3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。
4. 创建多线程有哪几种方式:4种
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.线程池(响应速度提高了,提高了资源的重用率,便于管理)
2.1 线程概述
1. 什么是线程(*云网络)
进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的,进程是动态的。
进程作为操作系统调度和分配资源的最小单位。线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径。
线程作为CPU调度和执行的最小单位
2. 线程和进程有什么区别(*团、腾*、*云网络、神**岳、言*有物、直*科技)
进程:对应一个运行中的程序。
线程:运行中的进程的一条或多条执行路径。
3. 多线程使用场景(嘉*医疗)
手机app应用的图片的下载
迅雷的下载
Tomcat服务器上web应用,多个客户端发起请求,Tomcat针对多个请求开辟多个线程处理
2.2 如何实现多线程
1. 如何在Java中出实现多线程?(阿*校招、当*置业、鸿*网络、奥*医药、*科软、慧*、上海驿*软件、海*科)
类似问题: > 创建多线程用Runnable还是Thread(北京中*瑞飞) > 多线程有几种实现方法,都是什么?(锐*(上海)企业管理咨询)
方式1:继承Thread类
方式2:实现Runnable接口
方式3:实现Callable接口 (jdk5.0新增)
方式4:使用线程池(jdk5.0新增)
2. Thread类中的start()和run()有什么区别?(北京中油**、爱*信、神*泰岳、直*科技,*软国际,上海*学网络)
start():① 开启线程 ② 调用线程的run()
3. 启动一个线程是用run()还是start()?(*度)
start()
4. Java中Runnable和Callable有什么不同?(平*金服、银*数据、好*在、亿*征信、花儿**网络)
与之前的方式的对比:与Runnable方式的对比的好处 > call()可以有返回值,更灵活 > call()可以使用throws的方式处理异常,更灵活 > Callable使用了泛型参数,可以指明具体的call()的返回值类型,更灵活 有缺点吗?如果在主线程中需要获取分线程call()的返回值,则此时的主线程是阻塞状态的。
5. 什么是线程池,为什么要使用它?(上海明*物联网科技)
此方式的好处: > 提高了程序执行的效率。(因为线程已经提前创建好了) > 提高了资源的复用率。(因为执行完的线程并未销毁,而是可以继续执行其他的任务) > 可以设置相关的参数,对线程池中的线程的使用进行管理
2.3 常用方法、生命周期
1. sleep() 和 yield()区别?(神*泰岳)
sleep():一旦调用,就进入“阻塞”(或TIMED_WAITING状态)
yield():释放cpu的执行权,处在RUNNABLE的状态
2. 线程创建中的方法、属性情况?(招通**、数*互融)
看下图
3. 线程的生命周期?(中国**电子商务中心、*科软、慧*)
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
4. 线程的基本状态以及状态之间的关系?(直*科技)
类似问题: > 线程有哪些状态?如何让线程进入阻塞?(华*中*,*兴) > 线程有几个状态,就绪和阻塞有什么不同。(美*) > Java的线程都有哪几种状态(字*跳动、*东、*手)
看上图
5. stop()和suspend()方法为何不推荐使用?(上海驿*软件)
stop():一旦执行,线程就结束了,导致run()有未执行结束的代码。stop()会导致释放同步监视器,导致线程安全问题。
suspend():与resume()搭配使用,导致死锁。
6. Java 线程优先级是怎么定义的?(软*动力)
2.4 线程安全与同步机制
1. 你如何理解线程安全的?线程安全问题是如何造成的?(*软国际)
类似问题: > 线程安全说一下?(奥*医药) > 对线程安全的理解(*度校招) > 什么是线程安全?(银*数据)
2. 多线程共用一个数据变量需要注意什么?(史*夫软件)
线程安全问题
3. 多线程保证线程安全一般有几种方式?(来*科技、北京*信天*)
类似问题: > 如何解决其线程安全问题,并且说明为什么这样子去解决?(北京联合**) > 请说出你所知道的线程同步的方法。(天*伟业) > 哪些方法实现线程安全?(阿*) > 同步有几种实现方法,都是什么? (锐*企业管理咨询) > 你在实际编码过程中如何避免线程安全问题?(*软国际) > 如何让线程同步?(*手) > 多线程下有什么同步措施(阿*校招) > 同步有几种实现方法,都是什么?(海*科)
同步机制
Lock接口
4. 用什么关键字修饰同步方法?(上海驿*软件)
synchronized
5. synchronized加在静态方法和普通方法区别(来*科技)
同步监视器不同。静态:当前类本身
非静态:this
6. Java中synchronized和ReentrantLock有什么不同(三*重工)
类似问题: > 多线程安全机制中 synchronized和lock的区别(中*国际、*美、鸿*网络) > 怎么实现线程安全,各个实现方法有什么区别?(美*、字*跳动) > synchronized 和 lock 区别(阿*、*壳)
synchronized不管是同步代码块还是同步方法,都需要在结束一对{}之后,释放对同步监视器的调用。 Lock是通过两个方法控制需要被同步的代码,更灵活一些。 Lock作为接口,提供了多种实现类,适合更多更复杂的场景,效率更高。
7. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(鸿*网络)
需要看其他方法是否使用synchronized修饰,同步监视器的this是否是同一个。
只有当使用了synchronized,且this是同一个的情况下,就不能访问了。
8. 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?(阿*校招、西安*创佳*)
同步一定阻塞;阻塞不一定同步。
2.5 死锁
1. 什么是死锁,产生死锁的原因及必要条件(腾*、阿*)
1. 如何看待死锁?
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
我们编写程序时,要避免出现死锁。2. 诱发死锁的原因?
- 互斥条件
- 占用且等待
- 不可抢夺(或不可抢占)
- 循环等待以上4个条件,同时出现就会触发死锁。
3. 如何避免死锁?
针对条件1:互斥条件基本上无法被破坏。因为线程需要通过互斥解决安全问题。
针对条件2:可以考虑一次性申请所有所需的资源,这样就不存在等待的问题。
针对条件3:占用部分资源的线程在进一步申请其他资源时,如果申请不到,就主动释放掉已经占用的资源。
针对条件4:可以将资源改为线性顺序。申请资源时,先申请序号较小的,这样避免循环等待问题。
2. 如何避免死锁?(阿*、北京*蓝、*手)
见上。
2.6 线程通信
1. Java中notify()和notifyAll()有什么区别(汇*天下)
notify():一旦执行此方法,就会唤醒被wait()的线程中优先级最高的那一个线程。(如果被wait()的多个线程的优先级相同,则
随机唤醒一个)。被唤醒的线程从当初被wait的位置继续执行。
notifyAll():一旦执行此方法,就会唤醒所有被wait的线程。
2. 为什么wait()和notify()方法要在同步块中调用(北京*智)
因为调用者必须是同步监视器。
3. 多线程:生产者,消费者代码(同步、wait、notifly编程)(猫*娱乐)
类似问题: > 如何写代码来解决生产者消费者问题(上海明*物联网) > 多线程中生产者和消费者如何保证同步(*为) > 消费者生产者,写写伪代码(字*)
等待唤醒机制可以解决经典的“生产者与消费者”的问题。生产者与消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个(多个)
共享固定大小缓冲区的线程
——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
4. wait()和sleep()有什么区别?调用这两个函数后,线程状态分别作何改变?(字*、*东)
类似问题: > 线程中sleep()和wait()有什么区别?(外派*度) > Java线程阻塞调用 wait 函数和 sleep 区别和联系(阿*) > wait和sleep的区别,他们两个谁会释放锁(软*动力、*创)
相同点:一旦执行,当前线程都会进入阻塞状态 不同点: > 声明的位置:wait():声明在Object类中 sleep():声明在Thread类中,静态的 > 使用的场景不同:wait():只能使用在同步代码块或同步方法中 sleep():可以在任何需要使用的场景 > 使用在同步代码块或同步方法中:wait():一旦执行,会释放同步监视器 sleep():一旦执行,不会释放同步监视器 > 结束阻塞的方式:wait(): 到达指定时间自动结束阻塞 或 通过被notify唤醒,结束阻塞 sleep(): 到达指定时间自动结束阻塞
2.7 单例模式(线程安全)
1. 手写一个单例模式(Singleton),还要安全的(*通快递、君*科技)
饿汉式;安全的懒汉式;内部类;
2. 手写一个懒汉式的单例模式&解决其线程安全问题,并且说明为什么这样子去解决(5*)
类似问题: > 手写一个懒汉式的单例模式(北京联合**)
package com.tyl.java1;
/**
* @author tyl 邮箱:tyl202061@gmail.com
* @Package:com.tyl.java1
* @Project:workidea
* @Filename:BankTest
* @create 2023-05-12 17:50
*/
public class BankTest {
}
class Bank {
private Bank() {}
private static Bank instance = null;
// public static synchronized Bank getInstance() {
public static Bank getInstance() {
//方式一:效率稍差
// synchronized (Bank.class) {
// if(instance == null ){
// instance = new Bank();
// }
// return instance;
// }
// 方式二: 效率更高
if (instance == null) {
synchronized (Bank.class) {
if (instance == null) {
instance = new Bank();
}
}
}
return instance;
}
}
二、常用类与基础API
1.将字符串”2017-08-16”转换为对应的java.sql.Date类的对象。
(使用JDK8之前或JDK8中的API皆可)
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
解析:java.util.Date date = sdf.parse(“2017-08-16”);
DateTimeFormatter dtf= DateTimeFormatter.ofPattern(“yyyy-MM-dd”);
new + 构造器
单例、Calendar.getInstance()
2.解释何为编码?解码? 何为日期时间的格式化?解析?
编码:字符串 à 字节
解码:字节 à字符串
格式化:日期 à字符串
解析:字符串 à日期
3. 自定义Person类如下,如何实现自然排序(按姓名从小到大排序),代码说明
class Person implements Comparable{
private String name;
private int age;
public int compareTo(Object obj){
//… this.name.compareTo(s.name);
}
}
4. 提供定制排序涉及到的接口的实现类对象,并按Person类的年龄从大到小排序
Comparator com = new Comparator(){
public int compare(Object obj1,Object obj2){
if(){
}
}
};
5. JDK8之前和JDK8中日期、时间相关的类分别有哪些?
java.util.Date 和 java.sql.Date Instant
SimpleDateFormat DateTimeFormatter
Calendar LocalDate、LocalTime、LocalDateTime
2.1 String
1. 以下两种方式创建的String对象有什么不同?(*团)
2. String s = new String("xyz");创建了几个String Object? (新*陆)
两个
3. String a="abc" String b="a"+"bc" 问a==b?(网*邮箱)
是!
4. String 中 “+” 怎样实现?(阿*)
常量 + 常量 :略
变量 + 常量 、变量+变量:创建一个StringBuilder的实例,通过append()添加字符串,最后调用toString()返回一个字符串。(toString()内部new 一个String的实例)
5. Java中String是不是final的?(凡*科技)
类似问题: > String被哪些类继承?(网*邮箱) > 是否可以继承String类?(湖南*利软件) > String 是否可以继承?(阿*)
是
6. String为啥不可变,在内存中的具体形态?(阿*)
规定不可变。
String:提供字符串常量池。
7. String 可以在 switch中使用吗?(上海*睿)
可以。从jdk7开始可以使用
8. String中有哪些方法?列举几个(闪*购)
parseInt(String s)
valueOf(int n)
toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
getBytes() :使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
9. subString()到底做了什么?(银*数据)
String str = "hello";
String subStr = str.subString(1,3); //底层是new的方式返回一个subStr,实体内容是"el"
2.2 String、StringBuffer、StringBuilder
1. Java中操作字符串有哪些类?他们之间有什么区别。(南*电网)
类似问题: > String 和 StringBuffer区别?(亿*国际、天*隆、*团) > StringBuilder和StrignBuffer的区别?(平*金服) > StringBuilder和StringBuffer的区别以及实现?(*为)
> String:不可变的字符序列;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
> StringBuffer:可变的字符序列;JDK1.0声明,线程安全的,效率低;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
> StringBuilder:可变的字符序列;JDK5.0声明,线程不安全的,效率高;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
2. String的线程安全问题(闪*购)
线程不安全的
3. StringBuilder和StringBuffer的线程安全问题(润*软件)
> StringBuffer:可变的字符序列;JDK1.0声明,线程安全的,效率低;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
> StringBuilder:可变的字符序列;JDK5.0声明,线程不安全的,效率高;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
2.3 Comparator与Comparable
1. 简单说说 Comparable 和 Comparator 的区别和场景?(软**力)
2. Comparable 接口和 Comparator 接口实现比较(阿*)
自然排序:
定制排序:
三、Java集合
1.集合Collection中存储的如果是自定义类的对象,需要自定义类重写哪个方法?为什么?
equals()方法。 contains() /remove()/retainsAll() ….
List:equals()方法
Set:(HashSet、LinkedHashSet为例):equals()、hashCode()
(TreeSet为例):Comparable:compareTo(Object obj)
Comparator:compare(Object o1,Object o2)
2.ArrayList,LinkedList,Vector三者的相同点与不同点?【面试题】
3.List 接口的常用方法有哪些?(增、删、改、查、插、长度、遍历)
4.如何使用Iterator和增强for循环遍历List。举例说明
5.Set存储数据的特点是什么?常见的实现类有什么?说明一下彼此的特点。
HashSet LinkedHashSet TreeSet
HashMap LinkedHashMap TreeMap
2.1 集合概述
1. List,Set,Map是否继承自collection接口?(北京中*译咨询、思*贸易)
Map不是。
2. 说说List,Set,Map三者的区别(民*银行)
类似问题: > Map与Set、List的区别(纬*)
3. 写出list、map、set接口的实现类,并说出其特点(华**为)
类似问题: > 集合有哪些, 各自有哪些特点, 各自的API有哪些?(湖**利软件) > List Map Set三个接口在存储元素时个有什么特点(*软)
4. 常见集合类的区别和适用场景(饿**)
5. 集合的父类是谁?哪些安全的?(北京中**信)
不安全:ArrayList、HashMap、HashSet ;
安全:Vector、Hashtable
6. 集合说一下哪些是线程不安全的(*科软)
不安全:ArrayList、HashMap、HashSet ;
7. 遍历集合的方式有哪些?(恒*电子)
迭代器Iterator用来遍历Collection,不能用来遍历Map!
增强for
一般的for:可以用来遍历List
2.2 List接口
1. List下面有哪些实现(软**力)
2. ArrayList与LinkedList区别?(O**O、滴*、汇*天下、拓*软件、博纳**软件、上海*进天下,北京永生**信息、*联、在*途游)
类似问题: > ArrayList跟LinkedList的区别详细说出?(阿*校招、*东)
见上
补充上第14章中的源码(底层的数据结构)
3. ArrayList与Vector区别呢?为什么要用ArrayList取代Vector呢?(湖**利软件)
Vector效率低。
|---- ArrayList:List的主要实现类;线程不安全的、效率高;底层使用Object[]数组存储
在添加数据、查找数据时,效率较高;在插入、删除数据时,效率较低
|---- Vector:List的古老实现类;线程安全的、效率低;底层使用Object[]数组存储
4. Java.util.ArrayList常用的方法有哪些?(华**为)
小结:
增
add(Object obj)
addAll(Collection coll)
删
remove(Object obj)
remove(int index)
改
set(int index, Object ele)
查
get(int index)
插
add(int index, Object ele)
addAll(int index, Collection eles)
长度
size()
遍历
iterator() :使用迭代器进行遍历
增强for循环
一般的for循环
5. Arraylist 是有序还是无序?为什么?(蜜*信息)
有序;底层使用数组:Object[]
2.3 Set接口
1. Set集合有哪些实现类,分别有什么特点?(拓*软件)
类似问题: > Set的实现类有哪些?(博*科技)
2. List集合和Set集合的区别?(亚*科技、*海*翼科技,*华电*系统,达*贷)
List:存储有序的、可重复的数据 ("动态"数组)
Set:存储无序的、不可重复的数据(高中学习的集合)
3. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?(鸿*网络)
类似问题: > 1.HashSet如何检查重复(创*科技) > 3.Set使用哪个区分不能重复的元素的?(北京创**荣信息)
hashCode() 、 equals()
4. TreeSet两种排序方式在使用的时候怎么起作用?(拓*软件)
在添加新的元素时,需要调用compareTo() 或 compare()
5. TreeSet的数据结构(*米)
红黑树
2.4 Map接口
1. 说一下Java的集合Map有哪些Map?(奥*医药)
2. final怎么用,修饰Map可以继续添加数据吗?(*深蓝)
final HashMap map = new HashMap();
map.put("AA",123);
可以!
3. Set和Map的比较(亚*科技)
HashSet底层就是HashMap
LinkedHashSet底层就是LinkedHashMap
TreeSet底层就是TreeMap
4. HashMap说一下,线程安全吗?(*米)
类似问题: > HashMap为什么线程不安全?(微*银行) > HashMap是线程安全的吗?为什么不安全?(*团、*东、顺*)
不安全
5. HashMap和Hashbable的区别?(银*数据、阿**巴芝麻信用、*众银行、爱*信、杭州*智公司)
类似问题: > HashMap 和 HashTable 有什么区别,以及如何使用,以及他的一些方法?(阿*校招、*东、*度校招、顺*)
|---- HashMap:主要实现类;线程不安全的,效率高;可以添加null的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)
|---- Hashtable:古老实现类;线程安全的,效率低;不可以添加null的key或value值;底层使用数组+单向链表结构存储(jdk8)
6. Hashtable是怎么实现的,为什么线程安全?(迪*创新)
数组+单向链表;底层方法使用synchronized修饰
7. HashMap和LinkedHashMap的区别(北京*晨阳光)
|---- HashMap:主要实现类;线程不安全的,效率高;可以添加null的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)
|---- LinkedHashMap:是HashMap的子类;在HashMap使用的数据结构的基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素时,就可以按照添加的顺序显示。开发中,对于频繁的遍历操作,建议使用此类。
8. HashMap 和 TreeMap 的区别(*度,太极**、*线途游、阿*校招)
底层的数据结构截然不同。
9. HashMap里面实际装的是什么?(惠*)
JDK7:HashMap内部声明了Entry,实现了Map中的Entry接口。(key,value作为Entry的两个属性出现)
JDK8:HashMap内部声明了Node,实现了Map中的Entry接口。(key,value作为Node的两个属性出现)
10. HashMap的key存储在哪里?和value存储在一起吗?那么value存储在哪里?说具体点?(湖**利软件、天*伟业)
数组+链表+红黑树。 key、value作为Node的属性出现
11. 自定义类型可以作为Key么?(阿*)
可以! 要重写hashCode() 和equals()
Collections
1. 集合类的工具类是谁?用过工具类哪些方法?(顺*)
Collections。
2. Collection 和 Collections的区别?(平*金服、*软)
区分Collection 和 Collections
Collection:集合框架中的用于存储一个一个元素的接口,又分为List和Set等子接口。
Collections:用于操作集合框架的一个工具类。此时的集合框架包括:Set、List、Map
3. ArrayList 如何实现排序(阿*)
Collections.sort(list) 或 Collections.sort(list,comparator)
4. HashMap是否线程安全,怎样解决HashMap的线程不安全(中*卫星)
类似问题: > 怎么实现HashMap线程安全?(*团、*东、顺*)
不安全,使用synchronized修饰即可
3.1 数据结构相关
1. 链表和数组有什么区别?(腾*)
第14章课件里:《
【拓展】尚硅谷_宋红康_数据结构概述-Java版.xmind
》
2. 栈是如何运行的?(西*信息技术)
先进后出。属于ADT(abstract data type),可以使用数组、链表实现栈结构
3.2 List集合源码相关
1. ArrayList的默认大小是多少,以及扩容机制(顺*、凡*科技)
类似问题: > 说说ArrayList的扩容机制吧(国*电网) > 讲一下ArrayList的扩容机制(*实在) > ArrayList的扩容机制,为什么是10,为什么是1.5倍(*软国际)
10, 1.5倍
2. ArrayList的底层是怎么实现的?(腾*)
类似问题: 集合类的ArrayList底层(安全不安全,扩容,初始大小,添加删除查询是怎么操作的,底层是什么组成的) (湖**利软件、汇*云通、猎*、苏州***动、上海*进天下、北京博*软件、*科软、大连*点科技、中*亿达、德*物流、天*伟业、猫*娱乐)
ArrayList源码解析:
2.1 jdk7版本:(以jdk1.7.0_07为例)
//如下代码的执行:底层会初始化数组,数组的长度为10。Object[] elementData = new Object[10];
ArrayList<String> list = new ArrayList<>();list.add("AA"); //elementData[0] = "AA";
list.add("BB");//elementData[1] = "BB";
...
当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组
中的元素复制到新的数组中。
2.2 jdk8版本:(以jdk1.8.0_271为例)
//如下代码的执行:底层会初始化数组,即:Object[] elementData = new Object[]{};
ArrayList<String> list = new ArrayList<>();list.add("AA"); //首次添加元素时,会初始化数组elementData = new Object[10];elementData[0] = "AA";
list.add("BB");//elementData[1] = "BB";
...
当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组
中的元素复制到新的数组中。小结:
jdk1.7.0_07版本中:ArrayList类似于饿汉式
jdk1.8.0_271版本中:ArrayList类似于懒汉式
建议:ArrayList(int capacity){}
3. 在ArrayList中remove后面几个元素该怎么做?(惠*、中*亿达)
前移。
4. ArrayList1.7和1.8的区别(拓*思)
类似于饿汉式(1.7)、懒汉式(1.8)
5. 数组和 ArrayList 的区别(阿*、*科软)
ArrayList看做是对数组的常见操作的封装。
6. 什么是线程安全的List?(平*金服)
Vector:线程安全的。
ArrayList:线程不安全。----> 使用同步机制处理。
HashMap:线程不安全。 ----> 使用同步机制处理。
-----> JUC:ConcurrentHashMap
3.3 HashMap集合源码相关
1. 说说HahMap底层实现(新*股份、顺*、猫*娱乐)
类似问题: > HashMap的实现讲一下?(腾*,上海**网络) > 说说HashMap的底层执行原理?(滴*,纬*软件,上海*想,*昂,*蝶**云,宇*科技,*东数科,猎*网) > 详细说一下 HashMap 的 put 过程(*度) > Java中的HashMap的工作原理是什么?(北京中**译咨询) > 集合类的HashMap底层(安全不安全,扩容,初始大小,添加删除查询是怎么操作的,底层是什么组成的)(湖**利软件) > HashMap 的存储过程(爱*信、杭州*智) > Hashmap底层实现及构造(汇**通、猎*、苏州博*讯动、上海*进天下、北京博*软件、*科软、大连*点科技、中*亿达、德*物流、天*伟业、猫*娱乐) > HashMap的实现原理(腾*、阿*) > HaspMap底层讲一讲(*米) > 说一下HashMap的实现,扩容机制?(*节) > 讲一下 HashMap 中 put 方法过程?(阿*)
HashMap源码解析
2.1 jdk7中创建对象和添加数据过程(以JDK1.7.0_07为例说明)://创建对象的过程中,底层会初始化数组Entry[] table = new Entry[16];
HashMap<String,Integer> map = new HashMap<>();
...
map.put("AA",78); //"AA"和78封装到一个Entry对象中,考虑将此对象添加到table数组中。
...添加/修改的过程:
将(key1,value1)添加到当前的map中:
首先,需要调用key1所在类的hashCode()方法,计算key1对应的哈希值1,此哈希值1经过某种算法(hash())之后,得到哈希值2。
哈希值2再经过某种算法(indexFor())之后,就确定了(key1,value1)在数组table中的索引位置i。
1.1 如果此索引位置i的数组上没有元素,则(key1,value1)添加成功。 ---->情况1
1.2 如果此索引位置i的数组上有元素(key2,value2),则需要继续比较key1和key2的哈希值2 --->哈希冲突
2.1 如果key1的哈希值2与key2的哈希值2不相同,则(key1,value1)添加成功。 ---->情况2
2.2 如果key1的哈希值2与key2的哈希值2相同,则需要继续比较key1和key2的equals()。要调用key1所在类的equals(),将key2作为参数传递进去。
3.1 调用equals(),返回false: 则(key1,value1)添加成功。 ---->情况3
3.2 调用equals(),返回true: 则认为key1和key2是相同的。默认情况下,value1替换原有的value2。说明:情况1:将(key1,value1)存放到数组的索引i的位置
情况2,情况3:(key1,value1)元素与现有的(key2,value2)构成单向链表结构,(key1,value1)指向(key2,value2)随着不断的添加元素,在满足如下的条件的情况下,会考虑扩容:
(size >= threshold) && (null != table[i])
当元素的个数达到临界值(-> 数组的长度 * 加载因子)时,就考虑扩容。默认的临界值 = 16 * 0.75 --> 12.
默认扩容为原来的2倍。
2.2 jdk8与jdk7的不同之处(以jdk1.8.0_271为例):
① 在jdk8中,当我们创建了HashMap实例以后,底层并没有初始化table数组。当首次添加(key,value)时,进行判断,
如果发现table尚未初始化,则对数组进行初始化。
② 在jdk8中,HashMap底层定义了Node内部类,替换jdk7中的Entry内部类。意味着,我们创建的数组是Node[]
③ 在jdk8中,如果当前的(key,value)经过一系列判断之后,可以添加到当前的数组角标i中。如果此时角标i位置上有
元素。在jdk7中是将新的(key,value)指向已有的旧的元素(头插法),而在jdk8中是旧的元素指向新的
(key,value)元素(尾插法)。 "七上八下"
④ jdk7:数组+单向链表
jk8:数组+单向链表 + 红黑树
什么时候会使用单向链表变为红黑树:如果数组索引i位置上的元素的个数达到8,并且数组的长度达到64时,我们就将此索引i位置上
的多个元素改为使用红黑树的结构进行存储。(为什么修改呢?红黑树进行put()/get()/remove()
操作的时间复杂度为O(logn),比单向链表的时间复杂度O(n)的好。性能更高。
什么时候会使用红黑树变为单向链表:当使用红黑树的索引i位置上的元素的个数低于6的时候,就会将红黑树结构退化为单向链表。
2.3 属性/字段:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认的初始容量 16
static final int MAXIMUM_CAPACITY = 1 << 30; //最大容量 1 << 30
static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认加载因子
static final int TREEIFY_THRESHOLD = 8; //默认树化阈值8,当链表的长度达到这个值后,要考虑树化
static final int UNTREEIFY_THRESHOLD = 6;//默认反树化阈值6,当树中结点的个数达到此阈值后,要考虑变为链表//当单个的链表的结点个数达到8,并且table的长度达到64,才会树化。
//当单个的链表的结点个数达到8,但是table的长度未达到64,会先扩容
static final int MIN_TREEIFY_CAPACITY = 64; //最小树化容量64transient Node<K,V>[] table; //数组
transient int size; //记录有效映射关系的对数,也是Entry对象的个数
int threshold; //阈值,当size达到阈值时,考虑扩容
final float loadFactor; //加载因子,影响扩容的频率
建议以JDK8为主说明。
2. HashMap初始值16,临界值12是怎么算的(软**力)
16 从底层源码的构造器中看到的。
12:threshold,使用数组的长度*加载因子(loadFactor)
3. HashMap长度为什么是2的幂次方(国*时代)
为了方便计算要添加的元素的底层的索引i。
4. HashMap怎么计算哈希值和索引?扩容机制?怎么解决hash冲突?(*软国际、中软*腾)
类似问题: > HashMap key的哈希冲突了怎么做(新*股份) > HashMap的默认大小是多少,以及扩容机制(顺*、凡*科技) > 讲一下HashMap的扩容机制?(好实*)
5. HashMap底层是数组+链表,有数组很快了,为什么加链表?(润*软件)
因为产生了哈希冲突。解决方案,使用链表的方式。保证要添加的元素仍然在索引i的位置上。
6. HashMap为什么长度达到一定的长度要转化为红黑树(*度)
类似问题: > HashMap为什么用红黑树(*软国际)
红黑树的常用操作的时间复杂度O(logn),比单向链表的O(n)效率高。
7. HashMap什么时候扩充为红黑树,什么时候又返回到链表?(汉*)
类似问题: > HashMap什么时候转换为红黑树(杭州*智公司) > 当HashMap中相同hashcode值的数据超过多少时会转变成红黑树?(百*云创) > 什么时候是数据+链表,什么时候是红黑树(*软国际)
索引i的位置的链表长度超过8且数组长度达到64,需要索引i位置要变成红黑树。
当索引i的位置元素的个数低于6时,要红黑树结构转为单向链表。为什么?节省空间。
8. 在 JDK1.8中,HashMap的数据结构与1.7相比有什么变化,这些变化的好处在哪里?(海*科)
① 在jdk8中,当我们创建了HashMap实例以后,底层并没有初始化table数组。当首次添加(key,value)时,进行判断, 如果发现table尚未初始化,则对数组进行初始化。 ② 在jdk8中,HashMap底层定义了Node内部类,替换jdk7中的Entry内部类。意味着,我们创建的数组是Node[] ③ 在jdk8中,如果当前的(key,value)经过一系列判断之后,可以添加到当前的数组角标i中。如果此时角标i位置上有 元素。在jdk7中是将新的(key,value)指向已有的旧的元素(头插法),而在jdk8中是旧的元素指向新的 (key,value)元素(尾插法)。 "七上八下" ④ jdk7:数组+单向链表 jk8:数组+单向链表 + 红黑树 什么时候会使用单向链表变为红黑树:如果数组索引i位置上的元素的个数达到8,并且数组的长度达到64时,我们就将此索引i位置上 的多个元素改为使用红黑树的结构进行存储。(为什么修改呢?红黑树进行put()/get()/remove() 操作的时间复杂度为O(logn),比单向链表的时间复杂度O(n)的好。性能更高。 什么时候会使用红黑树变为单向链表:当使用红黑树的索引i位置上的元素的个数低于6的时候,就会将红黑树结构退化为单向链表。
9. HashMap的get()方法的原理?(顺*)
参考put()
3.4 hashCode和equals
1. hashcode和equals区别?(海*供应链管理)
略
2. hashCode() 与 equals() 生成算法、方法怎么重写?(阿*校招)
进行equals()判断使用的属性,通常也都会参与到hashCode()的计算中。
尽量保证hashCode()的一致性。(使用IDEA自动生成,hashCode()自动使用相关的算法)
3. 说一下equals和==的区别,然后问equals相等hash值一定相等吗?hash值相等equals一定相等吗?(南*电网、上海*智网络)
equals相等hash值一定相等吗? 是
hash值相等equals一定相等吗?不一定
3.5 Set集合源码相关
1. HashSet存放数据的方式?(拓*软件)
底层使用HashMap。说一下HashMap
2. Set是如何实现元素的唯一性?(湖**利软件)
不可重复
3. 用哪两种方式来实现集合的排序(凡*科技)
类似问题: > 集合怎么排序?(北京中**信科技)
自然排序、定制排序。
五、泛型
1.如何遍历Map的key集,value集, key-value集,使用上泛型
@Test
public void test5(){
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("aa", 123);
map.put("dd", 1234);
map.put("bb", 56);
map.put("cc", 67);
//遍历所有的key集:keySet()
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("****************************");
//遍历所有value.集:values()
Collection<Integer> values = map.values();
for(Object obj : values){
System.out.println(obj);
}
System.out.println("****************************");
// 遍历所有的key-value
// 方式一:entrySet()
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator1 = entrySet.iterator();
while (iterator1.hasNext()){
// Object obj = iterator1.next();
// //entrySet集合中的元素都是entry
// Map.Entry entry = (Map.Entry) obj;
Map.Entry<String, Integer> entry = iterator1.next();
System.out.println(entry.getKey() + "----------->" + entry.getValue());
}
System.out.println("****************************");
//方式二:
Set<String> set1 = map.keySet();
Iterator<String> iterator2 = set1.iterator();
while (iterator2.hasNext()){
Object key = iterator2.next();
Object value = map.get(key);
System.out.println(key + "======" + value);
}
}
2. 写出使用 Iterator 和 增强for 循环遍历List<String>的代码,使用上泛型
同上
3. 提供一个方法,用于遍历获取HashMap<String,String>中的所有value,并存放在List中返回。考虑上集合中泛型的使用。
public List<String> getValueList(HashMap<String,String> map){
ArrayList<String> valueList = new ArrayList<>():
Collection<String> values = map.values();
for(String value : values){
valueList.add(value);
}
return valueList;
}
4. 创建一个与a.txt文件同目录下的另外一个文件b.txt
File file1 = new File("d:\\a\\a.txt");
File file2 = new File(file1.getParent(),"b.txt");
5. Map接口中的常用方法有哪些
总结:常用方法:
添加:put(Object key,object value)
删除:remove(Object key)
修改:put(Object key,object value)查询:get(Object key)
长度:size()
遍历:keySet()/values()/entrySet()
6. Java 的泛型是什么?有什么好处和优点?JDK 不同版本的泛型有什么区别?(软*动力)
泛型,是程序中出现的不确定的类型。
以集合来举例:把一个集合中的内容限制为一个特定的数据类型,这就是generic背后的核心思想。
jdk7.0新特性:
ArrayList<String> list = new ArrayList<>(); //类型推断后续版本的新特性:
Comparator<Employee> comparator = new Comparator<>(){} //类型推断
7. 说说你对泛型的了解(*软国际)
泛型,是程序中出现的不确定的类型。
六、IO流
1.说明流的三种分类方式
流向:输入流、输出流
数据单位:字节流、字符流
流的角色:节点流、处理流
2.写出4个IO流中的抽象基类,4个文件流,4个缓冲流
InputStreamReader:父类Reader
异常: XxxException XxxError
RandomAccessFile
3.字节流与字符流的区别与使用情境
字节流:read(byte[] buffer) / read() 非文本文件
字符流:read(char[] cbuf) / read() 文本文件
4.使用缓冲流实现a.jpg文件复制为b.jpg文件的操作
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(“a.jpg”)));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(“b.jpg”)));
byte[] buffer = new byte[1024];
int len;
while((len = bis.read(buffer))!= -1){
bos.write(buffer,0,len);
}
bos.close();
bis.close();
//此时的异常应该使用try-catch-finally处理。
5.转换流是哪两个类,分别的作用是什么?请分别创建两个类的对象。
InputStreamReader: 将输入的字节流转换为输入的字符流。 解码
OutputStreamWriter:将输出的字符流转换为输出的字节流。编码
InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”),”utf-8”);
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“b.txt”),”gbk”);
2.1 IO流概述
1. 谈谈Java IO里面的常用类,字节流,字符流(银*数据)
按操作数据单位的不同分为:字节流(8bit)和字符流(16bit)。
字节流 :以字节为单位,读写数据的流。
以InputStream、OutputStream结尾
字符流 :以字符为单位,读写数据的流。
以Reader、Writer结尾
2. Java 中有几种类型的流?JDK为每种类型的流提供一些抽象类以供继承,请说出他们分别是哪些类?(上海*厦*联网、极*科技)
InputStream \ OutputStream \ Reader \ Writer
3. 流一般需不需要关闭?如果关闭的话用什么方法?处理流是怎么关闭的?(银*数据)
需要。close()
处理流在关闭过程中,也会关闭内部的流。
4. OutputStream里面的write()是什么意思?(君*科技)
数据写出的意思。
2.2 缓冲流
1. BufferedReader属于哪种流?他主要是用来做什么的?(国*电网)
输入流 字符流 处理流——缓冲流
实现更高效的读写数据的操作
2. 什么是缓冲区?有什么作用?(北京中油**)
内部提供了一个数组,将读取或要写出的数据,现在此数组中缓存。达到一定程度时,集中性的写出。
作用:减少与磁盘的交互,进而提升读写效率。
2.3 转换流
1. 字节流和字符流是什么?怎么转换?(北京蓝*、*海*供应链管理)
2.4 序列化
1. 什么是Java序列化,如何实现(君*科技、上海*厦物联网)
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,
或通过网络将这种二进制流传输到另一个网络节点。//当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
2. Java有些类中为什么需要实现Serializable接口?(阿*校招)
便于此类的对象实现序列化操作。
七、网络编程
1.一个IP对应着哪个类的一个对象?InetAddress
实例化这个类的两种方式是?
InetAddress.getByName(String host);
InetAddress.getLocalHost();//获取本地ip
两个常用的方法是?
getHostName();
getHostAddress();
2.传输层的TCP协议和UDP协议的主要区别是?
TCP: 可靠的数据传输(三次握手);进行大数据量的传输;效率低
UDP: 不可靠;以数据报形式发送,数据报限定为64k;效率高
3.什么是URL,你能写一个URL吗?
URL:统一资源定位符
URL url = new URL(“http://192.168.14.100:8080/examples/hello.txt?username=Tom”);
4. 谈谈你对对象序列化机制的理解
序列化过程:将内存中的jαvα对象保存到磁盘中或通过网络传输出去
反序列化过程:将磁盘文件中的对象还原为内存中的一个java对象
5. 对象要想实现序列化,需要满足哪几个条件
1. 实现接口:Serializable 标识接口
2. 对象所在的类提供常量:序列版本号
3. 要求对象的属性也必须是可序列化的。(基本数据类型、String:本身就已经是可序列化的。
6. 简单说说TCP协议的三次握手与四次挥手机制 (*科软)
八、反射
1. 写出获取Class实例的三种常见方式
Class clazz1 = String.class;
Class clazz2 = person.getClass(); //sout(person); //xxx.yyy.zzz.Person@...
Class clazz3 = Class.forName(String classPath); // 体现反射的动态性
2.谈谈你对Class类的理解
Class实例对应着加载到内存中的一个运行时类。
3.创建Class对应运行时类的对象的通用方法,代码实现。以及这样操作,需要对应的运行时类构造器方面满足的要求。
Object obj = clazz.newInstance(); // 创建了对应的运行时类的对象
要求:
1.必须有空参的构造器
2.权限修饰符的权限要够。通常设置为public
4.在工程或module的src下有名为”jdbc.properties”的配置文件,文件内容为:name=Tom。如何在程序中通过代码获取Tom这个变量值。代码实现
/*
Properties: 用来读取配置文件。
*/
@Test
public void test2() throws IOException {
Properties pros = new Properties();
// 此时的文件默认在当前的nodule下
// 读取配置文件的方式一
// FileInputStream fis = new FileInputStream("jdbc1.properties");
FileInputStream fis = new FileInputStream("src\\jdbc1.properties");
pros.load(fis);
// 读取配置文件的方式二:使用CLassLoader
// 配置文件默认识别为:当前nodule的src下
// ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
// InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
// pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
System.out.println("user =" + user + ", password = " + password);
}
5. 如何调用方法show()
类声明如下:
package com.atguigu.java;
class User{
public void show(){
System.out.println(“我是一个中国人!”);
} }User user = (User)clazz.newInstance();
Method show = clazz.getDeclaredMethod("show");
show.setAccessiable(true);
show.invoke(user);
2.1 反射概述
1. 对反射了解吗?反射有什么好处?为什么需要反射?(微*银行)
类似问题: > Java反射的作用是什么?(三*重工、上海*和网络) > Java反射机制的作用有什么?(上海明*物联网) > 反射的具体用途?(阿***芝*信用项目组)
~ Java给我们提供了一套API,使用这套API我们可以在运行时动态的获取指定对象所属的类,创建运行时类的对象,调用指定的结构(属性、方法)等。
反射的优点和缺点
优点:
提高了Java程序的灵活性和扩展性,
降低了耦合性
,提高自适应
能力允许程序创建和控制任何类的对象,无需提前
硬编码
目标类缺点:
反射的
性能较低
。
反射机制主要应用在对灵活性和扩展性要求很高的系统框架上
反射会
模糊
程序内部逻辑,可读性较差
。反射,平时开发中,我们使用并不多。主要是在框架的底层使用。
2. 反射的使用场合和作用、及其优缺点(*软国际)
类似问题: > 反射机制的优缺点(君*科技) > Java反射你怎么用的?(吉*航空)
反射,平时开发中,我们使用并不多。主要是在框架的底层使用。
3. 实现Java反射的类有什么?(君*科技)
类似问题: > Java反射 API 有几类?(北京*蓝)
API:
java.lang.Class
:代表一个类java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器
… …
4. 反射是怎么实现的?(上海立*网络)
从Class说起。
2.2 Class的理解
1. Class类的作用?生成Class对象的方法有哪些?(顺*)
反射的源头。 主要有三种。
获取Class的实例的几种方式(前三种)
类.class
对象.getClass()
(使用较多)Class调用静态方法forName(String className)
(了解)使用ClassLoader的方法loadClass(String className)
2. Class.forName("全路径") 会调用哪些方法 ? 会调用构造方法吗?加载的类会放在哪?(上*银行外包)
Class.forName() 会执行执行类构造器<clinit>()方法。
不会调用构造方法
加载的类放在方法区。
2.3 类的加载
1. 类加载流程(汇**通、同*顺、凡*科技)
过程1:类的装载(loading)
将类的class文件读入内存,并为之创建一个java.lang.Class对象。此过程由类加载器完成过程2:链接(linking)
> 验证(Verify):确保加载的类信息符合JVM规范,例如:以cafebabe开头,没有安全方面的问题。
> 准备(Prepare):正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。
> 解析(Resolve):虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。过程3:初始化(initialization)
执行类构造器<clinit>()方法的过程。
类构造器<clinit>()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。
2.4 创建对象
1. 说一下创建对象的几种方法?(华油***集团、*科软、凡*科技)
类似问题: > 除了使用new创建对象之外,还可以用什么方法创建对象?(*云网络)
2. 如何找到对象实际类的?(*度)
对象.getClass();
Object obj = new Date(); obj.getClass(); // 获取到的是Date。
3. Java反射创建对象效率高还是通过new创建对象的效率高?(三*重工)
new 的方式。
2.5 调用属性、方法
1. 如何利用反射机制来访问一个类的方法?(神州**软件)
调用指定的方法(步骤) 步骤1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法 步骤2. setAccessible(true):确保此方法是可访问的 步骤3.通过Method实例调用invoke(Object obj,Object ... objs),即为对Method对应的方法的调用。 invoke()的返回值即为Method对应的方法的返回值 特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null
2. 说一下Java反射获取私有属性,如何改变值?(阿****麻信用项目组)
调用指定的属性(步骤) 步骤1.通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性 步骤2. setAccessible(true):确保此属性是可以访问的 步骤3. 通过Filed类的实例调用get(Object obj) (获取的操作) 或 set(Object obj,Object value) (设置的操作)进行操作。针对于核心源码的api,内部的私有的结构在jdk17中就不可以通过反射调用了。
JDK8-17新特性
1.1 JDK8新特性
1. 谈谈java8新特性(京*旗下、时代*宇,信必*、招*信诺,中*外包,金*软件、阿**巴)
类似问题 > JDK1.8相较于JDK1.7有什么不一样?(惠*) > JDK1.8的新特性有哪些?Stream API + Lambda表达式,还有吗?(久*国际物流)
lambda表达式、Stream API
jdk7的对比:元空间、HashMap、新的日期时间API、接口变化等。
2. JDK1.8在数据结构上发生了哪些变化 ?(银*数据)
使用元空间替代永久代。 (方法区:jvm规范中提到的结构。
HotSpot来讲,jdk7:方法区的落地体现:永久代。 jdk8:方法区的落地体现:元空间。
HashMap底层结构 char[] - > byte[]
3. 你说的了解 Java的新特性 ,你说说JDK8改进的地方?(银*科技)
lambda表达式、Stream API
4. JDK1.8用的是哪个垃圾回收器?(O**O)
jdk8 : Parallel GC --> jdk9:默认使用G1GC --> ZGC (低延迟)
1.2 Lambda表达式
1. Lambda表达式有了解吗,说说如何使用的(O**O)
类似问题: > Lambda的理解(国*)
在给函数式接口提供实例时,都可以考虑使用lambda表达式。
2. 什么是函数式接口?有几种函数式接口(阿**巴)
java.util.function包下定义了丰富的好函数式接口。有4类基础的函数式接口:
消费型接口:Consumer<T> void accept(T t)
供给型接口:Supplier<T> T get()
函数型接口:Function<T,R> R apply(T t)
判断型接口:Predicate<T> boolean test(T t)
1.3 Stream API
1. 创建Stream的方式(阿**巴)
三种。
方式一:通过集合
方式二:通过数组
方式三:通过Stream的of()
2. 你讲讲stream表达式是咋用的,干啥的?(中*国际,上海**网络)
> Stream API 关注的是多个数据的计算(排序、查找、过滤、映射、遍历等),面向CPU的。 集合关注的数据的存储,面向内存的。 > Stream API 之于集合,类似于SQL之于数据表的查询。
3. 集合用Stream流怎么实现过滤?(润*软件)
filter(Predicate predicate)
4. 用Stream怎么选出List里想要的数据?(惠*)
持续更新中!!!