3.4_[Java 常量变量/数据类型/运算符]-数据类型转换与比较等扩展知识

##################################################

目录

数据类型转换

自动转换/隐式转换/由小转大/放大转换

强制数据类型转换/大变小转换

数值/字符/字符串 比较

数据初始值

数值比较

字符比较

字符串比较

equals 方法

isEmpty 方法

获取字符串长度

length 方法

循环遍历计数字符串长度

数组越界访问异常处理以及清除异常报错方式

处理异常

清除异常

程序示例

从键盘获取数据进行比较

测试:变量+表达式+输入输出+字符串处理

深入理解字符串比较

一个稍微复杂的程序 小白勿看!!!


##################################################

数据类型转换

——————————

自动转换/隐式转换/由小转大/放大转换

        例如 必须将一个小数与一个整数的变量相加!!?
        不同类型的数据能运算吗?

        如果一个操作数为 double 类型
        则整个表达式提升为 double 类型
        比如 int 和 double 类型相加 结果一定是 double 类型!

        将一种类型的变量赋给另一种类型的变量时 就会发生自动类型转换

        这就是隐式数据类型转换

        自动数据类型转换

        隐式数据类型转换

        由小变大转换

        例如:

int a = 100;
double b = a;

        int 类型隐式子的转换成 double 类型变量
        但是这种转换并不是永远无条件触发的

        想要自动转换类型 需要满足的条件:

两种类型要兼容        例如数值类型整数类型和浮点型互相兼容
目标类型大于源类型        例如 double 类型比 int 变量类型分配的空间宽度足够储存 int 类型变量 因此 也可以把 int 转换 double 称之为放大转换

——————————

强制数据类型转换/大变小转换

        将 double 类型赋给一个 int 变量类型

        由于不能进行放大转换 只能强制转换

        语法如下:

(数据类型)表达式

        在变量面前加上括号 括号中的类型就是要强制转换成的类型!

        例如:

double d = 3.1415926;
int b = (int)d;    /* b = 3 */

##################################################

数值/字符/字符串 比较

——————————

数据初始值

        在定义变量时 没有给属性赋初始值 所以是默认值
        这就是默认值 Java 数据类型的默认值:

int		0
double		0.0
char		'\u0000'
boolean		false
String		null

        char 类型的

'\0'

'\u0000'

         是一样的一样啦!
        String 的 null 就是表示空 但并不等价于

" "

""

——————————

数值比较

        我们知道了数值直接比较可以这样来判断相等不相等:

数值_1 == 数值_2

数值_1 != 数值_2

——————————

字符比较

        char 的本质还是表示编码的数字

        所以可以使用 == 或 != 来进行数值比较

——————————

字符串比较

%%%%%

equals 方法

        字符串之间呢?
        要判断相同不相同 使用 equals 方法

        判断一个字符串变量是不是指定的值示例:

变量.equals("值")

        例如 对比一下字符串变量 name 是不是 李恰恰:

name.equals("李恰恰")

        另外 比较字符串 是不是空值:

字符串 == null
字符串 != null
字符串.equals("")
"".equals(字符串)

        equals 方法返回值也是布尔值
        true 表示相同 false 表示不同

        其实是不推荐比较是否等于 null 来判断是否为空的
        因为 例如:

String A = "";

        这种情况下 虽然没有赋值 却会表示成

" "

        A 虽然没有值 却也不等于 null
        我们由此可以看出

==

        这个符号 是用来判断路径是否相同
        null 不就是空指针嘛!!?

        所以我们要么声明变量后不赋值:

String A;

        要么就赶紧赋一个初始值:

String A = "2333";

        免去

""
" "

        判断失误的情况!

%%%%%

isEmpty 方法

        用法:

字符串.isEmpty()

        这个 isEmpty() 是在 Java SE 6.0 才提供的
        效果效率也是很棒的! 返回值也是布尔值
        true/的确是空的 false/不为空

##################################################

获取字符串长度

——————————

length 方法

        我们还可以得到字符串的长度 就是一共保存了几个字符 用法:

字符串.length()

        返回一个 int 数值表示字符串长度

        因为字符串就是字符数组嘛 就是获取里面的字符个数

        长度为 0 则表示 变量中储存的字符串为空

——————————

