深入了解JAVA基础(面试)
I.常用类型与编码类问题:
1.Java中的基本类型有什么?
byte、short、int、long、float、double、chart、boolean这八种,这八种也挺好记,表示数字类型的有5种{整数三种[(短)short、(中)int、(长)long]、小数两种[(单精度)float、(双精度)double]},还有三种非数字类型{(表示真假)boolean、(表示字节)byte、(表示字符)char},如果实在记不住,你就记住凡是生命对象可以用小写直接声明的就是基本类型。
2.byte、short、int、long、float、double、char以及一个string类型数据占用的字节数量?
这是一道很基础的题,byte本身表示的就是字节,所以byte就占用一个字节;char表示一个字符占用2个字节;short表示一个短整型数据占用2个字节;int表示整型数据占用4个字节;long表示长整型数据占用8字节;float表示浮点型数据占用4个字节;double表示双精度浮点型占用8个字节;string类型的一个字符根据编码协议而定(一般没有人问),常见的编码协议有一些几种:Unicode(中文占用4字节,英文占用4字节,数字占用4字节)、UTF-8(中文占用3字节,英文占用1字节,数字占用1字节)GBK(中文占用2字节,英文占用1字节,数字占用1字节)GB2312(中文占用2字节,英文占用1字节,数字占用一字节)。[注]:byte和bit的区别?bit表示的是位,1byte=8bit,更不用担心有人问boolean类型的长度,在JDK文档中明确说了boolean的大小没有精确定义,但经过测试int类型是它的3.5倍左右,所以我们一般更倾向于占一个字节(这个就更没有人敢问了)。
2<a>.在Java中为什么char占用两个字节?而一个字符串类型的却占4个字节?
因为这个现象我觉的很有趣单独写成了一篇博客,见:https://www.cnblogs.com/ben-mario/p/10458318.html
2<b>.我们都知道Java中long类型占用8个字节,float占用4个字节,为什么float表示的数字范围比long表示的范围大?
long类型是使用二进制直接保存数据,也就是long的表示范围大小是2^64-1,float是使用类科学计数方式计数的表达方式:V=(-1)^s * M * 2^E,其中V是最终表示结果值,s(1位)表示符号位,M(23位)表示小数域范围[0,1),[1,2),E(8位)表示指数域,所以float的的表示范围:一3.403E38~3.403E38。
2<c>.float单精度和double双精度有什么区别?
首先内存占用不同,float是4字节,double是8字节;其次精度不同,float是单精度有效数字占8位,double是双精度有效数字占16位;然后是处理速度不同,一般来说但进度的处理速度比双精度的处理速度快。因为表示方法相同,double占用内存比float大,所以很定是表示的范围更大。
3.String类型的创建过程是什么样的?
直接使用String str=“test”;创建的String经过两个过程,检查String常量池,如果没有则创建一个新的String在常量池,在stack(栈)创建对象引用,引用String常量池中的常量地址。如果是使用String str = new String("test");创建String经过三个过程,检查String常量池,如果没有则创建一个新的String在String在常量池,在heak(堆)中创建一个String对象,在stack(栈)中创建一个引用对象指向堆中String对象地址。
3<a>.在String类型中,“+”的连接是怎么实现的?“==”和String的equals方法有什么区别?
我们都知道String类型时声明时创建的String常量,所以在String中的+将两个字符串连接,其实在底层是使用了StringBuilder的append()方法将两个String连接起来的,其最底层是byte数组扩展的,每次增加16个长度,用UFT-16字符集。在Object中其实equals方法和==是相同的,都是对比两个对象是否为同一引用,但String类中重写了equals方法,只字符串内容是否相同。
II.不太常用的运算
1.i++、++i(i--和--i等)的区别?
讲真的这个问题是一个很无聊的问题,我们都知道i++是先赋值,后加1;++i是先加1,后赋值。其实i++本身是等价于i=i+1;同样的如果是++i呢?本质上也是等价于i=i+1;怎样证明呢这两个是一样的呢?我猜这个表达式你最多的是用在for循环中吧,那就使用for(int i=0;i<10;++i){System.out.println("++i:"+i);}和for(int i=0;i<10;i++){System.out.println("i++:"+i);},显然打印结果是一样的,之所以会说先赋值还是后赋值的问题是源于这样的运算:i=1;j=i++;结果是j=1;i=2;(j=i;i=i+1),i=1;j=++i;(i=i+1;j=i;),所以我们当然也可以这样理解:i++和++i的实现过程是创建临时变量temp,temp=i;i=temp+1;其中i++输出temp的值,++i输出i的值。
2.移位运算的是什么?
简单来说计算机中是以二进制补码存储的,以int类型为例,占4字节32位,移位有左移位和右移位两种。左移位就是将二进制数值整体向左移动n位,永远补0,在不溢出的情况下new_value=value*2^n;同样的右移就是讲二进制数值整体向右移动n位,不同的是如果是正数右移补0,负数右移补1,在不溢出的情况下new_value=value*2^n。注意移动负数位(n)时,移动方向不变,实际移动位数new_n=32+n。
(这一块真的不怎么用得到,实际应用还需要自己先计算一遍所以没必要,理论又太偏底层计算机原理所以一般也不会问)
III.关于类型和方法的基本问题
1.怎样证明创建一个对象时是由类的构造器创建的?
通常我们定一个类型是不写无参构造方法的,因为JDK会默认为没有写构造方法的类型生成一个无参的构造方法,想要证明创建对象是由构造方法创建的,我们只需要自己写出显示的构造方法并对其生命private级别,很明显我们是不能再使用new关键字创建对象的,所以创建对象是通过类构造器创建的。
2.java中有了int(double等),为什么还要Integer(Double等)?
java中有八种基本类型,并且八种类型都分别有自己的封装类,那么有些人会问为什么还要封装类?在面向对象编程的发展过程中,java一直都有一句“万物皆对象”的说法,就是说任何事物在java眼里都是对象,然后有人就问那基本类型是什么?我们对指导在面向对象编程中,只有对象身上才会有属性和方法,所以int没有什么方法,这个时候就有了封装类的概念,就是将基本类型包装成引用类型,这些引用类型身上是有属于各自的基本方法。虽然在存储上没有什么大的区别,但是就使用和概念上区别还是挺大的。
3.关于类型比较时,“==”和equals()方法有什么区别?
通常在没有重写equals()方法这两个是相同的,都是比较的对象,因为equals()方法来源于Object类中,在Object类中equals的实现就是用“==”比较的。但java的常用类型如(String、Integer等)基本是重写了equals(),主要是比较对象的值,而且一般重写equals()方法都会重写hashCode()。
3<a>.为什么一般重写equals()方法是,我们需要写hashCode()方法?
首先并不是重写equals()方法就一定要重写hashCode()方法。之所以通常情况下我们会重写,是因为我们可能需要在equals()方法中使用“==”比较以提高比较效率。“==”比较的是对象,而不同的对象的区分最直接的就是根据对象的hash值比较的,这就是我们需要重写hashCode()方法最直接的原因。
深入了解JAVA基础(面试)的更多相关文章
- Java基础面试系列(一)
Java基础面试总结(一) 1. 面向对象和面向过程的区别 面向过程 面向对象 性能 高于面向对象 类加载的时候需要实例化,比较消耗资源 三易(易维护,易复用,易扩展) 不如面向对象 具有封装,继承, ...
- Java基础——面试、笔试
网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&page=2 参考资料:(java方面的一些面试 ...
- Java基础面试知识点总结
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Java基础 面试总结(一)
一.java基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机( ...
- Java基础面试集合
1.面向对象的特征有哪些方面? 抽象 封装 继承 多态,多态性是指允许不同子类型的对象对同一消息作出不同的响应.简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情.多态性分为编译时的多态性和 ...
- JAVA基础面试(一)
1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...
- java基础面试(二)
最近有搜了几个面试题,大家一起来探讨一下. 1.Oracle 的分页 --分页查询一 select * from (select a1.*,rownum rn from (select * from ...
- Java基础面试相关
面试相关的问题(下) 四 Linux高级_ 1.Linux机器 变慢,怎么查看? (1)整机的性能 主要查看的是CPU和内存 先查看整机的top,使用命令 top 虚拟机 使用1可以查看哪个核被占用过 ...
- JAVA基础面试汇总
一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java ...
- 分享18道Java基础面试笔试题(面试实拍)
上图来自Java技术栈微信群里的群友分享,看起来比较基础,但不一定人人都答得上来. 图片比较模糊,小编把题目进行了文字化. 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求 ...
随机推荐
- 标准标签库JSTL(JSP Standard Tag Library)
1, 核心标签(最常用, 最重要的) 表达式控制标签 out 输出常量 value---直接赋值 输出变量 default---默认值 escapeXml---控制转义字符(默认为true, 如果需要 ...
- python-生成式的基本使用
生成式是python中的一种高级玩法,起码看起来显得要高级一点.它可以使用简单的一行代码实现列表.字典等数据类型的创建或数据类型的转换等任务.另外,它和生成器还有些许关联. 列表生成式 列表生成式即生 ...
- MyBatis中的$和#,用不好,准备走人!
作者:程序猿的内心独白 https://m.toutiaocdn.com/i6685496024770806280 这是一次代码优化过程中发现的问题,在功能优化后发现部分数据查不到出来了,问题就在于一 ...
- thinkphp开发微信小程序后台流程
thinkphp开发微信小程序后台流程,简单分享一下微信开发流程 1,注册微信小程序账号 2,注册好后,登陆微信小程序,下载微信小程序开发工具 3,用thinkphp开发企业后台,前台数据用json返 ...
- java截取某个字符之前或者之后的字符串
String str = lly://enterVideoList?result={jsonString}; 截取?之前字符串 String str1=str.substring(0, str.ind ...
- ApacheHttpServer修改httpd.conf配置文件
转自:https://blog.csdn.net/dream1120757048/article/details/77427351 1. 安装完 Apache HTTP Server 之后,还需要修改 ...
- 【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
那么在前四章我们已经把数据的表示和运算,存储系统和指令系统都已经给大家讲完了.那么从这一章开始,我们将要讲解中央处理器的内容.那么这一部分内容我们就进入到我们计算机组成原理的一个深水区,它是我们计算机 ...
- 2018-2-13-WPF-绑定密码
title author date CreateTime categories WPF 绑定密码 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 + ...
- python列表解析和生成器表达式
列表解析作为动态创建列表的强大工具,值得学习. 列表解析技术之前的状况--函数式编程. lambda.filter(), map() enumerate, sorted, any, all, zip ...
- 前端BFC布局学习
BFC,全称为(Block formatting context).按照我的理解是我们在某一条件下会触发BFC布局,会产生一定的效果. Block Formatting Contexts翻译为:块级元 ...