【java(一)】——java的基本程序设计结构

断断续续学习Java的第一天
来自《Java核心技术 卷1》
你要为你说出的每句话,负责。特别是当你表情特别认真、好像真的在为对方着想的时候。此刻的想法
这里写图片描述

一个简单的Java应用程序

1、java中的所有函数都属于某个类的方法,因此java中的main方法必须有一个外壳类。Java中的main方法必须是静态的,关键字void表示没有返回值,如果main方法正常退出,那么Java应用程序的退出代码为0,表示成功地运行了程序。如果希望在终止程序时返回其他的代码,那就需要调用System.exit方法。
2、java的通用语法:object.method(parameters);

数据类型

3、4种整型数据:
这里写图片描述
Java中没有任何无符号unsigned形式的int、long、short或byte类型
4、两种浮点类型:4字节(后缀为 f f ,很少使用)、8字节(默认,无后缀)
这里写图片描述
NaN不是一个数字;浮点数值不适用于无法接收舍入误差的金融计算中,如2.01.10.89999999999999999999
5、字符串:char类型,Unicode编码
这里写图片描述
char类型用单引号括起来,如'A',它不等于用双引号括起来的"A",这是一个包含字符A的字符串。char类型的值可以表示为十六进制值,其范围从\u0000\uffff\u2122表示注册符号(TM),转移字符串\u可以出现在加引号的字符常量或子浮串之外。注释中的\u也一定要注意了,因为Unicode转义序列会在解析代码之前得到处理。尽量不要再程序中使用char类型,最好将字符串作为抽象数据类型处理
6、boolean类型:true和false,与c++不同,没有什么非0代表true,0代表false的说法

变量

7、不要再代码中出现$
8、注意!不要使用未初始化的变量
9、常量:使用关键字final,表示这个变量只能被赋值一次,一旦被赋值了,就不能再改了,注意常量你就使用全大写表示吧,好区分
10、static final表示一个类量,因为有时候希望某个常量可以在一个类的多个方法中使用,如果再被声明为public,那这个常量还可以在其他类中被使用

运算符

11、 整数被0除会产生一个异常,但是浮点数被0除会得到一个无穷大或NaN的结果【这就是区别】
12、Math.pow()的两个参数是double类型,返回值也是double。负数求余得到的是-1.
这里写图片描述
13、数值类型的转换,低字节的转换为高字节的
这里写图片描述
14、强制类型转换:高字节强制转换为低字节。有一个函数Math.round,返回的类型的long型
15、&&||的“短路”方式求值,前面的已经能直到整个表达式的值,后面的就不需要计算了,&|也可以的得到一个布尔值,但是不采用短路方式
16、<<>>是左移和右移的位运算符,移位运算符需要对右操作数进行模32运算,如1<<35等同于1<<3

String类

17、Java允许使用+号拼接两个字符串,当一个字符串与一个非字符串的值进行拼接时,后者被转换为字符串。如果需要把多个字符串放在一起,同时用一个特定的字符隔开,可以使用静态join方法String.join("特定字符串","first","second","……");
18、各种字符串存放在公共的存储池中,字符串变量指向存储池中相应的位置,如果赋值一个字符串变量,原始字符串与复制的字符串共享相同的内存中的字符
19、检测字符串是否相等:一定!一定!注意!使用equals方法检测,而不是用==符号,这个符号只能检测这两个字符串是否指向同一内存,不能比较内容是否相同。但是字符串的情况是,有可能内容相同的多个字符串的拷贝放置在不同的位置上。实际上,只有字符串常量是共享的,而+或者substring等操作产生的结果并不是共享的。当然也可以使用compareTo,但还是用equals好了
20、空串不是Null串,空串""是长度为0的字符串,检测是否空串:if(str.length()==0)或者if(str.equals("")),空串是有长度(0)和内容(空)的,是一个Java对象。单数Null串,表示的是目前没有任何对象与这个变量关联。if(str==null)。要检查一个字符串既不是null也不是空串if(str!=null&&str.length()!=0)一定要先检测是否null,不可以对一个null调用函数,它都不是一个对象呢
21、大部分Unicode码点(字符)使用一个代码单元就可以表示,辅助字符需要一对代码单元。length方法返回的是代码单元数量,而实际长度是码点数量,可以调用codePointCount函数,调用charAt将返回位置n的代码单元。要想得到第i个码点,应该调用offsetByCodePoints(0,i);
22、String API【手敲一下,加点印象】

函数原型作用
int codePointAt(int index)返回从给定位置开始的码点
char charAt(int index)返回给定位置的代码单元,一般不需要调用这个方法
int offsetByCodePoints(int startIndex,int cpCount)返回startIndex代码点开始,位移cpCount后的码点索引
int compareTo(String other)按照字典顺序,如果字符串位于other之前,返回一个负数;之后,正数;相等,0
IntStream codePonints()将这个字符串的码点作为一个流返回。调用toArray将它们放在一个数组中
new String(int[] codePoints,int offset,int count)用数组从offset开始的count个码点构造一个字符串
boolean equals(Object other)相等,返回true
boolean equalsIgnoreCase(String other)相等(忽略大小写),返回true
int indexOf(String/int[,int fromIndex])返回与字符串或代码点匹配的第一个子串的开始位置
int lastIndexOf()与上面一个功能类似,只不过这一个是返回最后一个子串的位置
int length()返回字符串的长度
int codePointCount(int start,int end)返回start和end-1之间的代码点的数量
String subString([])返回一个新的字符串
String trim()返回一个而删除了原始字符串头部和尾部空格的字符串
String join()返回新字符串,用给定的界定符链接所有元素

