外贸公司的网站建设模板,中信建设有限责任公司营业执照,免费域名网站黄,wordpress调用文章内容文章目录 前言Object类2. Objects类3. 包装类4. StringBuilder和StringBuffer5. StringJoiner6. Math7. System8. JDK8开始新增的日期、时间9. Arrays10. Lambda表达式11. 方法引用 前言
其实转语言来说#xff0c;语法都比较简单#xff0c;花个三天就会了#xff0c;但最… 文章目录 前言Object类2. Objects类3. 包装类4. StringBuilder和StringBuffer5. StringJoiner6. Math7. System8. JDK8开始新增的日期、时间9. Arrays10. Lambda表达式11. 方法引用 前言
其实转语言来说语法都比较简单花个三天就会了但最主要的是熟悉各种API比如用惯了C的STL再来学新的API就会觉得很不习惯就拿vector和ArrayList来说vector就可以直接[]访问但是Java没有提供操作符重载就只能用函数来获取了怪不习惯的。这就好比你之前都是在学一门语言的语法但是更费时的是去背单词而往往一门语言学的好不好就是看会的单词多不多。这个比喻不知道恰不恰当哈哈哈~
接下来Java的学习就是去熟悉各种常用的API了我目前能想到的主要有各种数据结构、网络IO、多线程同步互斥、文件等等把这些都写一遍才算是初步熟悉Java了吧然后再去学各种框架。在学习的时候我也会时常去和C的一些API做对比的方便自己和读者们理解。
Object类
Object类是Java中所有类的祖宗类因此Java中所有类的对象都可以直接使用Object类中提供的一些方法。 toString和equals是可以在类中进行重写的而clone会调用父类Object中的clone方法并且需要在类中表明Cloneable才行。
package api_object;import java.util.Objects;// Cloneable是一个标记接口
// 规则public class Student implements Cloneable{private String name;private int age;private int[] scores;public Student() {}public Student(String name, int age) {this.name name;this.age age;this.scores new int[2];}Overridepublic String toString() {return Student{ name name \ , age age };}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;Student student (Student) o;return age student.age Objects.equals(name, student.name);}Overrideprotected Object clone() throws CloneNotSupportedException {// super去调用父类Object中的clone方法Student s2 (Student) super.clone();s2.scores s2.scores.clone();return s2;}public int[] getScores() {return scores;}public void setScores(int[] scores) {this.scores scores;}Overridepublic int hashCode() {return Objects.hash(name, age);}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}
}
深克隆和浅克隆 我们知道java的数据类型分为引用类型和值类型因此就有了浅克隆和深克隆一说。
对于浅克隆而言一方数据改变后另一方数据也会跟着变化 对于深克隆而言原型对象和克隆对象之间没有任何关联指向不同的地址。
浅克隆就是地址用同一块引用类型拷贝的只是地址深克隆 对象中基本类型的数据直接拷贝对象中的字符串数据拷贝的还是地址存放在字符串常量池对象中还包含的其他对象不会拷贝地址会创建新对象
所以为了实现深克隆就需要对对象进行递归克隆clone中嵌套clone首先让源对象调用克隆方法获得克隆的对象然后获得被克隆对象的引用类型的成员变量对象对该成员变量对象调用克隆方法此时成员变量对象也被克隆了一份最后将该克隆的成员变量对象设置为克隆对象的新的成员变量再返回该被克隆的对象即可实现深克隆。
2. Objects类
该类中都是些static方法且是final类用于操作对象或操作前检查某些条件。 对于equals来说为什么不用对象自己的equals方法就是为了防止空指针报错所以官方更推荐Objects的equals方法。
3. 包装类
Java万物皆对象所以对于基本类型来说也包装成了对应的类。String已经包装过了
对于包装类来说主要是为了模板和各种API的使用。 拿Integer来说
Integer i Integer.valueOf(7);
Integer j 7; // 自动装箱int p i; // 自动拆箱当然还有一些包装类的常见操作比如
把基本类型的数据转换成字符串类型对应C的to_string() public static String toString(double d)把字符串类型的数值转换成数值本身对应的数据类型对应C的stoi() public static int parseInt(String s) public static Integer valueOf(String s)最推荐这个
当然还可以这样操作Integer a 23; String s a
4. StringBuilder和StringBuffer
相当于一个容器这个类在String的基础上提供了更多的一些方法做修改效率会更高代码会更简洁。
StringBuilder就相当于是C的string了是一个动态可变字符串而Java原本的String是不可变的修改效率非常地下 而StringBuilder和StringBuffer的用法一模一样但是StringBuilder是线程不安全的StringBuffer是线程安全的。
5. StringJoiner
这个类是JDK8才有的和StringBuilder一样也是个容器。
好处不仅能提高字符串的操作效率并在一些场景下使用它操作字符串代码会更简洁。 C能有这玩意儿这个是真的牛啊
6. Math 7. System
System代表程序所在的系统也是一个工具类
8. JDK8开始新增的日期、时间
JDK8之后的时间API设计更合理功能丰富使用方便都是不可变对象修改后会返回新的时间对象不会丢失最开始的时间线程安全能精确到毫秒、纳秒
**LocalTime **
9. Arrays 或许用得最多的是最后一个数组排序算法题可能用的比较多吧。
关于这个自定义排序和C有点不同。Java官方的约定是
如果认为左边大于右边则返回正数如果认为左边小于右边则返回负数如果相等则返回0
根据这样得到的是升序那么在代码的体现最直接了当的就是o1 o2即可。然而C确是o1 o2注意区分。
10. Lambda表达式
作用用于简化匿名内部类的代码写法
格式
(被重写方法的形参列表)-{被重写方法的方法体代码。
}对比下C的匿名函数
[](形参列表) {代码。
}lambda只能简化函数式接口的匿名内部类接口、有且仅有一个抽象方法我们见到的大部分函数式接口上面都可能会有一个FunctionalInterface的注解有该注解的接口必定是函数式接口
省略写法
参数类型可以不写如果只有一个参数参数类型可以省略同时()也可以省略如果Lambda中的方法体代码只有一行代码可以省略大括号同时要省略分号如果这行代码是return也必须去掉return不写
int[] nums new int[]{123, 321, 153};Arrays.setAll(nums, value - nums[value]*2);for (int num : nums) {System.out.println(num);}11. 方法引用 静态方法引用 类名::静态方法 如果某个Lambda表达式只是调用一个静态方法并且前后参数的形式一致就可以使用静态方法引用。 实例方法引用 对象名::实例方法 如果某个Lambda表达式只是调用一个实例方法并且前后参数的形式一致就可以使用实例方法引用。 特定类型方法的引用 类型::方法 如果某个Lambda表达式里只是调用一个实例方法并且前面参数列表中的第一个参数是作为方法的主调后面的所有参数都是作为该实例方法的入参的则此时可以使用特定类型的方法引用。 构造器引用 类名::new 如果某个Lambda表达式只是在创建对象并且前后参数情况一致就可以使用构造器引用。