Java基础知识
一、java概述
起源
- 1990年,Sun公司的James Gosling(Java之父)研发名为Oak的语言(Java的前身),1994年,Oak被正式更名为Java。
语言优势
- 简单:语法风格与C++类似,但是没有指针、多继承(Java中只允许单继承),有自动回收机制,而且有大量的类库。
- 完全面向对象:Java是一种完全面向对象的语言。
- 分布式:提供对多种网络协议的支持。
- 安全可靠:不支持指针,没有非法访问、内存泄漏,有垃圾回收机制,编译器会检查程序,而且有异常处理机制。
- 跨平台:只要安装了Java运行时系统,可以在任意的处理器运行。
- 解释执行:Java的源文件即.java文件首先被编译为.class文件,再通过JVM解释执行。
- 多线程。
- 动态: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.运算符优先级
- 括号()
- 正负号+,-
- 一元运算符++,--,!
- 乘除*,/
- 加减+,-
- 移位运算>>,>>>,<<
- 比较大小<,>,>=,<=
- 比较是否相等 ==,!=
- 位与运算 &
- 位异或运算 ^
- 位或运算 |
- 逻辑与运算 &&
- 逻辑或运算 ||
- 三元运算 ?:
- 赋值运算符 =
六、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 次方)。