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 次方)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 前言 网上的 Java 基础面试题文章有非常多,但是大部分都比较老了。 很多题目早已不是当前的热门题目,没有必要在...
    码农Kkio阅读 1,789评论 1 10
  • 优化说明: 以基础格式来进行记录,减少重复记录。 感想方面尽量简洁,触发思索即可。详细剖析放在早上。 早上忘记时间...
    厚丕蓄阅读 150评论 0 3
  • 认识java 1.java是一种编程语言,机器语言:010101010;汇编语言:通过大量的英文单词代表的计算机指...
    ILYBYLM阅读 639评论 0 1
  • # 程序语言基础 JAVA## 常用数据类型### 1 int 用于存储整数### 2 double 用于存...
    ef3dea382633阅读 140评论 0 0
  • 1、String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类是不能被继...
    Binary_r阅读 1,778评论 0 3