java每日一练:面试题集合

6.29:1、说一下jdk和jre的区别?

  • JRE是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
  • JDK是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
  • 如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。

6-29日每日一练解答的核心点:

1.介绍jdk(开发环境)和jre(运行环境)的概念

2.JDK包含JRE

3.JDK中包含开发工具包,编译器,调试和分析工具等

3.在项目部署时只需要jre即可,项目开发期间安装jdk

 

6.30:2、java的跨平台原理

  1. java的跨平台是通过java虚拟机来实现的
  2. Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器.
  3. Java 解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。
  4. 同一个.class文件在不同的虚拟机 会得到不同的机器指令(Windows和Linux的机器指令不同),但是最终执行的结果却是相同的

 

7.1:3、java的基本数据类型,占用内存,byte,short的取值范围

这是8中基本类型的内存中占用字节数(取值范围是2的(字节数X8-1)次方)

1.整型

  • 类型 存储需求 bit数 取值范围
  • byte 1字节 1*8 -128~127
  • short 2字节 2*8 -32768~32767
  • int 4字节 4*8 (-2的31次方到2的31次方-1)
  • long 8字节 8*8 (-2的63次方到2的63次方-1)

2.浮点型

  • 类型 存储需求 bit数 备注
  • float 4字节 4*8 float类型的数值有一个后缀F(例如:3.14F)
  • double 8字节 8*8 没有后缀F的浮点数值(如3.14)默认为double类型

3.char类型

  • 类型 存储需求 bit数
  • char 2字节 2*8

4.boolean类型

  • 类型 存储需求 bit数 取值范围
  • boolean 1字节 1*8 false、true

 7.2:4、a++和++a的区别

  • a++:先运算后自增1;++a:先自增1后运算
  • --同理

5、&和&&的区别

  • Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
  • &&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;&则两个表达式都执行。
  • &可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示按位操作。

 

7.3:6、对比if和switch

  • 从使用表面看
    • if的分支只有两个,如果情况多种就得多个if-else
    • swith可以同时支持任意多个分支
  • 从适用范围
    • if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;
    • 而 switch 只能对byte、short、int、char、String进行数值比较
  • 从设计上看
    • (区间判断)if就是用来根据真假真正做分支用的,分支执行非此即彼,如果多个分支就得多重判断,无论前面的条件是否成立都得判断一遍,直至找到真正的true,就找到这个程序的分支流程而走开了
    • (等值判断)swith则是一种通道开关设计,它的条件跟真假无关,无需逐一判断,它寻找的是一个通道入口,给定一个值立即就按它对应的入口执行后续流程而不是彻底走开,若要彻底走开还得特意break或者return一下

7、对比三种循环

 

循环说明

for

while

do while

结构

for(循环次数【数组的length或集合的size】){

    if(条件【true或false】){

             循环体;

    }

}

while(条件【true或false】){

         循环体;

}

do{

         循环体;

}while(条件【true或false】);

特点

先判断后执行

先判断后执行

先执行后判断,至少会执行一次

作用

循环次数确定

不确定循环次数

不确定循环次数

 

7.6:8、什么是类,什么是对象,类和对象的关系

 

对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件

类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类

类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。

9、什么是构造方法,什么是方法重载

什么是构造方法?

当新对象被创建的时候,构造方法就会被调用。每一个类都有构造方法,如果程序员没有给类提供构造方法,Java编译器会为这个类创建一个默认的构造方法。

方法重载是指在一个中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。

 

 

7.7:10、简述一下封装

  • 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制程序中属性的读(get)和修改(set)的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

11、简述static关键字的含义及用途,特点等

含义

  • static表示“静态”的意思,可以用来修饰成员变量和成员方法(后续还会学习 静态代码块 和 静态内部类)。

用途

  • static的主要作用在于创建独立于具体对象的域变量或者方法

特点:

  • 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
  • 静态成员 在类加载时加载并初始化。
  • 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )
  • 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !
  • 静态修饰的方法被调用时有可能对象还未创建!

 

7-7日每日一练解答的核心点:

1.封装:将属性私有化,提供公有方法访问私有属性,提高了代码的安全性

2.static关键字,修改的属性或方法被提升到类级别的属性或方法,特点:可以直接通过类名.属性或类名.方法名调取

 

 

7.8:12、解释说明Java三大特性

封装、继承、多态

封装:就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private使其隐藏起来;类中提供了方法get、set等方法,可以操作这些被隐藏的属性,其他类可以通过调用这些方法,改变隐藏属性的值!

 

继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。

 

多态:多态就是在声明时使用父类,在实现或调用时使用具体的子类,即父类引用指向子类对象;不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性,多态增强了软件的灵活性和扩展性。

 

13、抽象类和接口的区别

  • 抽象类使用(extend)来被子类继承, 无法多继承。 接口使用(implements )来被子类实现, 可以多实现
  • 抽象类中可以声明抽象方法,也可以写非抽象方法,接口只能声明抽象方法。
  • 抽象类中的变量是普通变量,接口里定义的变量只能是公共的静态的常量。
  • 抽象类中可以包含static方法 ,但是接口中不允许(静态方法不能被子类重写,因此接口中不能声明静态方法)
  • 抽象类可以有构造方法,但是接口不能有

 

