1.Java进阶总结 前期 1~4

Day01

1. Object类:所有类的父类
  1 Object类中toString方法: sout方法就是调用了toString方法,一般重写toString方法得到内容
  2 Object类中equals方法 :
 【Objects类方法】Objects.equals(a,b) 优化 判断是否相等空指针的问题【Object类方法】 a.equals(b)
3.public static <T> T requireNonNull(T obj):查看指定引用对象不是null。
等同于下面这代码,下次代码合法性判断就不用写下面这个方法,就直接用Objects.requireNonNull()非空判断
public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}
2. Date类:日期类
java.util.Date类 表示特定的瞬间,精确到毫秒。
public Date():分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
public long getTime() 把日期对象转换成对应的时间毫秒值。
3. DateFormat类:日期类和字符串之间可以转换
 1.java.text.DateFormat 是日期/时间格式化子类的抽象类【不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。】
完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
 2.java.text.SimpleDateFormat中的构造方法public SimpleDateFormat(String pattern)
参数pattern是一个字符串,代表日期时间的自定义格式。最常用: DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 3.DateFormat类的常用方法有:
public String format(Date date):将Date对象格式化为字符串。
public Date parse(String source):将字符串解析为Date对象。
代码参考day01【Object类、常用API】
4.Calendar类:日历类的出现就很少用日期类,格式的定义
1.Calendar为抽象类,而是通过静态方法创建,返回子类对象,如下:

Calendar静态方法

public static Calendar getInstance():使用默认时区和语言环境获得一个日历
常用方法
根据Calendar类的API文档,常用方法有:

public int get(int field):返回给定日历字段的值。
public void set(int field, int value):将给定的日历字段设置为给定值。
public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
5.System类:包含大量与系统操作的类
常用的方法有:

public static long currentTimeMillis():返回以毫秒为单位的当前时间。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):
将数组中指定的数据拷贝到另一个数组中。
6.StringBuilder类:与对String类的优化,相当于Sring的字节缓冲区,可以调用方法进行改变序列的长度和内容
java.lang.StringBuilder

根据StringBuilder的API文档,
常用构造方法有2个:
public StringBuilder():构造一个空的StringBuilder容器。
public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去

StringBuilder常用的方法有2个:

public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。
public String toString():将当前StringBuilder对象转换为String对象。
public StringBuilder reverse() 将内容进行反转
7.包装类:基本类型与对应的包装类,进行装箱和拆箱。
1.由来:基本数据类型使用起来很方便,但是没有对应的方法操作这些数据,
      所以我们用这个类,把基本数据类型包装起来,这个类叫做包装类。
       包装类中定义一些方法,用来操作基本数据类型的数据。

2.   装箱:把基本类型的数据,包装到包装类中(基本类型的数据->包装类)
        构造方法:
            Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值。
            Integer(String s) 构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
                传递的字符串,必须是基本类型的字符串,否则会抛出异常 "100" 正确  "a" 抛异常
        静态方法:
            static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
            static Integer valueOf(String s) 返回保存指定的 String 的值的 Integer 对象。
    拆箱:在包装类中取出基本类型的数据(包装类->基本类型的数据)
        成员方法:
            int intValue() 以 int 类型返回该 Integer 的值。

3.    自动装箱与自动拆箱:基本类型的数据和包装类之间可以自动的相互转换
    JDK1.5之后出现的新特性

4.1 基本类型与字符串类型之间的相互转换
    基本类型->字符串(String)
        1.基本类型的值+""  最简单的方法(工作中常用)
        2.包装类的静态方法toString(参数),不是Object类的toString() 重载
            static String toString(int i) 返回一个表示指定整数的 String 对象。
        3.String类的静态方法valueOf(参数)
            static String valueOf(int i) 返回 int 参数的字符串表示形式。
4.2 字符串(String)->基本类型
        使用包装类的静态方法parseXXX("字符串");
            Integer类: static int parseInt(String s)
            Double类: static double parseDouble(String s)

8.Arrays类:java.util.Arrays
public Sring toString(int [] a) 将数组的内容已字符串的形式打印出来
9.String类:java.lang.String
public char[] toCharArray]() 将数组的内容已字符串的形式打印出来
public int length()获取长度
public char charAt(int index) 获取索引处的char值

Day02

1.Collection集合
1. 容器有集合和数组,集合存储不同类型的对象,数组存储同一类型的元素
2. 集合 :单列集合根接口Collection和双列集合根接口Map 
3. 单列集合两个子接口:List(有序·可重复) (实现类:Arraylist和LinkedList,Vector集合继承List接口)
                      Set(无序·不重复)(实现类:HashSet和TreeSet,LinkedHashSet继承实现类HashSet)
