coreJava 摘记-基础

java 内存关系学习: https://blog.csdn.net/laomo_bible/article/details/83067810

https://blog.csdn.net/sunming0129/article/details/80099092

java发展:

java术语:

jar cvf hello.jar hello 利用hello目录创建hello.jar包
jar xvf hello.jar解压hello.jar至当前目录
构建并运行 applet
javac RoadApplet.java
jar cvfm RoadApplet.jar RoadApplet.mf *.dass
appletviewer RoadApplet.htnil

数 据 类 型

共有8种基本类型( primitive type ), 其中有 4 种整型、2 种浮点类型、 1 种用于表示 Unicode 编码的字符单元的字符类型 char和 1 种用于表示真值的 boolean 类型。长整型数值有一个后缀L或l ( 如 4000000000L.) 十六进制数值有一个前缀 0x 或 0X (如OxCAFEL 八进制有一个前缀0,例如010 对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。从 Java 7 开始,加上前缀 0b 或 0B 就可以写二进制。例如,0blOO丨就是9。另外同样是从 Java 7 开始,还可以为数字字面量加下划线,如用 1_000_000表示一百万。这些下划线只是为让人更易读.Java 编译器会去除这些下划线.

if (x = Double.NaN)// is never true所有“ 非数值” 的值都认为是不相同的。然而,可以使用 Double.isNaN 方法:
if (Double.isNaN(x)) // check whether x is "not a number"
在二进制系统中无法精确地表示分数 1/10

在 C++ 中,数值甚至指针可以代替boolean值.值0相当于布尔值 false, 非0 值相当于布尔值 true.
尽管 $ 是一个合法的 Java 字符, 但不要在你自己的代码中使用这个字符。它只用
在 Java 编译器或其他工具生成的名字中。

在 C++ 中,数值甚至指针可以代替boolean值.值0相当于布尔值 false, 非0 值相当于布尔值 true.

尽管 $ 是一个合法的 Java 字符, 但不要在你自己的代码中使用这个字符。它只用在 Java 编译器或其他工具生成的名字中。

关键字 final 表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写

需要注意, 整数被 0 除将会产生一个异常, 而浮点数被 0 除将会得到无穷大或 NaN 结果

注释:double类型使用 64 位存储一个数值, 而有些处理器使用 80 位浮点寄存器这些寄存器增加了中间过程的计算精度. 例如, 以下运算:double w = x * y / z;很多 Inte丨处理器计算 x * y,并且将结果存储在 80 位的寄存器中, 再除以 z 并将结果截断为 64 位„ 这样可以得到一个更加精确的计算结果,并且还能够避免产生指数溢出。但是, 这个结果可能与始终在 64 位机器上计算的结果不一样。
在默认情况下, 虚拟机设计者允许对中间计算结果采用扩展的精度。但是, 对于使用 strictfj) 关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。例如,可以把 main 方法标记为: public static strictfp void main(String[] args)
于是,在 main 方法中的所有指令都将使用严格的浮点计算。如果将一个类标记为strictfp, 这个类中的所有方法都要使用严格的浮点计算
对大多数程序来说, 浮点溢出不属于大向题。在本书中, 将不使用 strictfp 关键字。

自增与自减运算符
int m = 7;
int n = 7;
int a = 2 * ++m; // now a is 16, m is 8
int b = 2 * n++; // now b is 14, n is 8

位运算符:不过 &和丨运算符也会得到一个布尔值。这些运算符与 && 和丨丨运算符很类似,不过 & 和丨运算符不采用“ 短路” 方式来求值, 也就是说,得到计算结果之前两个操作数都需要计算

x<<y 相当于 x*2y ;x>>y相当于x/2y   
从计算速度上讲,移位运算要比算术运算快。如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义