循环遍历计数字符串长度

        既然字符串都是数组 那么能不能遍历数组计数字符数呢?

        诶你还别说 真的可以 只不过会发生异常

        其实不处理异常也没关系 后面会給出处理异常和清楚异常显示的方法!

        不处理异常:

import java.util.Scanner;

public class test {

	public static void main(String[] args) {

		int k = 1;
		String str;

		Scanner sc = new Scanner ( System.in );
		System.out.printf ( "请输入字符串 <<< " );
		str = sc.nextLine();

		for ( int i = 0; str.charAt(i) != '\0'; i ++, k ++ )
			System.out.printf ( "[%d] >>> [%c]\n", k, str.charAt(i) );
		System.out.printf ( "输入的字符串长度为 [%d]", (k - 1) );
	}
}

        执行结果:

C:\Users\byme\javaTest>javac test.java

C:\Users\byme\javaTest>java test
请输入字符串 <<< 我爱你
[1] >>> [我]
[2] >>> [爱]
[3] >>> [你]
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 3
        at java.lang.String.charAt(Unknown Source)
        at test.main(test.java:14)

C:\Users\byme\javaTest>

——————————

数组越界访问异常处理以及清除异常报错方式

%%%%%

处理异常

        code:

import java.util.Scanner;
import java.io.IOException;    /* 导包 */

public class test {

	public static void main(String[] args) {

		int k = 1;
		String str;

		Scanner sc = new Scanner ( System.in );
		System.out.printf ( "请输入字符串 <<< " );
		str = sc.nextLine();

		try {

			for ( int i = 0, end = str.length(); ; i ++, k ++ ) {
			/* end 是 str 的长度 这边为了处理异常用一下 length 没有循环条件 在循环体设置退出 */

				if ( i >= end )
				/* 如果越界就显示详细信息 */
					throw new ArrayIndexOutOfBoundsException ( "\n\t***当前要访问下标为 [" + (i + 1) + "] 且数组长度为 [" + end + "] 发生数组越界异常***");
				else
				/* 没有越界 正常运行 */
					if (str.charAt(i) == '\0')
					/* 如果字符等于结束符就退出循环 */
						break;
					else
					/* 取得字符不为空 输出下标和对应值 */
						System.out.printf ( "[%d] >>> [%c]\n", k, str.charAt(i) );
			}
		} catch ( ArrayIndexOutOfBoundsException e ) {

			System.out.println ("\n[发生异常]———————————————————————————————————");
			System.out.println ( e.toString() );
        	} finally {

			System.out.println ( "\n... 请处理越界异常!" );
			System.out.println ("————————————————————————————————————————");

			System.out.printf ( "输入的字符串长度为 [%d]", (k - 1) );
		}
	}
}

        demo:


C:\Users\byme\javaTest>javac test.java

