找回密码
  注册[Register]
查看: 1195|回复: 7

[java] java基础及常见面试题

[复制链接]
发表于 2021-1-22 09:02 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

本帖最后由 smiles丶 于 2021-1-22 09:08 编辑

java运行机制
编译型:c  c++...
解释型:java ...
java偏向于解释型语言,但是也有编译型语言的特性。
程序的运行机制:
​ 首先是 编写的java文件 =》 java编译器 =》 字节码文件(.class) =》 类装载器 =》字节码校验 =》解释器 =》操作系统平台
使用IDEA开发
可以说 目前IDEA是最好的开发java的集成环境
IDE:是指 集成开发环境。用于提供程序开发的应用程序,一般包括代码编辑器,编译器,调试器和图形用户界面等工具。
java基础知识1,注释
  • 我们平时写代码,在代码量少的时候还可以看懂。但是当代码量特别多的时候,我们光靠人脑可能就无法记忆了。所以需要写注释。
  • 注释并不会被编译执行,是给我们写代码的人看的
  • 书写注释是一个非常好的习惯
  • java中的注释有三种:

    • 单行注释
      // 单行注释
    • 多行注释
      /*  我是多行注释888***多行注释 /
    • 文本注释
      /*/  这是文本注释的格式,在文本注释中,就可以有一些功能,用@开头,就可以识别一些。不如 @Author  作者的意思
      当然有一些好玩的代码注释,在我们在可以在网上搜:
      神代码注释     有趣的代码注释

      • 标识符和关键字

      java所有的组成部分都需要名字。类名,变量名以及方法名都被称为标识符。
      标识符的注意点:
      • 所有标识符都应该以字母,美元符,或者下划线开头
      • 首字母之后是以字母,美元符,下划线或者数字的任何组合
      • 不能使用关键字作为变量名或者方法名
      • 标识符是大小写敏感的
      • 合法标识符列举:age ,$salary ,  _value , _1_value
      • 非法标识符列举:123abc , -salary , #abc
      • 可以使用中文命名,但是一般不建议这样去使用,也不建议使用拼音,很low

      关键字:关键字就是java已经定义的标识符。如 public static void...   。也不是很多,之后会慢慢学到。但是注意在自己命名的时候不能使用java已经命名好的。