4.双列集合根接口Map :
image.png

image.png
java.util.Collection 类常用的方法
增
public boolean add(E e)`:  把给定的对象添加到当前集合中 。
删
public boolean remove(E e)`: 把给定的对象在当前集合中删除。
public void clear()` :清空集合中所有的元素。
查
public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
public boolean retainAll(Collection<?> c)`: 仅保留此 collection 中那些也包含在指定 collection 的元素
【保留两个集合的交集】
空
public boolean isEmpty()`: 判断当前集合是否为空。
等
public boolean equals(E e):比较此 collection 与指定对象是否相等
数
public int size()`: 返回集合中元素的个数。
public Object[] toArray()`: 把集合中的元素,存储到数组中。

其他可选用
增
public boolean addAll(Collection<? extends E>) 指定 collection 中的所有元素都添加到此  
删
public boolean removeAll(Collection<? extends E>)`: 把给定的对象在当前集合中删除。
查
public boolean containsAll(Collect<?> e)`:collection 包含指定 collection 中的所有元素,则返回 true
2.迭代器:用于迭代访问(即遍历)Collection中的元素
3.增强for:专门用遍历数组和集合的,其实是个Iterator迭代器,在遍历的过程中,不能对集合中的元素进行增删操作。
4.泛型:1.含有泛型的类 2.含有泛型的方法 3.含有泛型的接口 4.泛型的通配符
4.1含有泛型的类
含有泛型的类:
修饰符 class 类名<代表泛型的变量> {  }
class ArrayList<E>{ 
    public boolean add(E e){ }

    public E get(int index){ }
    ....
}
4.2 含有泛型的方法

定义格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }

例如,使用格式:调用方法时,确定泛型的类型

public class MyGenericMethod {    
    public <E> void show(E e) {
        System.out.println(mvp.getClass());
    }
    
    public <E> E show2(E e) {   
        return e;
    }
}
4.3 含有泛型的接口
格式 :修饰符 interface接口名<代表泛型的变量> {  }

public interface MyGenericInterface<E>{
    public abstract void add(E e);
    
    public abstract E getE();  
}

1、定义类时确定泛型的类型 

public class MyImp1 implements MyGenericInterface<String> {
    @Override
    public void add(String e) {
        // 省略...
    }

    @Override
    public String getE() {
        return null;
    }
}

2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型

public class MyImp2<E> implements MyGenericInterface<E> {
    @Override
    public void add(E e) {
         // 省略...
    }

    @Override
    public E getE() {
        return null;
    }
}

/*
 * 使用
 */
public class GenericInterface {
    public static void main(String[] args) {
        MyImp2<String>  my = new MyImp2<String>();  
        my.add("aa");
    }
}

4.4 泛型的通配符<?>
1.泛型的通配符的基本使用:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
比如下面的test(ArrayList<?> list)方法 ,同时接受String 和Integer类型 就用通配符来解决接受类型的问题。


public class GenericMethod {
    public static void main(String[] args) {
        ArrayList<String> stringlist = new ArrayList<>();
        stringlist.add("Hello");
        stringlist.add("Java");

        ArrayList<Integer> integerlist =new ArrayList<>();
        integerlist.add(1);
        integerlist.add(2);
        
        test(stringlist);
        test(integerlist);
    }
    public static  void  test(ArrayList<?> list){
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

2.通配符高级使用----受限泛型 【能看懂即可】
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类

泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型

// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}

Day03

1.数据结构
1.栈 :弹夹,先进后出
2.队列:排队,先进先出
3.数组:在内存中开辟一段连续的空间
        查找元素快:通过索引,可以快速访问指定位置的元素
        增删元素慢:需要创建新数组开辟新内存,把原数组元素根据索引复制到新数组索引对应的位置
4.链表:一个节点由数据域和指针域组成
        查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
        增删快:只需要修改元素的指针域即可。
5.二叉树:是每个结点不超过2的有序树(tree) 。左子树小,右子树大
              :红黑树:趋近平衡树,查找速度特别快
2.List集合 【ArrayList(查询),LinkedList(增删,有大量首尾操作的方法)】
特点:存取有序,可重复,有索引

常用方法(继承Collection接口所有的方法,还有一些根据索引操作集合特有方法):
【特有的方法:】
public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E get(int index) :返回集合中指定位置的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

1.ArrayList集合:元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。
2.LinkedList集合:实际开发中对一个集合元素的添加与删除经常涉及到首尾操作LinkedList提供了大量首尾操作的方法。

 【LinkedList 特有方法 了解即可】
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public void push(E e) :将元素推入此列表所表示的堆栈。等同于 addFirst();

public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。

public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。相当于removeFirst()  

public boolean isEmpty() :如果列表不包含元素,则返回true。

Vector 与 List 不同 
List和Vector(都是接口),因为使用是的功能或者调用的方法都是差不多的,那么大家就会去找它们的区别。
1、List是在jdk1.2以后推出的,而Vector是在jdk1.0推出的
2、List采用的是异步处理方式,性能高,而Vector采用的是同步处理方式,性能低
3、List属于非线程安全,Vector属于线程安全
简单点说就是:
如果你需要考虑到性能高一点,快速一点,又不需要考虑线程,那么就用List,反之用Vector

3.Set集合【HashSet,LinkedHashSet】
特点:无序(存取顺序可能不一致),不重复
原理:用add()方法会调用元素的hashhode方法和equals方法,判断元素是否重复,
       如果自定义类,必须重写hashCode方法和equals方法
 1.HashSet 底层是一个哈希表,查询特别快
 2.哈希表:1.8之前 哈希表 = 数组+链表 1.8之后 哈希表 = 数组 + 链表 (长度大于8 自动转换成红黑树),
          数组存储对象的哈希值,对象的内容通过链表/红黑树连接一起
  哈希值:一个十进制的整数,系统随机给对象的地址值,是模拟出逻辑地址,不是数据存储的实际物理地址 
  Object类有一个int hashCode()返回对象的哈希码值 ,toString()返回的是十六进制的,将十六进制转十进展就是哈希值。
4.LinkedHashSet:有序的不可重复
哈希表
4.可变参数
类型已知,传入参数个数不确定用可变参数定义,可变参数底层原理是数组
注意事项:1.只能有一个可变参数 举例1,
          2.如果方法参数有多个,那么可变参数必须写在参数列表的末尾见 举例2 
          3.可变参数的终极写法 举例3
举例1.
 public static void demo01 (int...arr){}
举例2.
 public static void demo02 (String a,double c,int...arr){ }
举例3.
 public static void demo03 (Object...objs){}
5.Collections

1.java.utils.Collections是集合工具类
用来对集合进行操作。部分方法如下:

public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
1.sort方法实现Comparable接口中的compareTo的方法,
 如果要自定义类实现集合的排序,需要继承Comparable接口,重写compareTo方法。
2.
    - java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
        public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
     Comparator和Comparable的区别
        Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
        Comparator:相当于找一个第三方的裁判,比较两个,重写compareTo()方法
    Comparator的排序规则:
        o1-o2:升序

Day04

1.Map【HashMap,LinkedHashMap】
1.HashMap集合和LinkedHashMap的特点:
1.HashMap集合底层是哈希表:查询的速度特别的快
           JDK1.8之前:数组+单向链表
           JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
 2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
         java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
        LinkedHashMap的特点:
1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
2.Map接口常用方法:
public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key) 判断集合中是否包含指定的键。
public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
3.Hashtable
  java.util.Hashtable<K,V>集合 implements Map<K,V>接口

    Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
    HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快

    HashMap集合(之前学的所有的集合):可以存储null值,null键
    Hashtable集合,不能存储null值,null键

    Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
    Hashtable的子类Properties依然活跃在历史舞台
    Properties集合是一个唯一和IO流相结合的集合
4.Debugger
  Debug调试程序:
        可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug
    使用方式:
        在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)
        右键,选择Debug执行程序
        程序就会停留在添加的第一个断点处
    执行程序:
        f8:逐行执行程序
        f7:进入到方法中
        shift+f8:跳出方法
        f9:跳到下一个断点,如果没有下一个断点,那么就结束程序
        ctrl+f2:退出debug模式,停止程序
        Console:切换到控制台
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 常用API 参考资料: WIKI教程[https://iowiki.com/java/lang/] 码工具(推荐)...
    多氯环己烷阅读 685评论 0 2
  • 今天在看了好多个集合帖子后发现讲的都是一半一半的,这下就逼死我这个强迫症患者了.于是自己写点,有不足之处还望各位道...
    迷迷糊糊m阅读 196评论 0 0
  • 接口/抽象类意义规范、扩展、回调为其子类提供一个公共的类型 封装子类中得重复内容 定义抽象方法,子类虽然有不同的实...
    MigrationUK阅读 2,156评论 1 28
  • 1、Collection 集合和数组的区别 集合 是一个容器,只能存放引用数据类型 集合中的数据可以是不同数据类型...
    71fd3a0d6e62阅读 492评论 0 0
  • Java常见面试题总结 @Date 2016.06.22 Java基础知识 1.Java 中应该使用什么数据类型来...
    voltric阅读 1,090评论 0 2