不可变字符串有一个优点:编译器可以让字符串共享。(字符串常量对象存放在常量池中,字符串是不可变的,但是有字符串共享池
一定不要使用==运算符检测两个字符串是否相等。 这个运算符只能够确定两个字串是否放置在同一个位置上:如果虚拟机始终将相同的字符串共享, 就可以使用==运算符检测是否相等。但实际上只有字符串常量是共享的,而 + 或 substring 等操作产生的结果并不是共享的

码点与代码单元(码点-Unicode数字 代码单元-Unicode对应的char)
Java字符串由char值序列组成。char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示.
String str = "Hello";
int[] codePoints = str.codePoints().toArray();//查看字符串的每一个码点
String hell = new String(codePoints, 0, codePoints.length);//码点数组转字符串

int compareTo(String other)unicode值
按照字典顺序,如果字符串位于 other 之前, 返回一个负数;如果字符串位于 other 之
后,返回一个正数;如果两个字符串相等,返回 0

String join(CharSequence delimiter, CharSequence ... elements ) 8
返回一个新字符串, 用给定的定界符连接所有元素。new String().join("**", str,str1,str2)

在 JDK5.0 中引入 StringBuilder(多线程中不安全) 类。 这个类的前身是 StringBuffer, 其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作, 如果所有字符串在一个单线程中编辑 (通常都是这样),则应该用 StringBuilder 替代它。这两个类的 API是相同的

格式化输出(System.out.printf)
每一个以 % 字符开始的格式说明符都用相应的参数替换。 格式说明符尾部的转换符将指示被格式化的数值类型:f 表示浮点数,s 表示字符串,d 表示十进制整数。可以使用静态的 String.format 方法创建一个格式化的字符串:
String message = String.format("Hello, %s. Next year, you'll be %d", name , age);

Biglnteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算.
RoundingMode(舍入模式)是一个枚举类:
         UP(远离零方向舍入 <- 0 ->),
         DOWN(向零方向舍入-> 0 <-),
         CEILING(-> 0 ->),
         FLOOR(<- 0 <-),
         HALF_UP(通常讲的四舍五入),
         HALF_DOWN(通常讲的五舍六入),
         HALF_EVEN(银行家舍入法),
         UNNECESSARY(计算结果是精确的,不需要舍入,否则抛出 ArithmeticException)

Arrays.copyOf();通常可以用来增加数组的大小.类型为 int、 long、 short、 char、 byte、boolean、 float 或 double 的数组。
Arrays.sort(a)这个方法使用了优化的快速排序算法.
Arrays 类的 binarySearch()方法:使用二分搜索法来搜索指定的数组,以获得指定对象。该方法返回要搜索元素的索引值。注意:使用 binarySearch() 方法前,必须先用 Arrays.sort() 方法排序,否则结果可能是非预期值。
1.搜索值不是数组元素,且在数组范围内,从1开始计数,得“ - 插入点索引值”;
2.搜索值是数组元素,从0开始计数,得搜索值的索引值;
3.搜索值不是数组元素,且大于数组内元素,索引值为 – (length + 1);
4.搜索值不是数组元素,且小于数组内元素,索引值为 – 1。
        int arr [] =newint[]{1,3,4,5,8,9};
        Arrays.sort(arr);
        int index1 = Arrays.binarySearch(arr,6);//-5
        int index2 = Arrays.binarySearch(arr,4);//2
        int index3 = Arrays.binarySearch(arr,0);// -1
        int index4 = Arrays.binarySearch(arr,10);//-7

面向对象程序设计(简称 OOP)

封装\实例域\方法\继承
类之间的关系
•依赖(uses-a)一个类的方法操纵另一个类的对象(Order与Account)尽可能地将相互依赖的类减至最少 耦合度
•聚合(has-a)Order对象包含一些Item项
•继承(is-a)

并不是所有的类都具有面向对象特征.如Math类,Math类只封装了功能,它不需要也不必隐藏数据.他的构造器是private的,没有实例.
任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用

如果将一个方法应用于一个值为null的对象上,那么就会产生运行时错误(null表明这个对象变量目前没有引用任何对象)

局部变量不会自动地初始化为null,而必须通过调用new或将它们设置为null进行初始化(系统不会自动为局部变量赋初值,但对于成员变量,系统会自动赋初值)

Date类表示的是时间点,表示大家熟悉的日历表示法的LocalDate类
LocalDate类与Math的构造器同理,需使用静态工厂方法(factory method)代表构造器.LocalDate.now()会构造一个新对象,表示构造这个对象时的日期。

更改器方法与访问器方法:对实例域做出修改的方法被称为更改器方法(mutator method),仅访问实例域而不进行修改的方法被称为访问器方法(accessor method)

在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类

•构造器与类同名
•每个类可以有一个以上的构造器
•构造器可以有 0 个、1 个或多个参数
•构造器没有返回值
•构造器总是伴随着 new 操作一起调用

必须注意在所有的方法中不要命名与实例域同名的变量(因为会屏蔽同名的实例域,无法设置实例域)

隐式参数与显式参数
有些人把隐式参数称为方法调用的目标或接收者(其实就是那个对象),在每一个方法中, 关键字 this 表示隐式参数
显式参数是明显地列在方法声明中的(其实就是方法括号里面的参数),例如 double byPercent。隐式参数没有出现在方法声明中

内联方法
       在说内联函数之前,先说说函数的调用过程.调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。也就是通常说的压栈和出栈。因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体 
代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大。
       那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了。内联函数就是在程序编译时,编译器将程序中出现 
的内联函数的调用表达式用内联函数的函数体来直接进行替换。显然,这样就不会产生转去转回的问题,但是由于在编译 
时将函数体中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时 
那么大,可见它是以目标代码的增加为代价来换取时间的节省。
在java中使用final关键字来指示一个函数为内联函数,这个指示并不是必需的。final关键字只是告诉编译器,在编译的时候考虑性能的提升,可以将final函数视为内联函数。但最后编译器会怎么处理,编译器会分析将final函数处理为内联和不处理为内联的性能比较了。总的来说,一般的函数都不会被当做内联函数,只有声明了final后,编译器才会考虑是不是要把你的函数变成内联函数

注意不要编写返回引用可变对象的访问器方法
LocalDate类没有更改器方法,与之不同,Date类有一个更改器方法setTime,可以在这里设置毫秒数。Date对象是可变的,这一点就破坏了封装性!可以参考网友总结.如果需要返回一个可变数据域的拷贝,就应该使用 clone。

final实例域
可以将实例域定义为final。构建对象时必须初始化这样的域。必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。在对象构建之后,这个值不会再被修改,即没有setName方法(会报错)。
静态域
如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。它属于类,而不属于任何独立的对象。只要有改变对于其他对象也变化了
静态常量
publicstaticfinaldoublePI=3.14159265358979323846如果关键字static被省略,PI就变成了Math类的一个实例域。
静态方法
静态方法是一种不能向对象实施操作的方法,换句话说,没有隐式参数,类直接调用.静态方法可以自身类的静态域。
工厂方法
静态方法还有另外一种常见的用途。类似LocalDate和NumberFormat的类使用静态工厂方法(factory method)来构造对象.NumberFormat类如下使用工厂方法生成不同风格的格式化对象:
NumberFormat currencyFormatter=NumberFormat.getCurrencylnstance();
NumberFormat percentFormatter=NumberFormat.getPercentlnstance();
double x=0.1;
System.out.println(currencyFormatter.format(x));//prints$0.10
System.out.println(percentFomatter.format(x));//prints10%
为什么NumberFormat类不利用构造器完成这些操作呢?这主要有两个原因:
•无法命名构造器。构造器的名字必须与类名相同。但是,这里希望将得到的货币实例和百分比实例采用不用的名字。
•当使用构造器时,无法改变所构造的对象类型。而Factory方法将返回一个DecimalFormat类对象,这是NumberFormat的子类.

方法参数
按值调用(call by value) 表示方法接收的是调用者提供的值。而按引用调用( call by reference)表示方法接收的是调用者提供的变量地址。
按值传递的一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java 程序设计语言总是采用按值调用.也就是说, 方法得到的是所有参数值的一个拷贝.
按值调用|按引用调用的差别
1.传值调用又分为数据传值调用和地址传值调用。
数据传值调用方式是将实参的数据值传递给形参。
实参和形参在栈空间内的地址不相同,改变形参值不影响实参值;
地址传值调用方式是将实参的地址值传递给形参,
实参和形参在栈空间内共用同一地址,改变形参值就可改变实参值。
2.引用调用是将实参变量值传递给形参,
而形参是实参变量的引用名。引用是给一个已有变量起的别名,对引用的操作就是对该已有变量的操作。
引用调用可以起到地址传值调用的作用,
即改变形参值就可改变实参值。引用调用比地址传值调用更为简单,
在C++较多地使用引用调用代替地址传值调用。

总结一下Java中方法参数的使用情况:
•一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
•一个方法可以改变一个对象参数的状态。
•一个方法不能让对象参数引用一个新的对象。

对象构造
这是域与局部变量的主要不同点。必须明确地初始化方法中的局部变量。但是,如果没有初始化类中的域,将会被自动初始化为默认值(0、false或null),仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器.

对象析构与finalize方法
在析构器中,最常见的操作是回收分配给对象的存储空间。由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器
可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够调用。

静态导入
import语句不仅可以导人类,还增加了导人静态方法和静态域的功能例如,如果在源文件的顶部,添加一条指令:importstaticjava.lang.System.*;就可以使用System类的静态方法和静态域,而不必加类名前缀:
out.println("Goodbye,World!");//i.e.,System.out
exit⑼;//i.e.,System.exit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值