2,数据类型 (重要)
  • 强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用。
    java
    强类型语言的安全性较高,速度比弱类型慢。
  • 弱类型语言:也就是和强类型语言相反。并不需要严格符合规定
    js vb
  • java的数据类型分为两大类

    • 基本数据类型 :八种基本数据类型,String不是基本数据类型,是引用类型,属于类
    • 整数类型:byte占1个字节。short占2个字节。int占4个字节。long占8个字节。
    • 浮点类型:float占4个字节。double占8个字节。
    • 字符类型:char占2个字节。
    • boolean类型:占1位其值只有true和false两个

    再来科普一下什么是字节?
    位(bit):是计算机内部数据存储的最小单位,11001100是一个八位二进                    制数。
    字节(byte):是计算机中 数据处理 的最基本单位,习惯上用B来表示
    ​                           1B(byte,字节) = 8bit(位)
    字符:是指计算机中使用的字母,数字,字和符号   
    ​               1bit表示1位,
    ​               1Byte表示一个字节1B = 8b
    ​               1024b = 1KB
    ​               1024KB = 1M
    ​               1024M = 1G
    ​               1024M = 1TB
    面试题:
    ​   整数扩展:
    ​            进制 :  二进制 0b , 十进制  ,  八进制 0  , 十六进制 0x
    ​           int i = 10;         //十进制数,就是10
    ​           int i1 = 0b10;  //这是二进制,表示2
    ​           int i2 = 010 ;  // 八进制进制数,表示8
    ​           int i3 = 0x10;  //十六进制,表示16
    ​   浮点数扩展:银行业务怎么表示?钱
    ​   float f = 0.1f;   //打印结果为  0.1
    ​   double d = 1.0/10;   //打印结果为 0.1
    ​   但是这个两个数在比较时,是不相等的。
    ​   
    ​   float d1 = 23131312312312313f;
    ​   float d2 = d1 + 1;
    ​   这两个数的比较结果是相等的
    ​   原因: 浮点数表示的数都是有限的,但是有些东西是无线的,所以表现                出来就会出现错误。同时,浮点数还是 离散的  。有些数无法表              示,就会出现舍入误差。找一个相近的数。
    ​       有限  离散  舍入误差    大约  接近但不等于
    ​       所以总结:
    ​           最好完全不使用浮点数进行比较
    ​           最好完全不使用浮点数进行比较
    ​           最好完全不使用浮点数进行比较
    ​   重要的事情说三遍。
    ​   解决方案:银行业务我们一般用 BigDecimal 数学工具类来表示。
    ​   字符扩展:
    ​   所有字符本质还是数字
    ​   编码: Unicode 表:(97 = a  65 = A) 2字节 0-65536
    ​               Excel  2 16 = 65536
    ​   Unicode编码范围: U0000 ~UFFFF
    ​   char c3 = '\u0061'    \u是转义的意思。输出结果为  a
    ​   
    ​   转义字符:
    ​           \t  制表符   (类似于tab建)
    ​           \n 换行  
    ​           ...  转义字符还要很多,这里不再举例。
    ​   
    ​   String sa = new String("hello world");
    ​   String sb = new String("hello world");
    ​   sout(sa ==  sb)   结果为false
    ​   String sc = "hello world";
    ​   String sd = "hello world";
    ​   sout(sc ==  sd )   结果为true
    ​   因为new出的对象使用了一块内存,== 比较的的是内存地址是否一样。
    ​   
    ​   布尔值扩展:
    ​   boolean flag = true;
    ​   if(flag == true){}      这种写法是新手的写法,在执行的时候
    ​       只是if(flag){} (老手写法) 来判断这个flag中的值是否为true。
    ​   在java中流传一句话:Less is More  | (越简单的越复杂)就是代码要精简易读
    • 引用数据类型
    • 接口
    • 数组


3,类型转换
​ 由于java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
​ 级别从低到高为:byte, short, char, int, long, float, double
​ 这个顺序也不难理解,小数一定是大于整数的。含有小数可以表示整数,但   是整数却无法表示整数。
​ 运算中,不同类型的数据先转化为同一类型的数据,再进行计算。
​ 实例:
​ int b = 128;
​ byte c = (byte)b;  //当高类型向低类型转换的时候,需要用到在前面加() 在括    号里面加上需要转换成的类型。  这种转换方式,就被称之为:强制类型转      换。
​ double d = b;  // 低类型数据向高类型数据转换的时候,不需要加括号。这种转换方式称之为:  自动转换。
当我们输出 b c d 的时候。发现c可能并不是128.因为我们之前提到过。byte的存储空间为127.超过127之后就造成了 内存溢出。那么它输出结果就不再确定了。而d输出的结果只是加了小数位。因此
​ 我们在做强类型转换的时候一定要防止内存溢出
注意点:
  • 不能对布尔值进行转换     (因为布尔值是用位来计算的,两者是不相干的东西)
  • 不能把对象类型转化为不想干的类型   (我们上面的 int byte..都可以称之为对象类型)
  • 在把高容量转换为低容量的时候,强制转换。转换的时候可能有内存溢出问题,或者精度问题!
    精度问题: (int)23.7    (int)-23.7f    这两个数一个是double类型一个是float类型。 输出结果为 23   -23 。  这是不是就把小数点后的东西丢了。这就是精度问题。
    ​  char c = ‘a’  //char虽然是字符,但是本质还是数字。我们来转化一下
    ​  int d = c +1 ; //自动转换。输出结果为98
    ​  char e = (char)d  ;   // 强制转换,输出结果为b。(因为98对应的字符就是b)
  • 操作比较大的数的时候,的溢出问题
    int money = 10_0000_0000;
    //JDK7新特性,在数字之间可以加下划线分开。
    //方便输入,但是并不影响数字。
    int years = 20;
    long total = money  * years ;  // 这个计算仍然给不了我们想要的结果。因为,它是现将 money 和years进行计算 ,仍然是int类型。计算完成之后,才转化为long类型。所以仍然存在内存溢出问题。
    解决方案:  long total = money * ((Long) years)  ;
    这样在计算的时候会现将years和money转换为long类型然后计算。
    同时注意表示long类型数字的时候在数字后面加 L l 大小写L都是可以的,但是小写容易被误读为1.所以如果需要,就用大写的L。


