Java基础知识

Java基础知识

一、java概述

起源

  • 1990年,Sun公司的James Gosling(Java之父)研发名为Oak的语言(Java的前身),1994年,Oak被正式更名为Java。

语言优势

  1. 简单:语法风格与C++类似,但是没有指针、多继承(Java中只允许单继承),有自动回收机制,而且有大量的类库。
  2. 完全面向对象:Java是一种完全面向对象的语言。
  3. 分布式:提供对多种网络协议的支持。
  4. 安全可靠:不支持指针,没有非法访问、内存泄漏,有垃圾回收机制,编译器会检查程序,而且有异常处理机制。
  5. 跨平台:只要安装了Java运行时系统,可以在任意的处理器运行。
  6. 解释执行:Java的源文件即.java文件首先被编译为.class文件,再通过JVM解释执行。
  7. 多线程。
  8. 动态:Java类库中可以自由地加入内容。

二、注释

单行注释 // 文档注释 /** / 多行文档 /*/

三、基本数据类型

数据类型 字节数 位数 默认值 注释
byte(字节) 1 8 0
short(短整型) 2 16 0
int(整型) 4 32 0
long(长整型) 8 64 0 结尾跟L,l
float(单精度) 4 32 0.0 结尾跟F,f
double(双精度) 8 64 0.0
char(字符型) 2 16 空格
boolean(布尔型) false

1.字符类型(char)

char可以与整数做运算。 例:char ch = 'a'; 和 char ch = 97;

转义字符 意义
\ddd 1到3位八进制数据所表示的字符
\uxxxx 4位十六进制所表示的字符
\r 回车
\n 换行
\b 退格
\f 换页
\t 垂直制作表光标移动到下一行
\'、\" '、"
\\ \

四、数据类型转换

隐式转换:

自动转换兼容顺序:

  • byte-->short-->int-->long-->float-->double
  • 特殊:char与部分int型数字兼容

显示转换:

(int)1.0;

五、运算符

1.位逻辑运算符

&与(面试题11) |或 ~a取反 ^a异或 <<左移位(面试题12) >>右移位 >>>无符号右移位

2.复合赋值运算符

+=、-=、*=、/=、>>=、<<=、>>>=

3.三元运算符

条件表达式?值1:值2 其等价于if...else语句

4.运算符优先级

  1. 括号()
  2. 正负号+,-
  3. 一元运算符++,--,!
  4. 乘除*,/
  5. 加减+,-
  6. 移位运算>>,>>>,<<
  7. 比较大小<,>,>=,<=
  8. 比较是否相等 ==,!=
  9. 位与运算 &
  10. 位异或运算 ^
  11. 位或运算 |
  12. 逻辑与运算 &&
  13. 逻辑或运算 ||
  14. 三元运算 ?:
  15. 赋值运算符 =

六、java关键字

  • java关键字都是小写的
  • Java语言一共使用了48个保留关键字,他们主要可以

分为如下几类:

访问控制

  • private 私有,
  • protected 保护,
  • public 共享.

类、方法和变量修饰符

  • abstract 摘要,
  • class 类,
  • extends 扩允,
  • final 结局,
  • implements 工具,
  • interface 接口,
  • native 本地,
  • new 新,
  • static 静态,
  • synchronized 同步,
  • transient 短暂,
  • volatile 易失.

程序控制语句

  • break,
  • continue,
  • return,
  • do,
  • while,
  • if,
  • else,
  • for,
  • instanceof,
  • switch,
  • case,
  • default,

错误处理

  • catch 捕获,
  • finally 最后,
  • throw 投试,
  • throws 投试,
  • try尝试.

+包相关

  • import 输入,
  • package 包.

基本类型

  • boolean 布尔型,
  • byte 字节型,
  • char 字符型,
  • double 双精度,
  • float 浮点,
  • int 整型,
  • long 长整型,
  • short短整型.

变量引用

  • super 特殊,
  • this 这个,
  • void无值.

除了这48个关键字以外,还有3个语法保留字:

  • null 空,
  • true 真,
  • false 假.

七、分支语句

if

if (布尔表达式) {
} else {
}

布尔表达式:最后返回的结果必须是一个布尔值。可以是一个单纯的布尔变量或常量,也可以是关系表达式。

if (布尔表达式) {
语句1
} else if (布尔表达式) {
语句2
} else {
语句3
}

switch

switch(用于判断的参数) {
case 常量表达式1 : 语句1;[break;]
case 常量表达式2 : 语句2;[break;]
.......
[default : 常量表达式n : 语句n;[break;]]
}

switch多分枝语句中 常量表达式必须是六种类型:byte、short、char、int4种整形类型以及String字符类,枚举类型。不可以时long类型。

default可以不写,如果case都不满足则不做处理。

八、循环语句

while

while(){
}

do while

do {
} while();

for

for(表达式1;表达式2;表达式3) {
}

foreach(增强循环)

for(循环变量x :遍历对象obj) {
引用x的java语句
}

在遍历数组方面更加方便。

遍历二维数组

for(int[] row :Array){
for(int data :row) {
}
}

九、跳转语句

  • break; 跳出循环
  • continue; 跳出此次循环,进入下一次循环

十、数组

动态初始化

  • 只指定数组长度,由系统为数组分配初始值
  • 格式:数据类型[] 变量名 = new 数据类型[数组长度];
  • 注意:堆内存,栈内存,内存分配问题
  • 例:int[] arr = new arr[2];

静态初始化:

  • 初始化时指定每个数组元素的初始值,由系统决定数组长度
  • 格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,.......};
  • 简化格式:数据类型[] 变量名 = {数据1,数据2,......}
  • 例:int[] arr = new int{1, 2, 3, 4, 5};或int[] arr = {1, 2, 3, 4, 5};