C:\Users\byme\javaTest>java test
请输入字符串 <<< abc123[]'/.!
[1] >>> [a]
[2] >>> [b]
[3] >>> [c]
[4] >>> [1]
[5] >>> [2]
[6] >>> [3]
[7] >>> [[]
[8] >>> []]
[9] >>> [']
[10] >>> [/]
[11] >>> [.]
[12] >>> [!]

[发生异常]———————————————————————————————————

java.lang.ArrayIndexOutOfBoundsException:
        ***当前要访问下标为 [13] 且数组长度为 [12] 发生数组越界异常***

... 请处理越界异常!
————————————————————————————————————————

输入的字符串长度为 [12]
C:\Users\byme\javaTest>java test
请输入字符串 <<< 崽崽喜欢你
[1] >>> [崽]
[2] >>> [崽]
[3] >>> [喜]
[4] >>> [欢]
[5] >>> [你]

[发生异常]———————————————————————————————————

java.lang.ArrayIndexOutOfBoundsException:
        ***当前要访问下标为 [6] 且数组长度为 [5] 发生数组越界异常***

... 请处理越界异常!
————————————————————————————————————————

输入的字符串长度为 [5]
C:\Users\byme\javaTest>

%%%%%

清除异常

        code:

import java.util.Scanner;
import java.io.IOException;

public class test {

	public static void main(String[] args) {

		int k = 1;
		String str;

		Scanner sc = new Scanner ( System.in );
		System.out.printf ( "请输入字符串 <<< " );
		str = sc.nextLine();

		try {

			for ( int i = 0, end = str.length(); ; i ++, k ++ ) {

				if ( i >= end )
					throw new ArrayIndexOutOfBoundsException ();
				else
					if (str.charAt(i) == '\0')
						break;
					else
						System.out.printf ( "[%d] >>> [%c]\n", k, str.charAt(i) );
			}
		} catch ( ArrayIndexOutOfBoundsException e ) {
        	} finally {
		}

		System.out.printf ( "输入的字符串长度为 [%d]", (k - 1) );
	}
}

        demo:

C:\Users\byme\javaTest>javac test.java

C:\Users\byme\javaTest>java test
请输入字符串 <<< 12345678910
[1] >>> [1]
[2] >>> [2]
[3] >>> [3]
[4] >>> [4]
[5] >>> [5]
[6] >>> [6]
[7] >>> [7]
[8] >>> [8]
[9] >>> [9]
[10] >>> [1]
[11] >>> [0]
输入的字符串长度为 [11]
C:\Users\byme\javaTest>

##################################################

程序示例

——————————

从键盘获取数据进行比较

        从键盘获取分数
        比较数据,输出结果

        code:

import java.util.Scanner;	/* 控制台输入 引入 java.util.Scanner 包 */

public class test {

	public static void main(String[] args) {

		int HeGe = 90;	/* 合格分数 */
		boolean yes;

		Scanner input = new Scanner(System.in);    /* Java 的一种输入方法 */
		System.out.print("请输入您的成绩:");    /* 交互信息 */
		int sc = input.nextInt();    /* 获取分数 储存在变量 */
		yes = sc > HeGe ;    /* 判断是否合格 */

		/* 回显信息 */
		if ( yes )
			System.out.println ( "[YES]" );
		else
			System.out.println ( "[NO]" );
	}
}

        demo:

C:\Users\byme\javaTest>javac test.java

C:\Users\byme\javaTest>java test
请输入您的成绩:100
[YES]

C:\Users\byme\javaTest>java test
请输入您的成绩:90
[NO]

C:\Users\byme\javaTest>

——————————

测试:变量+表达式+输入输出+字符串处理

        分别测试了:

null 空值 ==/equals 对比
字符串长度 length 判断
isEmpty 是不是空?

        code:

import java.util.Scanner;

public class test {

	public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		System.out.print ( "A <<< " );
		String A = input.next();
		System.out.print ( "B <<< " );
		String B = input.next();
		System.out.print ( "C <<< " );
		String C = input.next();

		if ( A != null )
			System.out.println ( "A 不为空\tA >>> " + A );
		if ( ! B.equals(null) )
			System.out.println ( "B 不为空\tB >>> " + B );
		if ( ! C.isEmpty() ) {

			System.out.println ( "C 不为空\tC >>> " + C );

			if ( (A.length() > B.length()) && (A.length() != 0) && (B.length() != 0) )
				System.out.println ( "A > B \t\tA >>> "  + A );
			else if ( (A.length() < B.length()) && (A.length() != 0) && (B.length() != 0) )
				System.out.println ( "A < B \t\tB >>> "  + B );
		}
	}
}

        demo:


C:\Users\byme\javaTest>javac test.java

C:\Users\byme\javaTest>java test
A <<< 2
B <<< 23
C <<< 233
A 不为空        A >>> 2
B 不为空        B >>> 23
C 不为空        C >>> 233
A < B           B >>> 23

C:\Users\byme\javaTest>java test
A <<< 233
B <<< 23
C <<< 2
A 不为空        A >>> 233
B 不为空        B >>> 23
C 不为空        C >>> 2
A > B           A >>> 233

C:\Users\byme\javaTest>java test
A <<< 2
B <<< 233
C <<< 23
A 不为空        A >>> 2
B 不为空        B >>> 233
C 不为空        C >>> 23
A < B           B >>> 233

C:\Users\byme\javaTest>java test
A <<< 233
B <<< 2
C <<< 23
A 不为空        A >>> 233
B 不为空        B >>> 2
C 不为空        C >>> 23
A > B           A >>> 233

C:\Users\byme\javaTest>

        如果你想挑战一下自己 可以加一个判断是否相等的 if 分支

##################################################

深入理解字符串比较

——————————

