Java学习笔记
Posted 南笙一梦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记相关的知识,希望对你有一定的参考价值。
> 在这边文章下会不断更新自己在学习Java的过程中积累的知识、工具,插件等的内容,以备复习、查找和总结。
阿里开发的代码规范插件 p3c:https://github.com/alibaba/p3c (内含《阿里巴巴Java开发手册》)
# Java基础
#### Arrays类
- 类在java.util包下,方法直接使用
- 常用方法
- toString() 打印字符串
- sort() 排序方法
- binarySearch() 二分查找,如果查找数组里没有这个值,返回的数为负的插入点减一
#### 基本包装类
- 基本数据类型包装类有八种,其中其中都有parseXxx的方法,可以将这其中的字符串表现形式转换成基本数据类型
##### Integer类
- int转换成String字符串
```
int i = 100;
//方法一 *****
String s1 = i + "";
//方法二 *****
String s2 = String.valueOf(i);
//方法三
Integer i2 = new Integer(i);
String s3 = i2.toString();
//方法四
String s4 = Integer.toString(i);
```
- String转换成int
```
Srtring s = "200";
//方法一
Integer i = new Integer(s);
int i2 = i3.intValue();
//方法二 *****
int i3 = Integer.parseInt(s);
```
- Integer.equals()方法比较的是两个值
- == 比较是地址值
> - -128到127是byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取
> - 如果超过了byte取值范围,就会再创建对象
#### 正则表达式
- . 代表任意字符
##### [ ]代表单个字符
- [abc] : a、b或c
- [^abc] : 任何字符,除了a、b或c
- [a-zA-Z] : a到z或A到Z,两头的字母包括在范围内(并集)
- [a-z&&[def]] : d、e或f (交集)
- [a-z&&[^bc]] : a到z除了b和c(减去)
- \\d 数字:[0-9]
> \\ 是转义字符,如果想表示\\d,需要\\\\\\d
- \\D 非数字:[^0-9]
- \\s 空白字符:[\\t\\n\\x0B]
- \\t tab键,制表符
- \\n 换行
- \\x0B 垂直制表符
- \\f 翻页(可不看)
- \\r 回车
- \\S 非空白字符
- \\w 单词字符:[a-zA-Z_0-9]
- \\W 非单词字符:[^\\w]
##### Greedy数量词
- X? X出现一次或者一次也没有[abc]?
- X* 零次或多次(全部次数)
- X+ 一次或多次(不包括零次)
- Xn 恰好n次(X可以有多个,和为n次就可以)
- Xn, 至少n次
- Xn, m 至少n次,但是不能超过m次
##### 补充拓展
- 几种表达式样式
- 样式:“快快乐乐”,“高高兴兴”
``` regex = "(.)\\\\\\1()\\\\\\2"; ```
- 样式:“高兴高兴”,“快乐快乐”
``` regex = "(..)\\\\\\1";```
- 样式:“高兴快快乐快快快”
``` regex = "(.)\\\\1+";```
+代表的是第一组出现一次或多次
> String.split(); 切割字符串
> Integer.parseInt(s); s转换成整形数
> Arrays.sort(arr); 对数组进行排序
> StringBuilder.append(s + " "); //拼接字符串,不会产生垃圾
> String.replaceAll(String regex, String replacement); //正则表达式的替换功能
> ```eg:```
```
eg:
String s = "wo1ai2heima";
String regex = "\\\\d"
// \\d代表的是任何数字
String s2 = s.replaceAll(regex, "");
System.out.println(s2);
//输出结果: woaiheima
```
#### Math类
> Math类包含用于执行基本数学运算的方法,如初等指数,对数,平方根和三角函数
```
//圆周率
PI
//
E
```
```
//取绝对值
public static int abs();
```
```
//向上取整(进一)(结果是double值)
public static double ceil();
```
```
//向下取整
public static double floor();
```
```
//获取两个值中的最大值
public static double max(a, b);
```
```
//平方
public static double pow(double a, double b);
```
```
//Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.
//返回一个随机正数,大于0.0,小于1.0
public static double random();
//生成一个0~n的随机数(不包含n)
Random r = new Random();
r.nextInt(n);
```
```
//四舍五入
public static long round(double a);
public static int round(float a);
```
```
//开平方
public static double sqrt(double a);
```
#### System类
```
//垃圾回收
System.gc();
```
```
//非0状态是异常终止,退出jvm
System.exit(0);
```
```
//获取1970年1月1日到现在的毫秒值
System.currentTimeMillis();
```
#### BigInteger类 (了解)
> 可以让超过Integer范围内的数据进行运算
#### BigDecimal类
> 更精确的表述小数
```
//推荐使用 字符串 构造
BigDecimal bd1 = new BigDecimal(String s);
BigDecimal bd2 = BigDecimal.valueOf(double a);
```
#### Date类
> java.util;
> 大部分放大已经过时,精确值精确到毫秒
```
//获取系统的毫秒值,两个方法效果一致
Date.getTime();
System.currentTimeMillis();
```
#### SimpleDateFormat类
- DateFormat类
> DateFormat是SimpleDateFormat的父类
> DateFormat是一个抽象类
```
//获取一个系统时间
Date date = new Date();
//创建一个时间格式
SumpleDateFormat sdf = new SimpleDateFormat("yyy/MM/dd HH:mm:ss");
//输出的内容就是根据给定格式设置好的时间
System.out.println(sdf.format(date));
//一段时间字符串
String str = "******";
//创建一个时间格式
SumpleDateFormat sdf = new SimpleDateFormat("yyy/MM/dd HH:mm:ss");
//字符串即可转换成一个日期对象(注意抛出异常)
Date date = sdf.parse(str);
```
#### Calendar类
> Calendar类是一个抽象类
```
//c中存储着一组TEAR,MONTH,等的数据
Calendar c = Calendar.getInstance();
//输出想要的到的数据
System.out.println(c.get(Calendar.YEAR));
```
> 月份时间是 真实月份-1
## 集合和数组
![image](https://thumbnail0.baidupcs.com/thumbnail/7cfb8127dd5f3723def120e7bb165781?fid=537476551-250528-914274326953531&time=1533733200&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-D%2FfYdmBZGcukujfXJKwDBhfbpNs%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=5100113494573933523&dp-callid=0&size=c710_u400&quality=100&vuk=-&ft=video)
### Collection
#### Collection的基本方法
> Collection是一个接口
- 向集合中添加元素
```
boolean add(E e);
//add方法如果是List集合,一直返回true,以为List集合中是可以存储重复元素的
//如果是Set集合,当存储重复元素的时候,就会返回false
```
- 删除指定元素
```
boolean remove(Object o);
```
- 清空元素
```
void clear();
```
- 是否包含指定元素
```
boolean contains(Object o);
```
- 判断是否为空
```
void isEmpty();
```
- 获取元素个数
```
int size();
```
- 取交集,如果调用的集合改变了,返回true;如果没改变,返回false
```
boolean retainAll(Collection c);
//方法会将c中的数组覆盖到调用此方法的集合中
```
#### List的基本方法
> List是一个接口
- 向指定位置添加元素
```
void add(int index, Eelement e);
//index是位置,e是元素
//使用不存的索引时,会出现索引异常
```
- 删除指定位置元素
```
E remove(int index);
//将被删除的元素返回
```
#### 数据结构之数组和链表
##### 数组
- 查询快,修改也快
- 增删慢
##### 链表
- 查询慢,修改也慢
- 增删快
#### List三个子类的特点
##### ArrayList
- 底层数据结构是数组,查询快,增删慢
- 线程不安全,效率高
#### LinkedList
- 底层数据结构是链表,查询慢,增删快
- 线程不安全,效率高
##### Vector
- 底层数据结构是数组,查询快,增删慢
- 线程安全,效率低
##### Vector ArrayList LinkedList 比较
- Vector 和 ArraList 的区别
> - Vector是线程安全的,效率低
> - ArrayList是线程不安全的,效率高
> - 共同点:都是数组实现的
- LinkedList 和 ArraList 的区别
> - LinkedList底层是链表结构的,增删较快,查询修改比较慢
> - ArrayList底层是数组结构的,增删较慢,查询修改不较快
> - 共同点:都是线程不安全的
##### 使用特点
- 查询多用:ArrayList
- 增删多用:LinkedList
- 如果都多:Arraylist
### 泛型
#### 泛型的基本特点
##### 泛型的好处
- 调高安全性(将运行期的错误转换到编译期)
- 省去强转的麻烦
##### 泛型的基本使用
- <>中放的必须是引用数据类型
##### 泛型使用注意事项
- 前后的泛型必须一致,或者后边的泛型可以省略不写
> 1.7版本的新特性,菱形泛型
- 泛型最好不要定义成Object,没有意义
- 方法泛型最好与类的泛型一致;如果不一致,需要在方法上生命该泛型
- 静态方法必须生命自己的泛型
```
public static<Q> void print(Q q)
System.out.println(q);
```
- 泛型通配符<?>
> 任何类型,如果没有明确,那么就是Object以及任意的Java类
- ? extends E
> 向下限定,E及其子类
- ? super E
> 向上限定,E及其父类
#### 增强for循环概述
- 格式
```
for(元素数据类型 变量 :数组或者Collection集合)
使用变量即可,该变量就是元素
//fore eclipse快捷键
```
#### 静态导入
```
import static 静态方法
//容易同名,意义不大,看懂就行
```
#### 可变参数
##### 1.概述
- 定义方法的时候不知道该定义多少个参数
##### 2.格式
- 修饰符 返回值类型 方法名(数据额类型...变量名)
```
public void function(int ... arr)
public void function(int[] arr)
```
##### 3.注意事项
- 这里的变量其实是一个数组
- 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
#### asList方法
##### 1.概述
- 数组转换成集合
##### 2.使用
- 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法(除了增加,减少)
- 基本数据类型的数组,会将整个数组当做一个对象
- 将数组转换成集合,数组必须是引用数据类型
##### 3.复习-集合转换成数组(加泛型的)
- 当即和转换成数组时,
- 数组长度如果是小于等于集合的size时,转换后的数组长度为size
- 数组长度如果是大于集合的长度size时,转换后的数组长度为你指定的长度
```
ArrayList<String> list = new ArrayList<>();
String[] arr list.toArray(new String[2]);
```
#### 集合嵌套
##### ArrayList嵌套ArrayList
- 格式
```
ArrayList<ArrayList<Person>> list = new ArrayList<>;
```
- 数据增加
```
list.add(new Person("张三", 23)
```
- 遍历用循环嵌套
```
for(Arraylist<Person> a : list)
for(Person b : a)
System.out.println(b);
```
---
#### HashSet
- 创建HashSet对象
```
HsahSet<String> hs = new HashSet<>();
hs.add();
//增加内容
//当向set集合中存储重复元素的时候,返回为false
//存取对象时不会检测重复,因为记录的是地址(见下节)
```
- HashSet的继承体系中有重写toString方法
- Set集合,无索引,不可重复,无序(存取不一致)
#### HashSet存储自定义对象,保证元素唯一性
- 重写hashCode和equls方法,可以系统自动生成
- 为什么prime=31?
1. 31是个质数,质数只能被1和自己本身整除的数
2. 31这个数既不大也不小
3. 31这个数好算,2的五次方-1,2向左移动5位减一
#### LinkHashSet
- 底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象
- 实现怎么存就怎么取
- 元素唯一,与HashSet原理一致
#### TreeSet
##### 1.使用
- TreeSet集合是用来给元素排序的
- 可以保证元素唯一
- 简单数据类型不需要???
- 自定义对象类,需要重写Comparator类的int compareTo(T o)return 0;方法
- 当compareTo方法返回0的时候,集合中只有一个元素
- 当comparaTo方法返回正数的时候,集合怎么存就怎么取
- 当comparaTo方法返回负数的时候,集合会倒叙存储
> 补充:String类中已经重写了compareTo()方法,所以在重写TreeSet方法比较多个数据时,可以直接使用(String.compareTo(String)
```
@Override
public int compareTo(自定义对象名 obj)
int num = this.age - obj.age;
//优先比较年龄
return 0 ? this.name.compareTo(obj.name);
//次要比较条件,姓名
```
##### 2.基本原理
- 底层是二叉树
- 小的存左边(负数)
- 大的存右边(正数)
- 相等就不存(0)
> String.compareTo按照字典顺序排序字符串
#### Map集合
##### 概述和特点
- Map接口概述
- 将键映射到值的对象
- 一个映射不能包含重复的键
- 每个键最多只能映射到一个值
- Map接口 和 Collection接口的不同
- Map是双列的,Collection是单列的
- Map的键唯一,Collection的子体系Set是唯一
- Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
##### 功能概述
- 添加功能
```
//添加元素
V put(K key, V value)
//如果键不是第一次存储,就用现在的值把以前的值覆盖掉
```
- 删除功能
```
void clear()
//移除所以的键值对元素
V remove(Object key)
//根据键删除键值对应的元素,并返回元素值
```
- 判断功能
```
boolean containsValue(Object key)
//判断集合是否包含指定的值
boolean containValue(Object Value)
//判断集合是否包含指定的值
boolean isEmpty();
//判断集合是否为空
```
- 获取功能
```
Set<Map.Entry<K,V>> entrySet();
V get(Object key)
//根据键获取值
Set<K> keySet()
//获取集合中所有键的集合
Collection<V> values()
//获取集合中所有值的集合
```
- 长度功能
```
int size()
//返回集合中的键值对的个数
```
##### 循环遍历方法
> Map中没有迭代器Interator
```
//法一
for(String key : map.keySet())
System.out.println(key+ "+" + map.get(key));
//法二 **************
for(Map.Entry<String, Integer> en : map.entrySet())
Sysotem.out.println(en.getKey() + "+" + en.getValue);
for(Entry<String, Integer> en : map.entrySet())
Sysotem.out.println(en.getKey() + "+" + en.getValue);
```
#### ==HashMap 与 Hashtable 的区别==
> 面试题
- ##### 共同点
底层都是哈希算法,都是双列集合
- ##### 区别
1. - HashMap是线程不安全的,效率高,JDK1.2版本
- Hashtable是线程安全的,效率低,JDK1.0版本
2. - HashMap可以存储null键和null值
- Hashtable 不可以存储null键和null值
#### Collections工具类
##### 常用方法
```
//排序
public static <T> void sort(List<T> list)
//二分查找法
public static <T> int binarySearch(List<?> list,T key)
//如果未查找到搜索键,返回(-(插入点)-1)
//获取集合中的最大值
public static <T> T max(Collection<?> coll)
//翻转集合
public static void reverse(List<?> list)
//随机置换(洗牌)
public static void shuffle(List<?> list)
```
未完待续
以上是关于Java学习笔记的主要内容,如果未能解决你的问题,请参考以下文章