Java基础语法(中)
数学类
数学类提供的一些常用方法:
- pow(x,y) 计算x的y次幂
- abs(x). 计算x的绝对值
- log(x). 计算以e为底x的对数, e是啥, 我只能告诉你e被称为欧拉数….
- max(x,y) 返回x, y中大的那个数
- min(x, y) 返回x,y中小的那个数
- round(x) x四舍五入
- sqrt(x) 计算x的开平方. 根号下x
数学类的其他方法传送门:https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html
package com.dylan.math; public class Test { public static void main(String[] args) { System.out.println(Math.pow(3, 3)); // 3的3次方 System.out.println(Math.abs(-12)); // 12 System.out.println(Math.log(2)); // 以e为底, 2的对数 System.out.println(Math.max(12, 33)); // 求大数 33 System.out.println(Math.min(55, 33)); // 求小数 33 System.out.println(Math.round(3.56789)); // 4 四舍五入 System.out.println(Math.sqrt(3)); // 根号9 1.732 } }
- 求解二元方程
package com.dylan.math; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入a:"); double a = sc.nextInt(); System.out.println("请输入b:"); double b = sc.nextInt(); System.out.println("请输入c:"); double c = sc.nextInt(); // 先判断b*b-4*a*c是否大于0 . 不大于0无解 double dt = b*b - 4*a*c; if (dt < 0){ System.out.println("此方程无解"); } else if(dt == 0){ System.out.println("此方程有一个解"); double x = -b/(2*a); System.out.println("x = " + x); } else { System.out.println("此方程有两个解"); double x1 = (-b+Math.sqrt(dt)) / (2*a); double x2 = (-b-Math.sqrt(dt)) / (2*a); System.out.println("x1 = "+x1 + ", x2 = "+x2); } } }
Random类
import java.util.Random; public class Test { public static void main(String[] args) { Random r = new Random(13); // 传入种子13 // 随机产生10个[0, 100)之间的整数 for(int i=0;i<1;i++){ System.out.println(r.nextInt(100)); // 92 System.out.println(r.nextInt()); // 1412442200 System.out.println(r.nextDouble()); // 0.44461356134079055 System.out.println(r.nextFloat()); // 0.051283896 System.out.println(r.nextBoolean()); //true } } }
基本数据类型包装类
基本类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Charactor |
boolean | Boolean |
除了int和char以外都是基本数据类型首字母大写. 很好记.
打包与解包
在java里, 基本数据类型是可以和包装类型进行无缝转换的.
Integer i = 1; // 自动打包成Integer对象 int b = i; // 自动解包成int类型
基本数据类型包装类存在的意义:
- 让基本数据类型有了面向对象的特征.
- 可以把字符串转化成各种基本数据类型
基本数据类型转换
public class Test { public static void main(String[] args) { String a = "1"; String b = "1"; System.out.println(a+b); // 11 滑天下之大稽 // 把字符串转化成int int c = Integer.parseInt(a); int d = Integer.parseInt(b); System.out.println(c + d); // 2 没毛病老铁 //转化成double试试 double e = Double.parseDouble(a); double f = Double.parseDouble(b); System.out.println(e+f); } }
规律: 字符串->基本数据类型
基本数据类型包装类.parse基本数据类型()
Integer.parseInt();
Double.parseDouble();
Long.parseLong();
Boolean.parseBoolean();
都一样
~
Integer in = new Integer(20); System.out.println(in.toString()) // 将20转化为字符串"20"
Date类型
import java.util.Date; public class Test { public static void main(String[] args) { Date date1 = new Date(); // 获取当前时间对象 Date date2 = new Date(9444442323L); // 获取1970年1月1日以来9444442323ms后的时间 System.out.println(date1); System.out.println(date2); } } // Wed Jul 24 14:44:28 CST 2019 // Mon Apr 20 15:27:22 CST 1970
Calendar类
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; int date = calendar.get(Calendar.DATE); int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); System.out.println("当前时间为:"+year+"年"+month+"月"+date+"日"+hour+"时"+minute+"分"+second+"秒"); } } // 当前时间为:2019年7月24日2时50分58秒
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.set(2019,7,1); calendar.add(Calendar.DATE, 100); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH + 1); int date = calendar.get(Calendar.DATE); System.out.println("100天后是"+year+"年"+month+"月"+date+"日"); } } // 100天后是2019年45月9日
DateFormat类
import java.util.Calendar; import java.util.Date; import java.text.DateFormat; public class Test { public static void main(String[] args) { Date date = new Date(); // Full格式 DateFormat fullFormat = DateFormat.getDateInstance(DateFormat.FULL); // Long模式 DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG); // mediunm格式日期时间对象 DateFormat mediumFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM); // short格式日期时间对象 DateFormat shortFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); System.out.println(fullFormat.format(date)); System.out.println(longFormat.format(date)); System.out.println(mediumFormat.format(date)); System.out.println(shortFormat.format(date)); } } // 2019年7月24日星期三 // 2019年7月24日 // 2019年7月24日 下午3:00:52 // 2019/7/24 下午3:00
DecimalFormat类
我想保留小数点后两位怎么办? 就用这个叫DecimalFormat.
import java.text.DecimalFormat; public class TestNumberFormat { public static void main(String[] args) { double d = 10/3.0; System.out.println(d); DecimalFormat df = new DecimalFormat(".00"); // 保留小数点后两位 String s = df.format(d); System.out.println(s); // 3.33 } }
这一堆格式中, 我们只需要关注三个
0: 数字
#: 数字
. : 小数点
.00 和.## 是一样的.
字符串详解
String s1 = "胡辣汤"; String s2 = new String("狗不理");
public class TestString { public static void main(String[] args) { String s = "今天特别想吃哈密瓜"; //charAt(int) 获取到字符串中某个位置的字符. 从0开始数 System.out.println(s.charAt(0)); // 今 System.out.println(s.charAt(4)); // 想 // concat(String) 字符串拼接. 和+是一样的 System.out.println(s.concat("伊丽莎白")); // 今天特别想吃哈密瓜伊丽莎白 //今天特别想吃哈密瓜 深坑: 字符串是不可变的. 不论做什么操作, 原来的字符串不会发生改变, 每次操作都是返回一个新字符串 System.out.println(s); // contains(String) 判断字符串中是否包含xxx System.out.println(s.contains("明天")); // false System.out.println(s.contains("哈密瓜")); // true // startswith(String) 判断字符串是否以xxxx开头 // endswith(String) 判断字符串是否以xxxx结尾 System.out.println(s.startsWith("今天")); // true System.out.println(s.endsWith("哈密瓜")); // true // equals(String) 判断两个字符串内容是否一致 // equalsIgnoreCase(String) 判断两个字符串内容是否一致(忽略大小写) System.out.println("abc".equals("abc")); // true System.out.println("abc".equalsIgnoreCase("ABC")); // true // indexOf(String) 根据给定的字符串计算该字符串出现的位置 -> 从前向后 // lastIndexOf(String) 根据给定的字符串计算该字符串出现的位置-> 从后向前 System.out.println(s.indexOf("特别")); // 2 System.out.println(s.lastIndexOf("哈密瓜")); // 6 // isEmpty() 判断字符串是否是空字符串 System.out.println("".isEmpty()); // true System.out.println(" ".isEmpty()); // false // length() 字符串的长度 -> 有多少个字符组成 System.out.println(s.length()); // 9 // replace(String, String) 把xxx替换成xxx String s1 = s.replace("今天", "昨天"); System.out.println(s); // 今天特别想吃哈密瓜 没变~~~~ 字符串不可变哦 System.out.println(s1); // 昨天特别想吃哈密瓜 获得的新字符串 // replaceFirst(String, String); 替换第一个 String s2 = s.replace("天", "日"); System.out.println(s2); // 今日特别想吃哈密瓜 // split(String) 字符串切割 String[] strs = s.split("想吃"); // 使用"想吃"进行字符串切割. 切割的结果放在字符串数组中 System.out.println(strs[0]); // 今天特别 System.out.println(strs[1]); // 哈密瓜 // subString(int, int) 字符串截取. 从xxx截取到xxx String s3 = s.substring(2, 4); System.out.println(s3); // 特别 // toUpperCase(); 转化成大写 // toLowerCase(); 转化成小写 String s4 = "abcDefGhIJKLMN"; System.out.println(s4.toUpperCase()); System.out.println(s4.toLowerCase()); // trim(); 去掉左右两端的空格 String s5 = " 哇哈哈哈哈 "; System.out.println(s5.trim()); //哇哈哈哈哈 } }
StringBuilder和StringBuffer
“我的妈呀”+”你的妈呀”+”谁的妈呀”+”怎么这么卡”. 在老的JDK中 每次相加都会产生一个新的字符串, 非常的浪费内存资源, 但是在新版本中, JDK对这里进行了优化. 每次+都是执行用的StringBuilder中的字符串拼接方法. 为什么呢? 因为StringBuilder是可以改变的字符串. 都在原来的基础上进行操作. 所以不会产生内存浪费. 接下来我们来看看这个叫StringBuilder的东西.
StringBuilder: 可变的字符串
用法:
public class TestStringBuilder { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); // 空的字符串. StringBuilder sb2 = new StringBuilder("王二麻子的麻子特别特别麻"); // 也可以给出具体的字符串. 都OK sb2.append(", 李二麻子的麻子就不是特别麻"); // 在后面追加 System.out.println(sb2); // 王二麻子的麻子特别特别麻, 李二麻子的麻子就不是特别麻 sb2.append(123); //可以追加任何数据类型 sb2.insert(3, "插入");// 还可以在中间插入 System.out.println(sb2); // 王二麻插入子的麻子特别特别麻, 李二麻子的麻子就不是特别麻123 String s = sb2.toString(); // 转化回正常的普通字符串 System.out.println(s); } }
关于StringBuilder, 咱们就说这么多. 足够大家在平时使用了
StringBuffer和StringBuilder基本上一模一样. 区别是StringBuffer线程安全. StringBuilder线程不安全. 等到后面我们学到线程的时候, 在给大家说他俩的区别. 就目前而言. 你可以认为没区别..
容器
- List
- Set
- Map
List
List和咱们以前学过的数组其实差不多. 不过List的优势是可以随意扩容. 多少数据都能装的下
List也有两个常用的实现类: ArrayList(重要), LinkedList.
先看重要的:
import java.util.ArrayList; import java.util.List; public class TestList { public static void main(String[] args) { ArrayList lst = new ArrayList(); lst.add("狂战士"); lst.add("狂战士"); lst.add("剑圣"); lst.add(123); lst.add("狱血魔神"); lst.add("红豆"); System.out.println(lst); // [狂战士, 狂战士, 剑圣, 123, 狱血魔神, 红豆] } }
结论: 没有去掉重复. 没有打乱顺序.
再看这个不是特别重要的
import java.util.LinkedList; import java.util.List; public class TestList { public static void main(String[] args) { LinkedList lst = new LinkedList(); lst.add("美团外卖"); lst.add("饿了么"); lst.add("百度外卖"); lst.add("我不吃"); lst.add("外卖"); lst.add(2,"饭堂"); lst.addFirst("北门"); lst.addLast("南门"); System.out.println(lst); // [美团外卖, 饿了么, 百度外卖, 我不吃, 外卖] } }
List集合中定义的方法
add(int index, Object element) | 作用 |
---|---|
void add(int index, Object element) | 在Index处添加元素 |
boolean addAll(int index, Collection c) | 将集合c所包含的元素全部插入到List集合的index处 |
Object get(int index) | 查看第i个元素 |
Object set(int index, Object element) | 在index处替换元素 |
int size() | 查看列表中的数据个数 |
boolean isEmpty() | 判断是否是空列表 |
int indexOf(Object element) | 查看元素在列表中的位置 |
int lastIndexOf(Object element) | 查看元素在列表中最后一次出现的位置 |
boolean contains(Object element) | 判断列表中是否包含某元素 |
List subList(int start, int end) | 截取子串 |
Object remove(int index) | 删除索引为index的元素 |
Object remove(Object element) | 删除某元素 |
import java.util.ArrayList; import java.util.List; public class TestList { public static void main(String[] args) { List lst = new ArrayList(); lst.add("美团外卖"); lst.add("饿了么"); lst.add("百度外卖"); lst.add("我不吃"); lst.add("外卖"); System.out.println(lst); // [美团外卖, 饿了么, 百度外卖, 我不吃, 外卖] System.out.println(lst.get(0)); // 查询第0个元素 System.out.println(lst.get(2)); // 查询第2个元素 System.out.println(lst.size()); // 列表中元素的个数 // 遍历出列表中所有的数据 for(int i = 0 ; i < lst.size(); i++){ System.out.println(lst.get(i)); } // 判断列表是否是空列表 System.out.println(lst.isEmpty()); // false //查看"我不吃"元素在列表中的位置 System.out.println(lst.indexOf("我不吃")); // 3 //查看最后一个"百度外卖"在列表中的位置 System.out.println(lst.lastIndexOf("百度外卖")); // 2 //判断是否包含饿了么 System.out.println(lst.contains("饿了么")); // true //列表的截取, 从1截取到3 [1,3)区间 System.out.println(lst.subList(1, 3)); // [饿了么, 百度外卖] System.out.println(lst.toArray()); // 转化成数组 lst.remove("外卖"); // 删除"外卖" lst.remove(2); // 删除索引为2的元素 } }
LinkedList中定义的方法
方法名 | 作用 |
---|---|
void add(int index, Object element) | 某位置插入元素 |
void addFirst(Object o) | 将元素插入开头 |
void addLast(Object o) | 将元素插入末尾 |
Object getFirst() | 返回第一个元素 |
Object getLast() | 返回最后一个元素 |
Object removeFirst() | 移除并返回第一个元素 |
Object removeLast() | 移除并返回最后一个元素 |
import java.util.LinkedList; import java.util.List; public class Test { public static void main(String[] args) { LinkedList link = new LinkedList(); link.add("stu1"); link.add("stu2"); link.add("stu3"); link.add("stu4"); System.out.println(link.toString()); link.add(2,"Student"); link.addFirst("First"); link.addLast("Last"); System.out.println(link); System.out.println(link.getFirst()); System.out.println(link.getLast()); link.remove(3); link.removeFirst(); System.out.println(link); } }
Iterator接口
方法名 | 作用 |
---|---|
boolean hasNext() | 判断是否存在下一个元素 |
Object next() | 获取下一个元素 |
import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Test { public static void main(String[] args) { LinkedList link = new LinkedList(); link.add("stu1"); link.add("stu2"); link.add("stu3"); link.add("stu4"); Iterator it = link.iterator(); while (it.hasNext()) { Object obj = it.next(); System.out.println(obj); } /* foreach(Object obj:link) { System.out.println(obj); } */ } }
foreach遍历 (不能修改)
import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Test { public static void main(String[] args) { LinkedList link = new LinkedList(); link.add("stu1"); link.add("stu2"); link.add("stu3"); link.add("stu4"); Iterator it = link.iterator(); foreach(Object obj:link) { System.out.println(obj); } } }
元素遍历删除
import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Test { public static void main(String[] args) { LinkedList link = new LinkedList(); link.add("stu1"); link.add("stu2"); link.add("stu3"); link.add("stu4"); Iterator it = link.iterator(); while(it.hasnext()) { if("stu3".equals(obj)) { it.remove(); // 不可以用link.remove(obj) } } } }
ListIterator迭代器
Iterator迭代器提供了 hasNext() 方法和 next() 方法
其为Iterator的子类, 在父类基础上增加了一些特有的方法
方法名 | 作用 |
---|---|
void add(Object o) | 插入元素 |
boolean hasPrevious() | 逆向遍历 |
Object previous() | 返回列表中的前一个元素 |
void remove() | 从列表中移除由next或previous返回的最后一个元素 |
import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class Test { public static void main(String[] args) { LinkedList link = new LinkedList(); link.add("stu1"); link.add("stu2"); link.add("stu3"); link.add("stu4"); ListIterator it = link.listIterator(link.size()); while(it.hasPrevious()) { Object obj = it.previous(); System.out.println(obj); } } } // stu4 // stu3 // stu2 // stu1
set
HashSet
瞎摆->存储的速度快,TreeSet
按顺序摆->存储的时候帮你排序, 存储的速度就慢.
HashSet
当向
HashSet
集合中添加一个对象时, 首先会调用该对象的 hashCode()方法来确定元素的存储位置, 然后调用equals()方法来确保该位置没有重复元素
import java.util.HashSet; import java.util.Iterator; public class Test { public static void main(String[] args) { HashSet s = new HashSet(); s.add("a"); s.add("b"); s.add("c"); s.add("c"); s.add("d"); Iterator it = s.iterator(); while(it.hasNext()) { Object data = it.next(); System.out.println(data); } } }
重写 hashCode() 和 equals() 方法
public class Student { String id; String name; public Student(String id, String name) { this.id = id; this.name = name; } // 重写toString方法 public String toString() { return id + ":" + name; } // 重写hashCode方法 public int hashCode() { return id.hashCode(); } // 重写equals方法 public boolean equals(Object obj) { if(this == obj) { return true; } if(!(obj instanceof Student)) { return false; } Student stu = (Student) obj; boolean b = this.id.equals(stu.id); return b; } }
import java.util.HashSet; import java.util.Iterator; public class Test { public static void main(String[] args) { HashSet hs = new HashSet(); Student s1 = new Student("1", "Jack"); Student s2 = new Student("2", "Rose"); Student s3 = new Student("2", "Rose"); hs.add(s1); hs.add(s2); hs.add(s3); System.out.println(hs); } } // [1:Jack, 2:Rose]
TreeSet
import java.util.HashSet; import java.util.Iterator; import java.util.TreeSet; public class Test { public static void main(String[] args) { TreeSet s = new TreeSet(); s.add("a"); s.add("b"); s.add("c"); s.add("c"); s.add("d"); Iterator it = s.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
实现Comparable接口
import java.util.*; public class Student implements Comparable { String name; int age; public Student(String name,int age) { this.name = name; this.age = age; } public String toString() { return name + ":" + age; } // 先按照年龄升序排列, 再按姓名升序排列 public int compareTo(Object obj) { Student s = (Student)obj; if(this.age - s.age > 0) { return 1; } if(this.age - s.age == 0) { return this.name.compareTo(s.name); // 调用String中的compareTo方法 } return -1; } }
import java.util.HashSet; import java.util.Iterator; import java.util.TreeSet; public class Test { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.add(new Student("Jack", 19)); ts.add(new Student("Rose", 18)); ts.add(new Student("Tom", 19)); ts.add(new Student("Rose", 18)); ts.add(new Student("Amy", 18)); Iterator it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } // Amy:18 // Rose:18 // Jack:19 // Tom:19
自定义比较器
import java.util.Comparator; public class MyComparator implements Comparator { public int compare(Object obj1, Object obj2) { String s1 = (String)obj1; String s2 = (String)obj2; return s1.length() - s2.length(); } }
import java.util.Iterator; import java.util.TreeSet; public class Test { public static void main(String[] args) { TreeSet ts = new TreeSet(new MyComparator()); ts.add("Jack"); ts.add("Amy"); ts.add("Helena"); Iterator it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } // Amy // Jack // Helena
Set的常用方法:
- add() 添加元素
- remove() 删除元素
- size() 集合中元素的个数
- contains() 判断是否包含了xxxx
import java.util.HashSet; import java.util.Set; public class TestSet2 { public static void main(String[] args) { Set s = new HashSet(); s.add("饮血剑"); s.add("绿叉"); s.add("无尽之刃"); System.out.println(s); //[绿叉, 无尽之刃, 饮血剑] s.remove("绿叉"); // 删除绿叉 System.out.println(s.size()); // 2 System.out.println(s.contains("无尽之刃")); // true } }
Map
Map常见的实现类也有两个, 一个是HashMap(常用), 另一个TreeMap.
map常用方法
方法名 | 作用 |
---|---|
void put(Object key, Object value) | 插入 |
Object get(Object key) | 获取 |
boolean containsKey(Object key) | 判断是否包含某key |
boolean containsValue(Object value) | 判断是否包含某value |
Set KeySet() | 返回键的 Set 视图 |
Collection<v> values()</v> | 返回值的 Collection 视图 |
Set<Map, Entry<K, V>> entrySet() | 返回映射关系的 Set 视图 |
import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class Test { public static void main(String[] args) { HashMap map = new HashMap(); map.put("1", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); map.put("3", "Mary"); // 覆盖前一个 System.out.println(map); Set keySet = map.keySet(); // 获取键的集合 Iterator it = keySet.iterator(); while(it.hasNext()) { Object key = it.next(); Object value = map.get(key); System.out.println(key + ":" + value); } } } // {1=Jack, 2=Rose, 3=Mary} // 1: Jack // 2: Rose // 3: Mary
第二种遍历方式
import java.util.*; public class TestIter { public static void main(String[] args) { Map map = new HashMap(); map.put("浪里白条", "张顺"); map.put("及时雨", "松江"); map.put("行者", "悟空"); Iterator it = map.entrySet().iterator(); // 拿到map内部的entry while(it.hasNext()){ Map.Entry entry = (Map.Entry) it.next(); System.out.println(entry.getKey()+"=>"+entry.getValue()); } } }
LinkedHashMap
import java.util.*; public class Test { public static void main(String[] args) { LinkedHashMap map = new LinkedHashMap(); map.put("1", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); map.put("3", "Mary"); // 覆盖前一个 System.out.println(map); Set keySet = map.keySet(); Iterator it = keySet.iterator(); while(it.hasNext()) { Object key = it.next(); Object value = map.get(key); System.out.println(key + ":" + value); } } } // {1=Jack, 2=Rose, 3=Mary} // 1: Jack // 2: Rose // 3: Mary
TreeMap
import java.util.*; public class Test { public static void main(String[] args) { TreeMap map = new TreeMap(); map.put("1", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); map.put("3", "Mary"); // 覆盖前一个 System.out.println(map); Set keySet = map.keySet(); Iterator it = keySet.iterator(); while(it.hasNext()) { Object key = it.next(); Object value = map.get(key); System.out.println(key + ":" + value); } } } // {1=Jack, 2=Rose, 3=Mary} // 1: Jack // 2: Rose // 3: Mary
自定义比较器
import java.util.Comparator; public class MyComparator implements Comparator { public int compare(Object obj1, Object obj2) { String id1 = (String)obj1; String id2 = (String)obj2; return id2.compareTo(id1); // 降序排列 } }
import java.util.*; public class Test { public static void main(String[] args) { TreeMap map = new TreeMap(new MyComparator()); map.put("1", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); map.put("3", "Mary"); // 覆盖前一个 System.out.println(map); Iterator it = map.keySet().iterator(); while(it.hasNext()) { Object key = it.next(); Object value = map.get(key); System.out.println(key + ":" + value); } } } // {3=Mary, 2=Rose, 1=Jack} // 3:Mary // 2:Rose // 1:Jack
常用操作:
- 相同的key会把前面保存的数据顶掉.
- get(key) 使用key查询value
- isEmpty() 判断Map是否是空的
- size() 返回key, value键值对的个数
- containsKey(key) 判断是否存在key
- remove(key) 根据key删除信息
- keySet() 获取到map中key的集合set
import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Map map = new HashMap(); map.put("q", "冲啊"); map.put("w", "打不动我吧!!!"); map.put("e", "爱的魔力转转圈"); map.put("r", "德玛西亚!!!!"); System.out.println(map); // {q=冲啊, r=德玛西亚!!!!, e=爱的魔力转转圈, w=打不动我吧!!!} map.put("w", "我挡!!"); // w被顶掉了 System.out.println(map); // {q=冲啊, r=德玛西亚!!!!, e=爱的魔力转转圈, w=我挡!!} System.out.println(map.get("q")); //冲啊 System.out.println(map.isEmpty()); // 是不是空的 false System.out.println(map.size()); // map里有多少key,value 4 System.out.println(map.containsKey("r")); // 是否包含了xxxkey true map.remove("e"); // 删除key为e的键值对 System.out.println(map); // {q=冲啊, r=德玛西亚!!!!, w=我挡!!} System.out.println(map.keySet()); // 获取到所有的key的set集合 [q, r, w] } }
容器的泛型
规范容器的类型
import java.util.ArrayList; import java.util.List; public class TestParadigm { public static void main(String[] args) { List<String> list = new ArrayList<String>(); // 强制规定这个列表只能装字符串 // list.add(1);// 报错. 只能装字符串 list.add("NB"); // OK // 好处是, 从list中获取到的数据不需要强转了. String s = list.get(0) ;// 这个列表只能装字符串, 拿出来也一定是字符串 System.out.println(s); } }
创建一个只能装歌手的列表
import java.util.ArrayList; import java.util.List; public class TestParadigm { public static void main(String[] args) { List<Singer> singerList = new ArrayList<Singer>(); // 只能装歌手 Singer singer = new Singer(); singerList.add(singer); // 添加歌手 Singer ss = singerList.get(0); // 查询歌手 System.out.println(ss); } }
Set集合和List的泛型是一样的. 强制规定集合中元素的类型
Map集合的泛型比较特殊. 因为这个鬼东西里面有key和value.两项内容.
import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TestParadigm { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("萝莉", "小蔡"); map.put("御姐", "苏打强"); // map.put(1, 2) ; // 报错, 只能是字符串 String v = map.get("萝莉"); System.out.println(v); } }
OK. 泛型的语法咱们明白了. 那这玩意有什么用呢?
规范集合. 存储数据方便. 不再需要强转了. 在以后的代码中, 如果没有特殊要求. 还是给出泛型比较好.
自定义泛型
public class CachePool<T> { T temp; public void save(T temp) { this.temp = temp; } public T get() { return this.temp; } }
import java.util.*; public class Test { public static void main(String[] args) { CachePool<Integer> pool = new CachePool<Integer>(); pool.save(new Integer(1)); Integer temp = pool.get(); System.out.println(temp); // 1 } }
Collections 工具类
在java中提供了Collections工具类来帮助我们去操作 List
集合类.
方法名 | 作用 |
---|---|
static boolean addAll(Collection c, Object elements) | 添加多个元素 |
static void reverse(List list) | 反转 |
satic void shuffle(List list) | 洗牌 |
static void sort(List list) | 排序 |
static void swap(List list, int i,int j) | 交换 |
static int binarySearch(List list, Object key) | 二分法查找 |
static Object max(Collection col) | 返回最大值 |
static Object min(Collection col) | 返回最小值 |
static boolean replaceAll(List list, Object oldVal, Object newVal) | 一个新值替换所有旧值 |
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> lst = new ArrayList<Integer>(); lst.add(123); lst.add(321); lst.add(147); Collections.sort(lst); // 排序 System.out.println(lst); Collections.shuffle(lst); // 打乱顺序 System.out.println(lst); Collections.sort(lst); // 重新排序 Collections.reverse(lst); // 翻转 System.out.println(lst); int max = Collections.max(lst); // 最大值 int min = Collections.min(lst); // 最小值 System.out.println(max); System.out.println(min); Collections.addAll(lst,-3, 2, 8, 8, 8); // 添加 System.out.println(lst); Collections.replaceAll(lst, 8, 0); // 替换 System.out.println(lst); } }
Arrays工具类
void Arrays.sort(array); // 数组排序 int index Arrays.binarySearch(Object[] a, Object key); // 查找某元素的下标, 返回索引 Object[] Arrays.copyOfRange(int[] original, int from, int to); // 拷贝数组 void Arrays.fill(Object[] a, Object val); // 填充数组中全部元素 String Arrays.toString(int[] arr); // 将数组转化为字符串
import java.util.*; public class Test { public static void main(String[] args) { int []arr = {9, 8, 3, 5, 2}; // 排序 Arrays.sort(arr); // 查找 int index = Arrays.binarySearch(arr, 3); // 拷贝, 多余的用0填充 int[] copy = Arrays.copyOfRange(arr, 1, 7); // 填充 Arrays.fill(arr, -1); // 转化为字符串 System.out.println(Arrays.toString(arr)); } }
IO文件
- 字节流
- java.io.InputStream
- java.io.OutputStream
- 字符流
- java.io.Reader
- java.io.Writer
InputStream常用方法
方法名 | 作用 |
---|---|
int read() | 读入一个字节, 将其转化为0-255之间的整数, 并返回 |
int read(byte[] b) | 读入若干字节, 将它们保存到参数b指定的字节数组中, 返回读取的字节数 |
int read(byte[] b, int off, int len) | 读取若干字节, 将他们保存到参数b指定的数组中, off起始下标, len表字节数 |
void close() | 关闭此输入流并释放与该流关联的所有系统资源 |
OutputStream常用方法
方法名 | 作用 |
---|---|
void write(int b) | 写入一个字节 |
void write(byte[] b) | 将b的所有字节写到输出流中 |
void write(byte[] b,int off,int len) | 指定byte数组中从偏移量off开始的len个字节写入输出流 |
void flush() | 刷新输出流并强制写出所有缓冲的输出字节 |
void close() | 关闭此输入流并释放与该流关联的所有系统资源 |
FileInputStream 和 FileOutputStream
- 读入
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception{
FileInputStream in = new FileInputStream("C:\Users\Dylan\Desktop\test.txt");
int b = 0;
while(true)
{
b = in.read();
if(b == -1)
{
break;
}
System.out.println(b);
}
in.close();
}
}
// 105
// 116
// 99
// 97
// 115
// 116
- 输出 ```java import java.io.*; public class Test { public static void main(String[] args) throws Exception{ // FileInputStream in = new FileInputStream("C:\\Users\\Dylan\\Desktop\\test.txt"); FileOutputStream out = new FileOutputStream("C:\\Users\\Dylan\\Desktop\\temp.txt"); String str1 = "中国"; byte[] b1 = str1.getBytes("utf-8"); // 转化为字节数组 gbk一个汉字2字节, utf-8一个汉字3字节 System.out.println(b1.length); // 6 String str2 = "China"; byte[] b2 = str2.getBytes("gbk"); // 转化为字节数组 gbk一个英文1字节, utf-8一个英文1字节 System.out.println(b2.length); // 5 for(int i=0;i<b2.length;i++) { out.write(b2[i]); } out.close(); } }
- 追加
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception {
FileOutputStream out = new FileOutputStream("example.txt", true); // 第二个参数表追加
String str = "欢迎您";
byte[] b = str.getBytes("gbk");
for(int i=0;i<b.length;i++)
{
out.write(b[i]);
}
out.close();
}
}
- 文件拷贝 ```python import java.io.*; public class Test { public static void main(String[] args) throws Exception { FileInputStream in = new FileInputStream("C:\\Users\\Dylan\\Desktop\\test.jpg"); FileOutputStream out = new FileOutputStream("C:\\Users\\Dylan\\Desktop\\test_new.jpg"); int b; long begintime = System.currentTimeMillis(); while ((b = in.read()) != -1) { out.write(b); } long endtime = System.currentTimeMillis(); System.out.println("拷贝文件所需要的时间是: " + (endtime-begintime) / 1000.0 +"秒"); in.close(); out.close(); } } // 拷贝文件所需要的时间是: 0.387秒
- 字节流的缓冲区
import java.io.*; public class Test { public static void main(String[] args) throws Exception { FileInputStream in = new FileInputStream("C:\\Users\\Dylan\\Desktop\\test.jpg"); FileOutputStream out = new FileOutputStream("C:\\Users\\Dylan\\Desktop\\test_new.jpg"); byte[] buff = new byte[1024]; int len; // 记录读入缓冲区的大小 long begintime = System.currentTimeMillis(); while((len=in.read(buff)) != -1) { out.write(buff,0,len); // 从第一个字节开始, 写入len个字节 } long endtime = System.currentTimeMillis(); System.out.println("拷贝文件所需要的时间是: " + (endtime-begintime) / 1000.0 +"秒"); in.close(); out.close(); } } // 拷贝文件所需要的时间是: 0.001秒
- 装饰设计模式
public class Car { private String carName; public Car(String carName) { this.carName = carName; } public void show() { System.out.println("我是" + carName + ", 具有基本功能"); } }
public class RadarCar { public Car myCar; public RadarCar (Car myCar) { this.myCar = myCar; } public void show() { myCar.show(); System.out.println("具有雷达功能"); } }
public class Test { public static void main(String[] args) { Car benz = new Car("Benz"); System.out.println("--------------包装前--------------"); benz.show(); RadarCar decoratedCar_benz = new RadarCar(benz); System.out.println("--------------包装后--------------"); decoratedCar_benz.show(); } } // --------------包装前-------------- // 我是Benz, 具有基本功能 // --------------包装后-------------- // 我是Benz, 具有基本功能 // 具有雷达功能
- 字符缓冲流
- BufferedInputStream
- BufferedOutputStream
- 两者都使用装饰设计模式, 构造方法接收InputStream和OutputStream对象
import java.io.*; public class Test { public static void main(String[] args) throws Exception{ BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("dsc.txt")); int len; while((len=bis.read()) != -1) { bos.write(len); } bis.close(); bos.close(); } }
FileReader 和 FileWriter
- 读
import java.io.*; public class Test { public static void main(String[] args) throws Exception{ FileReader reader = new FileReader("C:\\Users\\Dylan\\Desktop\\test.txt"); int ch; while ((ch=reader.read()) != -1) { System.out.println(ch); // 输出字符的十进制数字 System.out.println((char)ch); // 输出字符 } reader.close(); } }
- 写