23、构建字符串:使用StringBuilder类

StringBuilder builder=new StringBuilder();
builder.append(ch);
builder.append(str);
String completedStr=builder.toString();

24、面试题:请解释String、StringBuffer、StringBuilder 的区别?
⚫String类的内容一旦声明则不可改变,StringBuffer 和 StringBuilder 的内容
可以改变。
⚫StringBuffer 类中提供的方法都是同步方法,属于安全的线程操作;而
Stringbuilder 类中的方法都是异步方法,属于非线程安全的操作。
日后在开发中见到字符串的应用,不需要思考 95%使用 String 类,只有在需要频繁修改的时候才需要使用 StringBuffer 或者 StringBuilder。

输入输出

25、通过控制台输入步骤:
构造一个Scanner对象,并与“标准输入流”相关联:Scanner in=new Scanner(System.in);
使用Scanner类的各种方法实现输入操作:in.nextline();或者读取intin.nextInt();
26、对于密码的 读取一般使用Console类,对于任何一个通过控制台窗口启动的程序,都可以使用Console对象。
27、文件输入和输出

//读取文件
Scanner in=new Scanner(Path.get("文件路径+文件名","UTF-8"));
//写入文件
PrintWriter out=new PrintWriter("文件名","UTF-8");
//以下只是将字符串解释为数据,并不是文件名
Scanner in=new Scanner("文件名");

控制流程

28、Java不允许在嵌套的两个块中声明同名的变量,与C++不同
29、注意double类型的比较,在《数据结构与算法》中有提到
30、对于switch,尽量不要使用,如果使用可以在编译时加上javac -Xlint:fallthrough Test.java这样在编译时,如果发现某个case后面缺少break,编译器就会发出警告
31、case可以是char、String、byte、short、int的常量表达式
32、Java没有允许程序员对运算符进行重载
33、所以关于大数值的计算有如下图
这里写图片描述

数组

34、声明一个数组:int[] a;没有初始化
35、创建数组:int[] a=new int[100];
36、不初始化的时候,默认数字型为0,boolean型为false,对象(String)为null
37、一旦创建了数组,就不能再改变它的大小,需要扩展数组大小最好使用数组列表
38、增强版的for语句for each,如for(int ele:elements)可以遍历数组中的每个元素,不需要使用下标值,不必为起始值和终止值操心。
40、有个更简单的打印数组中所有值的方式:Arrays.toString(a),其中a是数组
41、数组长度为0与null是不一样的
42、数组拷贝:int[] copyArray=Arrays.copyOf(originArray,originArray.length);,第二个参数是新数组的长度,这样的方式通常用来增加数组大小
Java中[]运算符被预定义为检查数组边界,而且没有指针运算,即不能通过对数组名+1到达下一个元素【与C++的区别】
这里写图片描述
43、命令行参数:arg[0]是第一个参数变量,和C++不一样,Java中的命令行参数不包括文件名
44、数组排序:Arrays.sort(数组名)
45、for each对于二维数组:
这里写图片描述
另外,可以使用System.out.println(Arrays.deepToString(数组名));打印出一个二维数组的数据元素列表,打印出来的格式是:[[ ],[ ],[ ]]
46、Java特别:Java其实没有多维数组,只有一维数组,多维数组被解释为“数组的数组”,不是连续存放的内存单元,内存中的存放如下:
这里写图片描述

public class LotteryArray {
    public static void main(String[] args) {
        final int MAX=10;
        int[][] odds=new int[MAX+1][];
        //声明每行格子的列数
        for(int n=0;n<=MAX;n++)
            odds[n]=new int[n+1];

        for(int n=0;n<odds.length;n++)
            for(int k=0;k<odds[n].length;k++) {
                int lotteryOdds=1;
                for(int i=1;i<=k;i++)
                    lotteryOdds=lotteryOdds*(n-i+1)/i;
                odds[n][k]=lotteryOdds;
            }
        for(int[] row:odds) {
            for(int odd:row)
                System.out.printf("%-5d",odd);
            System.out.println();
        }
    }
}

运行结果:
这里写图片描述

附:垃圾回收机制

47、请解释什么叫 GC,如何处理?
⚫ GC(Garbage Collector)垃圾收集器,指的是释放无用的内存空间;
⚫ GC 会由系统不定期的进行自动的回收,或者调用 Runtime 类中的 gc()方法手
工回收。
实际上 Runtime 类还有一个更加有意思的功能,就是他可以调用本机的可执行程序,并且创建进程。
垃圾回收机制—参考博客:https://blog.csdn.net/zsuguangh/article/details/6429592

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值