一维数组:

//申明
int a[];
int[] a;  //引用
//申明并分配内存空间
int a[] = new int[5];
//申明,分配内存空间,赋值
int a[] = { 1, 2, 3 };
int b[] = new int[] { 4, 5, 6 };
int c[] = new int[3];

二维数组:

//声明
int tdarr[][];
char[][] tdarr2;
//分配内存两种方式
int a[][] = new int[2][4];

int b[][];            //这种方法可以形成不规则数组
b = new int[2][];      //先分配行,再分配列,不能先分配列
b[0] = new int[3];    //给第一行分配列
b[1] = new int[2];    //给第二行分配列,

//三种数值赋值
//前两种类似与一维
//后一种为每一行赋值
int tdarr[][] = new int[2][3];

tdarr[0] = new int[]{1, 2, 3};

Array.fill(int[] a, int value)      //用value填满数组

十一、String类

字符串默认值为null,如果此时调用String的方法会出现空指针异常。

两种创建方式的区别:

1.String str = “123456”;(推荐)

  • 方便,且可以实现栈内存共享堆内存中的字符串,因为“123456”会存放在对内存的字符串池中,在次指向它是不会再创建新的堆内存,而是直接指向它。(池数据的自动保存,以进行重用)

  • String strA = "123456";
    - String strB = "123456";
    //strA,strB指向相同的堆内存
    //strA == strB为true
    
  • 字符串常量(对象)池

    • 目的:实现共享处理
    • 静态常量池,指程序(*.class)在加载的时候,对自动将此程序之中保存的字符串,普通的常量,类和方法 的信息等,全都进行分配。
    • 运行时常量池,当加载之后,存在一些变量,这个时候提供的是与与运行时常量值。

2.String str = new String("123456"); (构造方法实例化)

  • 会产生两块堆内存空间,其中一块会变为垃圾空间,“123456”先创建一份空间,new的时候再次创建一个空间
  • public String intern(); //手动入池。

字符串“常量”

String str = "String";

“String”其实是是匿名对象

开发过程中在利用equals();要把字符串常量放在前面,这样避免空指针异常

常用方法

a.concat(str);    //拼接字符串
str.length();     //字符串长度
str.charAt(index);//获取指定索引的字符

 //substr在a中首次出现的位置,若没有则为-1。查找字符串中是否有某个字符。
a.indexOf(sybstr);

//str:任意字符串。prefix:作为前(后)缀的字符串。
str.startsWith(fix);
str.endsWith(fix);

//将字符串转换为一个字符数组
str.toCharArray();

//子字符串是否存在,返回布尔类型
str.contains(string);

//beginIndex:起始索引(包括)。     //endIndex:结束索引(不包括)。
str.substring(beginIndex);   str.substring(beginIndex,endIndex);

//替换所有的oldstr为newstr
str.replace(oldstr, newstr);

char[] charArray ={'时','间','就','是','金','钱'};
String a = new String(charArray, 3, 2); //从第四个开始提两个

//分隔符表达式
str.split(regex);(源码)

//转换为小(大)写  
str.toLowerCase();
str.toUpperCase();

//去除首位空格
str.trim();

//判断字符串是否相等
a.equals(str);

十二、可变字符串

StringBuffer类

创建方法

StringBuffer sbf = new StringBuffer();
StringBuffer sbf = new StringBuffer("abc");
StringBuffer sbf = new StringBuffer(32);        //创建一个对象,初始容量为32个字符。

常用方法

//参数换成字符串,追加到此序列。  obj,可以是任意数据类型。
sbf.append(obj);

//index被替换字符的索引    ch替换后的字符。
sbf.setCharAt(index, ch);

//插入的索引,插入的字符串。
sbf.inset(offset, str);

//删除字符串,起始索引包括,结束索引不包括。
sbf.delete(start, end);

//提取索引处的字符
sbf.charAt(int);

sbf.reverse();//反转字符串
sbf.replace(3,4,"new");//替换从3开始4结束

StringBulider类

内容可变,性能比Stringbuffer高但不适合多线程。

十三、常量与变量

2.java中的变量包括 成员变量 和 局部变量 。

成员变量
1.直接定义在类中,方法外面。又称之为字段(Field),不要称之为属性(错误) 2.声明后,不论是否初始化,JVM都会将其初始化为默认值。
局部变量
1.除了成员变量,其他都是局部变量,具体存在于下面三个地方
1)方法内
2)方法的形参
3)代码块中(一对花括号)

2.必须初始化

常量

  • java中用final定义常量,且用习惯用大写字母
  • 将一些具有特殊含义的值设为常量可以增加代码的可读性

难点/面试题

1.关键字问题(见上文)

2.java中的变量包括 成员变量 和 局部变量 (特点)。(见上文)

3.boolean默认值为false

4.String的默认值为null

5.String类的几个方法使用 (见上文)

6.equals与==的区别

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。对于自定义的类建议重写equals方法。

7.jdk和jre的区别

  • JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
  • JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

8.final 在 java 中有什么作用?

  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

9.java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

10.String 属于基础的数据类型吗?

String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

11.请简述String两种创建方式的区别?

只创建了一个实例化对象,并会自动给进入字符串池,可以实现实例化对象的重用

会创建两个实例化对象,而且不能自动入池,不过可以通过intern()方法,手动入池。

String str = null;和String str = "";是两个不同的概念。 ""是一个字符串

11、&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是 null 而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的 equals 比较,否则会生 NullPointerException 异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

12、用最有效率的方法计算 2 乘以 8?

2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。

你可能感兴趣的:(Java基础知识)