java核心类库
java核心类库
一、泛型
1.概述
泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
-
使用
- 泛型类
定义一个泛型类:public class ClassName<T>{ private T data; public T getData() { return data; } public void setData(T data) {this.data = data; }}
- 泛型接口
public interface IntercaceName<T>{ T getData();}实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:指定类型:public class Interface1 implements IntercaceName<String> { private String text; @Override public String getData() { return text; }}不指定类型:public class Interface1<T> implements IntercaceName<T> { private T data; @Override public T getData() { return data; }}
- 泛型方法
private static <T> T 方法名(T a, T b) {}
- 泛型限制类型
1. 在使用泛型时, 可以指定泛型的限定区域 ,- 例如: 必须是某某类的子类或 某某接口的实现类,格式:<T extends 类或接口1 & 接口2>
- 泛型中的通配符 ?
类型通配符是使用?代替方法具体的类型实参。1 <? extends Parent> 指定了泛型类型的上届2 <? super Child> 指定了泛型类型的下届3 <?> 指定了没有限制的泛型类型
- 作用
1、 提高代码复用率2、 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
- 注意
在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段
二、java.util.Objects
-
Objects.equals(p1, p2)
-
Objects.isNull(p1) 判断p1是否为null
import java.util.Objects;public class Demo02 { public static void main(String[] args) { Person p1 = null; Person p2 = new Person(); System.out.println(Objects.equals(p1, p2)); System.out.println(Objects.isNull(p1)); System.out.println(Objects.requireNonNull(p1));//是null直接抛出异常 }}
三、java.util.Math
-
绝对值:Math.abs();
-
最小值: Math.min(); — Math.max();
-
四舍五入: Math.round()
-
Math.round(-100.5) ---> -100
-
-
返回小于等于参数的最大值: Math.floor(int x);
- 数字的位数 floor(log10(n)) + 1
四、java.util.Arrays
-
Arrays.toString(arr)
-
Arrays.binarySearch(arr,6);//查找6的下标
-
arr = Arrays.copyOf(arr, 15);//数组长度扩容为15
五、java.util.BigDecimal
用于运算:
- 如果直接System.out.println(0.1 + 0.2 ) -->0.300000004,结果会出现误差
- 使用
public class BigDecimalDemo { public static void main(String[] args) { BigDecimal b1 = new BigDecimal("0.1"); BigDecimal b2 = new BigDecimal("0.2"); bi.add(b2);//0.1 BigDecimal b3 = b1.add(b2);//0.3 }}
六、java.util.Date
import java.util.Date;public class Demo() { public static void main(String[] args) { Date date = new Date(); date.toString();//获得当前时间 date.getTime();//当前毫秒数(1970年开始) }}
七、java.util.DateFormat
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/** * y : 年 * M : 月 * d : 日 * H : 时 * m : 分 * s : 秒 * 2021年7月21日 12:12 50 **/public class Demo { public static void main(String[] args) throws ParseException { //定义一个格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm ss"); //将date对象转换为字符串形式 String str = simpleDateFormat.format(new Date()); System.out.println(str);//2021年07月21日 10:22 17 //parse: 将2021-12-12 12:32 12 转换为date对象 Date date= simpleDateFormat.parse("2021-12-12 12:32 12"); System.out.println(new Date().getTime() -date.getTime()); }}
八、java.util.Calerdar
import java.util.Calendar;import java.util.Date;public class CalendarDemo { public static void main(String[] args) { Calendar calendar = Calendar.getInstance();//获得一个对象,应为是abstract类,不能直接new一个对象 /* calendar.set(Calendar.YEAR, 2030); int year = calendar.get(Calendar.YEAR);//获取年 int day = calendar.get(Calendar.DAY_OF_YEAR);//年的第几天 */ //月份从0开始,到11, 0-11 calendar.add(Calendar.MONTH, 4);//月份加上去 System.out.println(calendar.get(Calendar.MONTH)); Date d = calendar.getTime(); System.out.println(d); int m = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println(m); }}
九、String
拼接字符串String str1 = str2 + str3;//浪费内存//线程不安全StringBuilder sb = new StringBuilder();//线程安全的实现StringBuffersb.append("str2");sb.append("str3");String text = sb.toString();
十、集合(类集)
一、Collection单值存储
1. ArrayList
特点:增加减少慢,查找快
- add(): 增加元素
- list.addAll(strings); 往列表里面增加一个列表
- list.addAll(0, strings1) 在位置0处插入列表strings1
2.Vector
扩容设置扩容长度,如果不设置,会默认变为原来的两倍(看源码)
3、LinkedList
- 使用的是双向链表,增删快,查找慢
4、Iterator与ListIterator(迭代器)
- next() 、previous()、 hasnext()
public class IteratorDemo { public static void main(String[] args) { ArrayList<Integer> arr = new ArrayList<>(); arr.add(1); arr.add(2); arr.add(3); arr.add(4); arr.add(5); Iterator<Integer> iterator = arr.iterator();// while(iterator.hasNext()) {// Integer i = iterator.next();// System.out.println(i);// } /* iterator.next(); iterator.remove(); */ // System.out.println(arr.size()); ListIterator<Integer> iterator1 = arr.listIterator(); //iterator1.previous();//获取上一个数据 iterator1.add(100);//插入next()的前一个位置 System.out.println(arr.size()); int i = iterator1.nextIndex(); System.out.println("i" + i); iterator1.previous(); while(iterator1.hasNext()) { System.out.println(iterator1.next()); } // iterator1.next(); // iterator1.next(); iterator1.set(200);//修改迭代器指针处的值为200 System.out.println();// System.out.println(arr.size()); iterator1.previous();//查看上一个数据 iterator1.previous();//查看上一个数据,就是往前移动指针 while(iterator1.hasNext()) { System.out.println(iterator1.next()); } }}
5、Foreach循环
public class foreachDemo { public static void main(String[] args) { int[] arr = {6,5 ,4 ,3, 2, 1};/*for (int i = 0; i < arr.length; i++) { System.out.println(i);}*/ /* foreach 用于迭代器(Collection) for(数据类型 变量名:集合或者数组名) */ for (int num: arr) { System.out.println(num); } System.out.println("----------"); ArrayList<String> data = new ArrayList<>(); data.add("锄禾日当午"); data.add("汗滴禾下土"); data.add("谁知盘中餐"); data.add("粒粒皆辛苦"); for (String s: data) { System.out.println(s); } }}
6、Set
1、HashSet
- 不包含重复元素
- 因为是散列的,所以存储顺序是无序的
public class SetDemo { public static void main(String[] args) { //HashSet : 散列存放(哈希表在学习Map集合时讲解) HashSet<String> set= new HashSet<>(); boolean flag1 = set.add("锄禾日当午"); set.add("汗滴禾下土"); set.add("谁知盘中餐"); set.add("粒粒皆辛苦"); boolean flag2 = set.add("村禾日当午"); System.out.println(flag1+ " " + flag2); for (String s: set) { System.out.println(s); }/* Iterator iterator = set.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); }*/ }}
2、TreeSet
-
自动有序存储
/*自定义类型无法比较,需要继承接口implements Comparable,Comparable里面的内容自己定义*/public class TreeSetDemo2 { public static void main(String[] args) { TreeSet<Person> data = new TreeSet<>(); Person p1 = new Person("张三", 18); Person p2 = new Person("李四", 19); Person p3 = new Person("戴五", 12); Person p3 = new Person("劳六", 12); data.add(p1); data.add(p2); data.add(p3); data.add(p4);//这个数不会存储,因为前面已经出现了age = 12的人 for (Person p: data) { System.out.println(p); } } static class Person implements Comparable<Person>{ private String name; private int age; @Override public int compareTo(Person o) { //this 与 o 比较 //返回的数据是负数 this小 或者0 或者正数 this 大 if (this.age > o.age) { return 1; } else if(this.age == o.age) { return 0; } return -1; } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }}
二、多值存储Map
1、Map
- Map存储的是键值对,键不可重复,一个键对应一个值
- Map是一种映射关系
2、HashMap
- 散列因子0.75 : 当75%的哈希桶存了数据的时候,就会进行扩容,变为原来的两倍
public class HashMapDemo { public static void main(String[] args) { HashMap<String, String> data = new HashMap<>(); //HashMap Hashtable TreeMap LinkedHashMap ConcurrentHashMap //HashMap换成Hashtable也一样使用,换个包就可以 //Hashtable存储的结果是倒过来的 data.put("Key1", "戴子儒"); data.put("Key2", "陈俊华"); String value = data.get("Key1"); System.out.println(value); System.out.println("====="); Set<String> set = data.keySet();//获得键 for (String key: set) { System.out.println(key + "->" + data.get(key)); } System.out.println("----------------"); Collection<String> values = data.values();//获得值 for (String value1: values) { System.out.println(value1); } }}
3、HashMap、Hashtable、ConcurrentHashMap的区别
- HashMap 线程不安全,效率高
- Hashtable线程安全,效率低
- ConcurrentHashMap 采用分段锁机制,保证线程安全,效率又比较高
4.自定义存储对象
public class MyDemo { public static void main(String[] args) { HashMap<Book, String> data = new HashMap<>();//Book是键 Book book1 = new Book("金苹果","苹果的种植"); data.put(book1,"我的第一本书本"); Book book2 = new Book("银苹果","苹果的出生"); data.put(book2, "第二本书"); book1.setName("同苹果");//改变后查询不到了 Book book3 = new Book("金苹果","苹果的种植");//与前面存的不一样,查找不到 System.out.println(data.get(book1)); System.out.println(data.get(book3)); } static class Book{ private String name; private String info; public Book(String name, String info) { this.name = name; this.info = info; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", info='" + info + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; return Objects.equals(name, book.name) && Objects.equals(info, book.info); } @Override public int hashCode() { return Objects.hash(name, info); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }}
5、JDK9新特征0f
public class JDK9NewDemo { public static void main(String[] args) {/* List list = List.of("锄禾日当午", "汗滴禾下土"); for (String s: list) { System.out.println(s); } list.add("谁知盘中餐");//注意不可添加*//* Set set = Set.of("一二三四五", "上山打老虎"); for (String s: set) { System.out.println(s);//不保证存储顺序的 }*/ Map<String, String> map = Map.of("h1", "戴子儒", "h2", "陈俊华"); //map.put("h3", "戴梓彤");不可添加 Set<String> keySet = map.keySet(); for (String key: keySet) { System.out.println(key + "-->" + map.get(key)); } }}
十一、文件操作(遍历文件)
import java.io.File;public class Demo { public static void main(String[] args) { File d = new File("d:\\"); File[] files = d.listFiles();//获得d盘下所有第一层的文件 listFiles(files); System.out.println("找不到avi文件"); } public static void listFiles(File[] files) { if (files != null && files.length > 0) { for (File file:files) { if (file.isFile()) { if (file.getName().endsWith(".avi")) { //找到一个以.avi结尾的文件 if (file.length() > 100 * 1024 * 1024) {//大于一百兆的文件System.out.println("找到了一个avi文件");file.delete();System.out.println(file.getAbsolutePath() + "已删除"); } } } else {//是文件夹 File[] files2 = file.listFiles();//递归子文件夹 listFiles(files2);//子文件里面的文件 } } } }}
写于2021-08-04