关键字,保留字

被java赋予特殊含义,用做专门用途的字符串(单词)

标识符

变量

变量的定义

定义格式: 数据类型 变量名 = 变量值
声明: int age;
赋值: age = 12;
声明并赋值: int age = 12;

注意点:
变量需要先声明后使用
变量不会有默认值,所以需要赋值后使用
在其定义的作用域内有效

变量的数据类型


整型:byte(1字节 = 8bit)/short(2字节)/int(4字节)/long(8字节)

byte(-128 ~ 127)

  • 整型的常量,默认类型是:int型
  • 声明long型变量,必须以"l"或"L"结尾

浮点型:float(4字节) \ double(8字节)

  • 浮点型的常量,默认类型为:double
  • float:单精度,尾数精确到7位有效数字,double是float精度的两倍

字符型:char (1字符=2字节)

定义char变量,通常使用一对 ‘’ ,内部有且仅有一个字符char c = 'a'
表示方式:声明字符,转义字符,使用Unicode值
char c = '\n'
char c = '\u0043'

布尔型:boolean

自动类型转换

当容量小的与容量大的运算时,会自动提升为容量大的

byte b = 2;
int i = 129;
int i1 = b + i;
long i2 = b + i;
float i3 = b + i;

当byte ,short ,char 运算是会自动转为int

char c1 = 'a';//97
int i3 = 10;
int i4 = c1 + i3;short s2 = 10;
//char c2 = c1 + s2;//编译报错

强制类型转换

int i = (int) d;

基本数据类型变量间运算规则

自动类型转换(只涉及7种基本数据类型)

String

特点:

String是一个final类,代表不可变字符序列,只要 被 “” 的就是一个对象
字符串是常量,它们的值在创建之后不能更改
String对象的字符内容是存储在一个字符数组value[]中的。

String 原码

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage.*/private final byte[] value;/** Cache the hash code for the string */private int hash; // Default to 0

1.String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
2.通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。
3.字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。

String 在jdk8 及以前内部定义了 final char value[] 用于存储字符串数据。jdk9 时改为 final byte value[]

字符串的构造方法

1. 通过字面量定义的方式:声明的变量在常量池中
String s1 = "javaEE";
String s2 = "javaEE";
2. 通过new + 带参构造器的方式:先在堆内存中创建一份对象,再去查看堆内存中是否有该对象
String s3 = new String("javaEE");    //本质上是this.value = original.value;
String s4 = new String("javaEE");

3. 通过new + 空参构造器的方式:创建一个空的对象
String s5 = new String(); //本质上是this.value = new char[0];
4. //this.value = Arrays.copyOf(value, value.length);
String str = new String(char[] a);
5. String str = new String(char[] a,int startIndex,int count);
6. String str = new String(byte[] byte);

字符串拼接方式赋值的对比



总结:
1.常量与常量 的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要 其中一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值就在常量池中

 String s1 = "javaEE";String s2 = "hadoop";String s3 = "javaEEhadoop";String s4 = "javaEE" + "hadoop";String s5 = s1 + "hadoop";String s6 = "javaEE" + s2;String s7 = s1 + s2;System.out.println(s3 == s4);//trueSystem.out.println(s3 == s5);//falseSystem.out.println(s3 == s6);//falseSystem.out.println(s3 == s7);//falseSystem.out.println(s5 == s6);//falseSystem.out.println(s5 == s7);//falseSystem.out.println(s6 == s7);//falseString s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”System.out.println(s3 == s8);//trueString s1 = "javaEEhadoop";String s2 = "javaEE";String s3 = s2 + "hadoop";System.out.println(s1 == s3);//falsefinal String s4 = "javaEE";//s4:常量String s5 = s4 + "hadoop";System.out.println(s1 == s5);//true

字符串的不可变性

对字符串重新赋值时,需要重写指定内存区域赋值
String s1 = "abc";//字面量的定义方式
String s2 = "abc";//指向的是常量池中同一块内存空间
s1 = "hello";对现有的字符串进行连接操作时,也需要重新指定内存区域赋值
String s3 = "abc";s3 += "def";
System.out.println(s3);//abcdef
System.out.println(s2);当调用String的replace()方法修改指定字符或字符串时
String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println(s4);//abc
System.out.println(s5);//mbc

String 常用方法

boolean isEmpty();//return value.length == 0
boolean equals(Object obj)
boolean equalsIgnoreCase(String anotherString)
boolean endsWith(String suffix)
boolean startsWith(String prefix)
boolean startsWith(String prefix, int toffset)
boolean contains(CharSequence s)
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。int length()
char charAt(int index)
char[] toCharArray()
byte[] getBytes()String toLowerCase();
String toUpperCase()String concat(String str)//将指定字符串拼接到结尾。等价于 “+”
int compareTo(String anotherString)
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)int indexOf(String str)
int indexOf(String str,int fromIndex)int lastIndexOf(String str)
int lastIndexOf(String str,int fromIndex)String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

