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

集合和数组

[外链图片转存失败(img-QwuIdtsA-1562552945737)(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  的区别

面试题

  • 共同点

底层都是哈希算法,都是双列集合

  • 区别
    • HashMap是线程不安全的,效率高,JDK1.2版本
         - Hashtable是线程安全的,效率低,JDK1.0版本
    • 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笔记的主要内容,如果未能解决你的问题,请参考以下文章

关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)

LeetCode Java刷题笔记—201. 数字范围按位与

java中byte的范围计算

day02 java基础学习笔记

和为S的连续正数序列

将浮点数组规范化到一定范围内,并在 Python 中保持符号