4,变量常量
变量是什么:就是可以变化的量
java是一种强类型语言,每个变量都必须声明其类型
java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
不推荐在一行中定义多个同类型变量。当然可以用逗号隔开来定义在一行。但是看起来并不优雅。编写代码要注意一个事项:代码可读性
注意事项:
  • 每个变量都有类型,类型可以是基本类型,也可以是引用类型
  • 变量名必须是合法的标识符
  • 变量声明都是一条完整的语句,因此每个声明都必须以分号结束。

变量的作用域
类变量  :写在类中,并使用static来修饰。也称为静态变量
​ 从属于类。随着类的存在存在,类的消失而消失
实例变量:写在类中,没有使用static修饰
​ 从属于对象。如果不自行初始化,这个类型的默认值 为0 0.0
​ 布尔值:默认是false
​ 除了基本类型,其余默认值都是null。
局部变量:写在方法中。
​ 必须声明和初始化值。
​ int i = 10;
常量:
​ 初始化之后不能再改变的值!不会变动的值。
​ 所谓常量,可以理解为一种特殊的变量,它的值被设定之后不允许被改变。
​ final 常量名 = 值;
​ 常量名一般使用大写
​ 在类型前面的修饰符,不存在先后顺序
​ static final double PI = 3.14;
​ final  static double PI = 3.14;
变量的命名规范:
  • 所有变量,类名,方法:见名知意  推荐使用英文,拼音确实显得太low了。
  • 类成员变量:首字母小写和驼峰原则:monthSalary 除了第一个单词以外,后面的单词首字母大写。
  • 局部变量:首字母小写和驼峰原则
  • 常量:大写字母和下划线组成:MAX_VALUE
  • 类名:首字母大写和驼峰原则:Man,GoodMan
  • 方法名:首字母小写和驼峰原则:run() , runRun()

