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+  一次或多次(不包括零次)
- X{n}  恰好n次(X可以有多个,和为n次就可以)
- X{n,}  至少n次
- X{n, 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)
```


未完待续

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值