使用示例

  • isEmpty
 String s = "";String s1 = "   ";String s2 = null;System.out.println(s.isEmpty());//trueSystem.out.println(s1.isEmpty());//falseSystem.out.println(s2.isEmpty());//NullPointerException

扩展
如何判断字符串是否为空(null)或者是空字符串("")的方法

if(s == null || s.equals("")){}
if(s == null || s.length() == 0){}//效率最高
if(s == null || s.isEmpty()){}//1.6以上//commons lang/commons lang3
StringUtils.isEmpty(null) //true
StringUtils.isEmpty("")//true
StringUtils.isEmpty("   ")//falseStringUtils.isBlank(null) // true
StringUtils.isBlank("") // true
StringUtils.isBlank("   ") // true//Optional对null值处理
//有的时候我们获取的值虽然是String但所接受到的泛型不是String可能会出现如下情况
(inInfo.get("limit") == null || StringUtils.isBlank(inInfo.get("limit").toString()) //这里可能会NullPointerException
//还有一种处理null的方式如下: 如果是null 处理成 ""
String id = (String) Optional.ofNullable(inInfo.get("limit")).orElse("");

运算符

1.算术运算符: + - + - * / % (前)++ (后)++ (前)-- (后)-- +
2.赋值运算符:= += -= *= /= %=
3.比较运算符(关系运算符): == != > < >= <= instanceof
4.逻辑运算符:& && | || ! ^
5.位运算符:<< >> >>> & | ^ ~
6.三元运算符:(条件表达式)? 表达式1 : 表达式2


赋值运算符,运算的结果不会改变变量本身的数据类型

short s = 10;
//s = s + 1;//报错
s += 1

比较运算符的结果是 布尔类型

逻辑运算符


交换两个变量的值

int num1 = 10;
int num2 = 20;
//相加操作可能超出存储范围,只适用于数值类型
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;//只适用于数值类型
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;

流程控制

分支、循环
1.if-else条件判断结构
2.switch-case选择结构

2.1 for循环结构
2.2 while循环结构
2.3 do-while循环结构

1.if-else条件判断结构

结构一:
if(条件表达式){执行表达式
}
结构二:二选一
if(条件表达式){执行表达式1
}else{执行表达式2
}
结构三:n选一
if(条件表达式){执行表达式1
}else if(条件表达式){执行表达式2
}else if(条件表达式){执行表达式3
}
...
else{执行表达式n
}

1.2.说明:
1. else 结构是可选的。
2. 针对于条件表达式:
> 如果多个条件表达式之间是“互斥”关系(或没有交集的关系),
哪个判断和执行语句声明在上面还是下面,无所谓。
> 如果多个条件表达式之间有交集的关系,需要根据实际情况,
考虑清楚应该将哪个结构声明在上面。
> 如果多个条件表达式之间有包含的关系,通常情况下,
需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行了。
3. if-else结构是可以相互嵌套的。
4. 如果if-else结构中的执行语句只有一行时,对应的一对{}可以省略的。
但是,不建议大家省略。

2.switch-case选择结构

switch(表达式){case 常量1:执行语句1;//break;case 常量2:执行语句2;//break;...default:执行语句n;//break;
}

2.说明:
① 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。
当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构
末尾结束为止。
② break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
③ switch结构中的表达式,只能是如下的6种数据类型之一:
byte 、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
④ case 之后只能声明常量。不能声明范围。
⑤ break关键字是可选的。
⑥ default:相当于if-else结构中的else.
default结构是可选的,而且位置是灵活的。
3.如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
4.break在switch-case中是可选的
5.凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立

2.1 for循环结构

for(①;②;④){③
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

2.2 while循环结构

①
while(②){③;④;
}
执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
说明:写while循环千万小心不要丢了迭代条件。一旦丢了,就可能导致死循环!当步进表达式不参与循环体变量时③,④位置可以交换当步进表达式涉及循环体变量时需要注意不要交换位置

for和while循环总结:

  1. 开发中,基本上我们都会从for、while中进行选择,实现循环结构。
  2. for循环和while循环是可以相互转换的!
    区别:for循环和while循环的初始化条件部分的作用范围不同。
  3. 我们写程序,要避免出现死循环。

3.“无限循环”结构: while(true) 或 for(;

JavaSE----变量、String、运算符、流程控制相关推荐

  1. 02 . JS 运算符 + 流程控制

    算数运算符 ------------------------------------- console.log(1 + 1); // 2console.log(1 - 1); // 0console. ...

  2. 韩顺平 java笔记 第3讲 运算符 流程控制

    1.运算符 + 加   -减   *乘   /除   %取模   ++自加   --自减    += 左加   -=左减  /=左除   %=左取模 == 等于    > 大于   < 小 ...

  3. Java码农进阶之路~基本数据类型运算符流程控制-分支三目

    基本数据类型 首先先说下字节:字节(byte)是计算机信息技术用于计量存储容量的一种计量单位 通常情况下一字节由8个二进制位表示 0000 0000; 一个字节的取值范围为-128~127. 大家有兴 ...

  4. MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)

    1.系统变量 2.自定义变量 3.存储过程 4.函数 5.流程控制结构 1.系统变量 1.1系统变量的分类 系统变量:分为全局变量和会话变量 1.2系统变量的介绍 系统变量由系统提供,不是用户定义,属 ...

  5. java求偶数位之和,JavaSE (四)程序流程控制 -- if 、switch、for、while

    目录 前置: *. 从键盘读取数据: 1.导包 import java.util.Scanner; 2.创建对象 Scanner s = new Scanner(System.in); 3.调用方法 ...

  6. javaSE各阶段练习题--流程控制2

    1 打印倒直角三角形*************** package com.henu.four; /*** @author limengdong* @date 2019年7月18日* @classro ...

  7. javaSE各阶段练习题--流程控制

    1.(if 语句)键盘输入一个整数,表示一个人的年龄. 如果小于6 岁,则输出"儿童",  6 岁到13 岁,输出 "少儿":  14 岁到18 岁,输出 &q ...

  8. python循环从0到x_Python3 从零单排0_变量格式化输出流程控制循环

    1.Python从零单排简介 第一次接触python是前年,那次偶遇并没有发生什么有趣的故事.后来越发觉得计算机语言对于IT从事着来说是必不可少的技能,语言都不会可不敢妄称自己是IT行业从事者,所以后 ...

  9. Python基础——变量、常量、数字类型、四 列表list、五 字典dict、六 布尔bool、垃圾回收机制、用户交互、运算符、流程控制

    文章目录 变量 一 引入 一.什么是变量? 二.为什么要有变量? 三.怎么使用变量(先定义.后使用) 3.1.变量的定义与使用 3.2.变量名的命名规范 3.3.变量名的命名风格 3.4.变量值的三大 ...

  10. Java基础语法之变量、运算符、流程控制、数组和方法等基础语法

    变量.运算符.流程控制.数组和方法等基础语法.Java程序的执行流程,符合Java语法规则的程序. 1.1.1 Java初识 对Java进行简单介绍,Java程序如何执行,以及Java程序的结构. J ...

最新文章

  1. 将文件转成byte[]文件属组
  2. ArcGIS10.2 网络分析之路径分析(二)---构建网络数据集
  3. vue 打印出git提交信息_规范git项目提交并自动生成项目commit log
  4. git学习之创建版本库
  5. java 加密解密简单实现
  6. selenium之输出html测试报告
  7. python pyautogui_python模块------pyautogui
  8. for循环的一个复制算法(Java)
  9. openfire的搭建与运行(转)
  10. 10)Thymeleaf 标记选择器语法
  11. oracle 求班级平均分
  12. aqara (737) -(a俩)_绿米与万科合作?Aqara线下服务商500家,合作有保障
  13. 初中英语和计算机融合的教学案例,信息技术与中学英语整合课教学案例
  14. 2021必收藏!Java编程技巧之单元测试用例编写流程
  15. 图形变换之旋转变换公式推导
  16. 5个最佳团队交流应用程序
  17. 软文广告的写作技巧分析!
  18. vue省市区 下拉框实现
  19. File Struct 上传JPG格式图片变成tmp 服务器上传文件名字随机起
  20. win10内存占用率莫名其妙过高解决方法

热门文章

  1. 【报告分享】2019-2020广告主KOL营销市场盘点及趋势预测.pdf(附下载链接)
  2. 入门到精通!珍藏资源!VAE变分自编码器
  3. 导轮式机器人_轮式移动机器人导航控制与路径规划研究
  4. TaskBarProgress(任务栏进度条)
  5. python dict批量选择_这一定是你见过最全面的python重点
  6. java ref object_深入探讨 java.lang.ref 包
  7. configure 查找依赖库_由浅入深:Python 中如何实现自动导入缺失的库?
  8. mysql修改失败,mysql修改数据失败(是我的代码有问题吗)怎么解决?
  9. Spring Boot 文件上传功能实现与简单示例
  10. java.sql.SQLException: Protocol violation 解决方法