5,运算符
java支持如下运算符:
  • 算术运算符:+,-,*,/,%(取余数,在java中称之为模运算),++,--
  • 赋值运算符:= (在java中 一个=号为赋值运算符,如 int a = 10;就是把10赋值给a。
  • 关系运算符:> , < , >= , <= , == , != instanceof
  • 逻辑运算符:&& , || ,!
  • 位运算符:&, | , ^ ,~ ,>> ,<< , >>>(了解!!!)
  • 条件运算符:? :
  • 扩展赋值运算符: += , -= ,*= , /=

用来操作两个数的运算符也被称之为:二元运算符
注意事项:
  • &#8203;  int a = 10;
    int b = 20;
    int c = a / b;   
    则c的结果为0;这显然不是我们要的结果,因为在除法运算完成之后依然是int类型。而int类型只保留整数部分,所以0.5被保存为0;
    因此在进行除法运算的时候,要注意类型取值范围的问题  double c = ( a / (double)b ) ;
  • 在int类型以下的低类型转换的时候,都会默认转化为int类型
    short c = 10;
    byte d = 8;
    (c + d )  就是int类型,不同类型计算的时候要先转化为同一类名。若低于int的类型 ,则都转换为int类型。
  • 关系运算符返回的结果:正确  错误   布尔值。
  • ++  , --      自增,自减   一元运算符(顾名思义,只操作一个数)
    int a = 3 ;
    int b = 3++ ;
    /**执行完上面代码后,输出a 为 4。b为3 。则当++放在后面的时候。先将值赋值给前面的数。然后这个数自增1。
    &#8203;  等于在 int b = a;后面加了一个 a = a + 1;
    */
    int c = ++3;
    /**执行完上面这代码后,输出a 为 5。c为5 。因为第二行代码已经将a变成了4。
    则当++放在前面的时候。先将这个数自增1。然后值赋值给前面的数。
    &#8203;  等于在 int c= a;前面加了一个 a = a + 1;
    */
  • 幂运算:2^3  就是 2 2   2  =8
    在java中我们一般通过数学工具类来做幂运算
    Double pow = Math.pow( 2, 3);
    很多运算我们会使用一些工具类来运算。
  • 逻辑运算:
    与(and)   或(or)  非 (取反)
    其中需要注意的是与的 短路运算
    boolean a = false;
    boolean b= false;
    b&&a  时,因为是与运算,需要两边都为true才返回true。
    而短路运算就是当它发现前面的为false时,就不会再对后面的进行运算。因此 b&&a 结果false

    • 位运算符:跟二进制打交道
      A = 0011 1100
      B = 0000 1101


    &#8203;      A&B = 0000 1100   与运算,两个都为1才返回1
    &#8203;      A|B = 0011 1101   或运算,两个都为0才返回0
    &#8203;      ~B   = 1111 0010    取反运算,为1返回0.为0返回1
    &#8203;      A^B = 0011 0001    异或运算,相同为0,不同为1
    &#8203;       <<  左移运算符
    /     >>       右移运算符
    &#8203;  上面的/是防止MarkDown标识符转义,不用管。
    记住左移就是箭头指向左。右移指向右即可。
    因为是二进制,所以右移一位就是乘以2.左移一位就是除以2
    0000 0000    0
    0000 0001    1
    0000 0010     2
    0000 0011     3
    0000 0100      4
    • a+=b    就是 a =  a + b
      a-=b   就是 a = a - b
    • 字符串连接符 +  , String  面试题
      int a = 10;
      int b = 20;
      sout("" + a + b);              sout是idea打印语句的快捷键。结果为1020
      sout(a  + b + "");    结果为30
      当字符串在前面的时候,会不进行后面的计算,直接拼接成一个字符串。在后面的时候会先进行计算。
    • 三元运算符
      x ? y : z  就是如果x == true,结果返回y。否者返回z
      int score = 50;
      String type = score < 60 ? "不及格" : "及格";   
      三元运算符很常见,它可以使得代码精简易读。之后也很常见,必须掌握。
    • 优先级:
      最高的是 括号里面的,然后是一元运算符,然后是加减乘除。具体不再细说。一般我们都会多用几个括号,括的明明白白。
      我在b站参考了狂神说java的视频,感觉很有用,大家可以看一下



6,包机制,JavaDoc
&#8203; 为了更好的组织类,java提供了包机制,用于区别类名的命名空间。
&#8203; 包语句的语法格式为:
&#8203; package pkg1[. pkg2[ . pkg3...]];
&#8203; 一般利用公司域名倒置作为包名;
&#8203; 为了能够使用某一个包的成员,我们需要在java程序中明确导入该包。使用import语句可以完成此功能
  • javaDoc

javadoc命令是用来生成自己的API文档的。
参数信息:
@author 作者名
@version 版本号
@since 指明需要最早使用的版本号
@param 参数名
@return 返回值情况
@throws  异常抛出情况
在类上加注释就是类注释,在方法上就是方法注释。
  • 通过这些注释,java可以自动帮我们生成开发文档API

在命令行中执行
到类所在目录,然后执行   javadoc  (这里可以加一些参数,如编码 - encoding UTF-8   -charset UTF-8) 类名.java
然后就会在目录中生成很多.html页面文件,双击index.html文件即可进入。
  • 在idea中生成
    首先在上边的操作栏中选择Tools  =》 Generate javadoc...  然后配置参数即可。
    关于java基础,以及一些面试题我就给大家总结到这里了。之后分享流程控制及面试题。


213841z6pbmjc66rbprj64.png

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-1-22 09:02 | 显示全部楼层
谢谢大佬分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-1-22 09:19 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-1-22 10:15 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-1-22 11:07 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-1-22 11:39 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-1-22 13:49 | 显示全部楼层
谢谢@Thanks!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-1-22 13:52 | 显示全部楼层

感谢楼主的分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|大牛论坛 |我的广告

GMT+8, 2024-4-20 00:54 , Processed in 0.056207 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表