PH3-Java核心技术·卷1

文章目录

  • Java与C++不同
  • 第3章Java的基本程序设计结构
    • String的不可变性
            • 定义
            • 效率:
            • 不是所有字符串都共享
    • 空串和null串
            • 空串""
          • null串
          • `if (str != null && str.length)) != 0) //要先判null`
    • 读取输入
            • scanner
            • 密码输入
    • 格式化输出
            • System.out.printf()
    • 打印日期
    • 文件输入输出
            • scanner和printwriter
    • 命令行参数
    • 随机数
    • foreach
    • 多维数组
            • “不规则”数组

Java与C++不同

  1. Java中的所有函数都是某个类的方法(标准术语将其称为方法,而不是成员函数)。

  2. Java有8种基本类型,其中有4种整型(int, short, long, byte)、2种浮点类型、1种字符类型char和1种用于表示真值的boolean类型。Java没有任何无符号类型

  3. 在Java中,整型的范围与运行Java代码的机器无关。与此相反,C和C++程序会针对不同的处理器选择最为高效的整型,这样就会造成一 个在32位处理器上运行很好的C程序在16位系统上运行时却发生整数溢出

  4. 整型值和布尔值之间不能进行相互转换。
    5.在Java中,必须使用final定义常量。c++用const。

  5. 在C / C++中,不能保证>>是完成算术移位(扩展符号位)还是逻辑移位(填充0)。实现者可以选择其中更高效的任何一种做法。这意味着C/C++中>>运算符对于负数生成的结果可能会依赖于具体的实现。Java则消除了这种不确定性,>>>运算符会用0填充高位,与>>不同,它会用符号位填充高位。

  6. Java字符串不变性,C++可以改变字符串中单个字符。Java不是所有字符串都共享。

  7. C++的string类重载了==运算符检测字符串内容的相等性,可惜Java没有。

  8. Java一个字符串与一个非字符串的值进行拼接时,后者会转换成字符串;C++的+只能拼接两个字符串。

  9. 在C++中,在内层定义的变量会覆盖在外层定义的变量。可能带来编程错误,Java中不允许这样做。

  10. c++中switch是不支持string,float等的,只支持整形类(int,char,枚举等)。Java中switch还可以支持字符串字面量。

  11. Java程序员不能重载运算符。C++程序员可以自己重载运算符。Java语言的设计者确实为字符串的连接重载了 +运算符,但没有重载其他的运算符,也没有给Java程序员在自己的类中重载运算符的机会。

  12. c++中数组不能直接赋值,即int a[3]=b不允许。但array和vector可以。在Java中,允许将一个数组变量拷贝到另一个数组变量。这时,两个变量将引用同一个数组。值拷贝Arrays类的copyOf方法。

int[] luckyNumbers = smaUPrimes;
luckyNumbers[5] = 12; // now smaUP rimes [5] is also 12

第3章Java的基本程序设计结构

String的不可变性

String greeting = "hello";
如何把greeting变成“help”? c++中可以greeting[3]=p; greeting.resize(4);
java不能用上述方法,只能greeting = greeting.substring(0, 3) + "p!";

定义

由于不能修改Java字符串中的单个字符,所以在Java文档中将String类对象称为是不可变的(immutable)。

同数字3永远是数字3一样,字符串"Hello"永远包含字符H、e、l、I和o的代码单元序列。你不能修改这些值,不过,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以让原本存放3的数值变量改成存放4一样。
C++字符串是可修改的,即可以修改字符串中的单个字符。

效率:

过拼接"创建一个新字符串的效率确实不高。但编译器可以让字符串共享。 想象将各种字符串存放在公共的存储池中。
如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。 共享带来的高效率远远胜过于提取子串、拼接字符串所带来的低效率。因为大多数情况下都不会修改字符串。将来自于文件或键盘的单个字符或较短的字符串组装成字符串。为此,Java提供了一个单独的类,stringbuilder。

不是所有字符串都共享

内容相同的副本可能放置在不同的位置上。实际上只有字符串字面量是共享的,而+或substring等操作得到的字符串并不共享。

Stringgreeting="Hello";//initializegreetingtoastring
if(greeting=="Hello")...  //probablytrue,不是所有的字符串都共享;==判断地址是否相同

空串和null串

空串""

一个Java对象,有自己的串长度(0)和内容(空)。

 if(str.length))==0)if(str.equals(“”))
null串

表示目前没有任何对象与该变量关联
if(str==null)

if (str != null && str.length)) != 0) //要先判null

读取输入

scanner
package ph3;
import java.util.Scanner;
public class Test1 {
	public Test1() {
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String nextLine = "";
		if(scanner.hasNext())  
		nextLine = scanner.nextLine();
		String next = scanner.next();  //读取输人的下一个单词(以空格作为分隔符)
		int nextInt = scanner.nextInt();
		double nextDouble = scanner.nextDouble();  //可以把int自动转double
		System.out.println(nextLine);
		System.out.println(next);
		System.out.println(nextInt);
		System.out.println(nextDouble);
	}
}
密码输入

PH3-Java核心技术·卷1_第1张图片

格式化输出

System.out.printf()
public static void main(String[] args) {
		System.out.printf("%8.2f", 3333.333333333333333333333333); //一个前导的空格和7个字符: 3333.33
		System.out.println();
		System.out.printf("Hello, %s. Next year, you'll be %d","Marve",18);
		System.out.println();
		System.out.printf("%,10.2f",3333.33333333333);  // 多个标志
	}

PH3-Java核心技术·卷1_第2张图片

打印日期

public static void main(String[] args) {
		System.out.printf("%tc",new Date());
		System.out.println();
		System.out.printf("%1$s %2$tB %2$te, %2$tY", "Due date:", new Date());  //索引
		System.out.println();
		System.out.printf("%s %tB %, "Due date:", new Date()); // <标志
	}

索引: 1$在%s之间,表示用的是第一个索引。索引从1开始。
<标志:前面的参数将被再次使用

文件输入输出

scanner和printwriter
public static void main(String[] args) throws IOException {
		String dir = System.getProperty("user.dir");  //相对路径定位
		System.out.println(dir);
		
		Scanner in = new Scanner(new File("myfile.txt"), StandardCharsets.UTF_8);  
		 // myfile.txt必须要已经存在,否则抛IOException。	                                                                                  		
		 //new Scanner("myfile.txt", StandardCharsets.UTF_8)错误,必须new File("myfile.txt") 或Path.of("myfile.txt")
		System.out.println(in.nextLine());
		PrintWriter printWriter = new PrintWriter("myfile.txt", StandardCharsets.UTF_8);  // 可以自动创建myfile.txt文件
		printWriter.append("newappend");
		printWriter.flush();
		printWriter.println();
		printWriter.write("djhfal;jdflkdfnkjaehnfikhnj");
		System.out.println(in.nextLine());
		printWriter.close();
	}

命令行参数

在这里插入图片描述
PH3-Java核心技术·卷1_第3张图片

随机数

到从0到n-1之间的一个随机数。

int r = (int) (Math.random)) * n);

foreach

for (double[] row : a) //二维数组a
for (double value : row)
do something with value

多维数组

PH3-Java核心技术·卷1_第4张图片

“不规则”数组

PH3-Java核心技术·卷1_第5张图片

你可能感兴趣的:(java,jvm,数据结构)