一个稍微复杂的程序 小白勿看!!!

        以前 我心里是有点看不起那些使用诸如像

A == null

        这样用 相等运算符和空值 搭配使用的

        直到 我看到了这种测试方法返回值的用法

        关于这个程序不用深入 看看就好

        当然 如果你能现在就学会调用自己的方法或者能看懂一点方法的使用 我会很欣慰的!

        code:

public class test {

	public static void nullPoint_1() {
	/* 这样声明的方法 我们不调用 就不会执行 系统只认 main 方法! */

		String test = null;

		try {

			if ( test.equals( null ) )
				System.out.println ( "test is null !" );
		} catch ( NullPointerException e ) {

			System.out.println ( "test.equals(null) >>> [" + e + "]" );
		}
	}

	public static void nullPoint_2() {

		String test = null;

		try {

			if ( test.length() == 0 )
				System.out.println ( "test is null !" );
		} catch ( NullPointerException e ) {

			System.out.println ( "test.length() == 0 >>> [" + e + "]" );
		}
	}

	public static void nullPoint_3() {

		String test = null;

		try {

			if ( test.isEmpty() ) {

				System.out.println ( "test is null !" );
			}
		} catch ( NullPointerException e ) {

			System.out.println ( "test.isEmpty() >>> [" + e + "]" );
		}
	}

	public static void nullPoint_4() {

		String test = null;

		try {

			if ( test.equals("") ) {

				System.out.println ( "test is null !" );
			} 
		} catch ( NullPointerException e ) {

			System.out.println ( "test.equals(\"\") >>> [" + e + "]" );
		}
	}

	public static void error_1() {

		String test = null;

		if ( "".equals( test ) )
			System.out.println ( "test = null, \"\".equals(test) >>> true" );
		else
			System.out.println ( "test = null, \"\".equals(test) >>> false" );
	}

	public static void error_2() {

		String test = null;

		if ( test == "" ) {

			System.out.println ( "test = null, test == \"\" >>> true" );
		} else {

			System.out.println ( "test = null, test == \"\" >>> false" );
		}
	}

	public static void right_1() {

		String test = null;

		if ( test == null )
			System.out.println ( "test = null, test == null >>> true" );
	}

	public static void right_2() {

		String test = "not null";

		if ( test.equals( null ) )
			System.out.println ( "test is null" );
		if ( test.length() <= 0 )
			System.out.println ( "test is null" );
		if ( test.isEmpty() )
			System.out.println ( "test is null" );
		if ( test == null )
			System.out.println ( "test is null" );
		if ( test != null && !test.isEmpty() && test.length() > 0 && ! test.equals( null ) )
			System.out.println ( "test >>> " + test );
	}

	public static void right_3() {

		String test = "";

		if ( test.equals( "" ) && test == "" ) {

			System.out.println ( "test = \"\"" );
		}
	}


	public static void main(String[] args) {
	/* 程序从这里开始 */

		/*     挨个调用 语法格式:
		 * 类名.方法名(参数列表);
		 */
		test.nullPoint_1 ();
		nullPoint_2 ();	/* 因为在同一个类中 所以可以直接调用 */
		nullPoint_3 ();
		test.nullPoint_4 ();
		error_1 ();
		test.error_2 ();
		right_1 ();
		test.right_2 ();
		test.right_3 ();
	}
}

        demo:

C:\Users\byme\javaTest>javac test.java

C:\Users\byme\javaTest>java test
test.equals(null) >>> [java.lang.NullPointerException]
test.length() == 0 >>> [java.lang.NullPointerException]
test.isEmpty() >>> [java.lang.NullPointerException]
test.equals("") >>> [java.lang.NullPointerException]
test = null, "".equals(test) >>> false
test = null, test == "" >>> false
test = null, test == null >>> true
test >>> not null
test = ""

C:\Users\byme\javaTest>

        可以看到 当字符串为 null 时用这三个方法都会抛出异常:

equals()
length()
isEmpty()

        而与这种空值

""

        进行比较时,会出现判断失误 所以可以使用

if ( test == null )

        来判断,简单直接!
        注意当这种字符串空值时:

""

        与 null 不同,不是空指针
        得与

" "

        比较
        字符串为空

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃吹

呜呜呜没钱钱吃饭了……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值