Java中的所有函数都是某个类的方法(标准术语将其称为方法,而不是成员函数)。
Java有8种基本类型,其中有4种整型(int, short, long, byte)、2种浮点类型、1种字符类型char和1种用于表示真值的boolean类型。Java没有任何无符号类型。
在Java中,整型的范围与运行Java代码的机器无关。与此相反,C和C++程序会针对不同的处理器选择最为高效的整型,这样就会造成一 个在32位处理器上运行很好的C程序在16位系统上运行时却发生整数溢出
整型值和布尔值之间不能进行相互转换。
5.在Java中,必须使用final定义常量。c++用const。
在C / C++中,不能保证>>是完成算术移位(扩展符号位)还是逻辑移位(填充0)。实现者可以选择其中更高效的任何一种做法。这意味着C/C++中>>运算符对于负数生成的结果可能会依赖于具体的实现。Java则消除了这种不确定性,>>>运算符会用0填充高位,与>>不同,它会用符号位填充高位。
Java字符串不变性,C++可以改变字符串中单个字符。Java不是所有字符串都共享。
C++的string类重载了==运算符检测字符串内容的相等性,可惜Java没有。
Java一个字符串与一个非字符串的值进行拼接时,后者会转换成字符串;C++的+只能拼接两个字符串。
在C++中,在内层定义的变量会覆盖在外层定义的变量。可能带来编程错误,Java中不允许这样做。
c++中switch是不支持string,float等的,只支持整形类(int,char,枚举等)。Java中switch还可以支持字符串字面量。
Java程序员不能重载运算符。C++程序员可以自己重载运算符。Java语言的设计者确实为字符串的连接重载了 +运算符,但没有重载其他的运算符,也没有给Java程序员在自己的类中重载运算符的机会。
c++中数组不能直接赋值,即int a[3]=b不允许。但array和vector可以。在Java中,允许将一个数组变量拷贝到另一个数组变量。这时,两个变量将引用同一个数组。值拷贝Arrays类的copyOf方法。
int[] luckyNumbers = smaUPrimes;
luckyNumbers[5] = 12; // now smaUP rimes [5] is also 12
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,不是所有的字符串都共享;==判断地址是否相同
一个Java对象,有自己的串长度(0)和内容(空)。
if(str.length))==0)
或
if(str.equals(“”))
表示目前没有任何对象与该变量关联
if(str==null)
if (str != null && str.length)) != 0) //要先判null
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);
}
}
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); // 多个标志
}
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开始。
<标志:前面的参数将被再次使用
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();
}
到从0到n-1之间的一个随机数。
int r = (int) (Math.random)) * n);
for (double[] row : a) //二维数组a
for (double value : row)
do something with value