7.9:14、方法重写和方法重载的区别

区别点

方法重写

方法重载

范围

子类对父类

类本身

参数列表

一定不能修改

参数类型、个数或者顺序不同

返回类型

一定不能修改

可以修改

异常

可以减少或删除,一定不能跑出新的或者更广的异常

可以修改

访问

一定不能坐出更严格的限制(可以降低限制)

可以修改

 

 

15、多态的表现形式有哪些

重载、重写、抽象类和接口。

 

7.10:16、介绍一下java中的异常处理机制

异常处理机制为:抛出异常,捕捉异常。

Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。

   1.try:它里面放置可能引发异常的代码

   2.catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异 常抛出.

   3.finally:在进行异常的处理之后,在异常的处理格式中还有一个finally语句,那么此语句将作为异常的统一出口,不管是否产生 了异常,最终都要执行此段代码。

   4.throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。

   5.throws:用在方法签名中,用于声明该方法可能抛出的异常。

7月10日每日一练解答核心点:

1.什么是异常

2.异常的关键字

3.每个关键字的的含义以及作用

4.异常的分类

7.15:17、描述Java中的三大集合(接口,实现类,存值特点,存值原理等角度描述)

  • Set集合。其主要实现类有HashSet、TreeSet。
    • 存放对象的引用,不允许有重复对象。 
    • 1.HashSet(),调用对象的hashCode()方法,获得哈希码,然后再集合中计算存放对象的位置。通过比较哈希码与equals()方法来判别是否重复。所以,重载了equals()方法同时也要重载hashCode()方法。
    • 2.TreeSet(),继承ShortedSet接口,能够对集合中对象排序。默认排序方式是自然排序,但该方式只能对实现了Comparable接口的对象排序,java中对Integer、Byte、Double、Character、String等数值型和字符型对象都实现了该接口。 
    • 如果有特殊排序,须重载该接口下的compareTo()方法或通过Comparator接口的实现类构造集合。 
  • List集合,其主要实现类有LinkedList、ArrayList,前者实现了链表结构,后者可代表大小可变的数组。
    • List的特点是能够以线性方式储蓄对象,并允许存放重复对象。
    • List能够利用Collections类的静态方法sort排序。
    • sort(List list)自然排序;sort(List listm,Comparator codddmparator)客户化排序。
    • List:线性集合接口,有序;ArrayList:动态数组[可变长度的动态数组];LinkedList:链表结构的集合
  • Map集合,其主要实现类有
    • HashMap、TreeMap。
    • Map对值没有唯一性要求,对健要求唯一,如果加入已有的健,原有的值对象将被覆盖。
    • HashMap类按照哈希算法来存取键对象,可以重载equals()、hashCode()方法来比较键,但是两者必须一致。
    • TreeMap,可自然排序,也可通过传递Comparator的实现类构造TreeMap。
    • Map:键值对存储结构的集合,无序

7月15日每日一练解答核心点:

1.集合类型:List,Set,Map

2.等级关系(Collection包含list,set,map独立)

3介绍三个集合的常用实现类,比如Arraylist,LinkedList

HashSet,HashMap等

4.存值特点:list-有序可重复,set-无序不可重复 ,map-key/value形式

5.数据结构:arrayList 顺序存储,Linkedlist 链表存储

6.底层实现:基于数组

7.面试常考:HashMap的实现原理

 

7.16:18、讲一下hashMap的实现原理

https://www.cnblogs.com/yuanblog/p/4441017.html

 HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

    在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

 

总结:HashMap的实现原理:

  1. 利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
  2. 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value(键值对)放入链表中
  3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
  4. 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。
  5. 初始容量为16,负载因子为0.75

 

7.17:19、Comparable和Comparator区别比较

  • Comparable 是排序接口,仅仅只包括一个Comparable<T>函数x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。
  • Comparator 是比较器接口。仅仅只包括两个个函数int compare(T o1, T o2); boolean equals(Object obj);
  • Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。

而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

20、HashMap和TreeMap的区别

  • HashMap:基于哈希表实现,TreeMap:基于红黑树实现
  • HashMap:适用于在Map中插入、删除和定位元素。

Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

  • HashMap不保证元素迭代顺序是按照插入时的顺序,Treemap会按照排序后的顺序迭代元素

 

7.20:21、说一下你了解的IO流体系

 

https://blog.youkuaiyun.com/iteye_15112/article/details/82580472

7.21:22、介绍一下序列化技术

序列化就是将对象状态转换为可保持或传输的格式的过程。与序列化相对的就是反序列化,他将流转换成对象。这两个过程结合起来,可以轻松地存储和传输数据。

要序列化的类,要实现Serializable接口,而这个接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

7-21每日一练解答:

1.序列化反序列化的概念

2.实现方式和常用方法

3.不能序列化的情况:transient关键字修饰

 

7.22:23、介绍一下线程的生命周期

  • Java线程具有五中基本状态
  • 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
  • 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
  • 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
  • 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
    • 1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
    • 2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
    • 3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  • 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

7.23:24、解释一下TCP协议的三次握手和四次挥手

理解及面试题链接https://note.youdao.com/ynoteshare1/index.html?id=4b10010f9de5975d8689404a76286711&type=note

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值