1. 包装类
(基本类型中没有多少我们能够使用的方法和属性,为了便捷我们需要自己去写)
针对每一种基本类型提供了对应的类的形式 --- 包装类
 
byte short int long float double char boolean void
Byte Short Integer Long Float Double Character Boolean Void
void 是一个最终类,不能被实例化。
 
 
 
package cn.tedu.baozhuang;

public class IntegerDemo1 {

    public static void main(String[] args) {

        int i = 7;
//封箱
Integer in = new Integer(i); //自动封箱,都是 JDK1.5 的特性
//其实就是在底层默认调用 Interger 类身上的静态方法 valueOf,Double Boolean 这些也是这样的!!
//Integer in2 = Integer.valueOf(i);
Integer in2 = i; Integer in3 = new Integer(5);
//自动拆箱,在底层调用对象身上的 IntegerValue()
//in3.IntegerValue();
int i3 = in3; }
}
 
当把基本类型的变量直接赋值给对应的引用类型的对象,--- 自动封箱,底层是调用了对应类身上的 valueOf() 方法
当把引用类型的对象直接赋值给对应的基本类型的变量,---自动拆箱,底层是调用了对应类身上的***Value() 方法,
 
package cn.tedu.baozhuang;

public class IntegerDemo2 {

    public static void main(String[] args) {

        //Integer i1 = Integer.valueOf();
//如果这个值不在 -128~127 底层的 valueOf() 调用构造方法 new 一把,返回一个新对象!!!
//如果在 -128~127,从 cache 数组中对应下标位置上取值。
Integer i1 = 50;
Integer i2 = 50; System.out.println(i1 == i2); Integer in = 400;
int i = 400;
//包装类和基本类型比较时,会进行自动拆箱成基本类型
System.out.println(in == i); } }
四种整数型都有范围判断(-128~127),float 就没有,直接 new 了!
 
 
注意:凡是 Number 的子类都会提供将字符串转化为对应类型的构造方法
 
 
 
包装类产生的对象的哈希码是固定的,不随环境改变。
 
注意:字面量的哈希码不随环境不随系统而改变
 
 
 
2. 数学类
(是在代码中调用 Java 中写好的数学类)
 
Math --- 最终类,针对基本类型提供了基本的数学运算
BigDecimal --- 能够精确运算,要求参数以字符串形式传递
 
几个比较重要的方法对应如下代码:
package cn.tedu.math;

import java.util.Random;

public class MathDemo1 {

    public static void main(String[] args) {

        System.out.println(Math.abs(-5.86));
//求立方根
System.out.println(Math.cbrt(8)); //向上取整,返回一个double 类型的数据
System.out.println(Math.ceil(4.06)); //向下取整,都是返回double 类型的
System.out.println(Math.floor(4.06)); //四舍五入,返回一个 long 类型的
System.out.println(Math.round(3.68)); //返回一个[0,1)的一个随机小数
System.out.println(Math.random()); //获取 30-90 一个随机整数
System.out.println((int)(Math.random()*61+30)); //获取 0-30的数,只能是整数
Random r = new Random();
System.out.println(r.nextInt(30)); //抽奖系统,实际上要考虑权重问题(就是让那种经常到这里消费的人的概率高一些)
if(Math.random() * Math.random() > 0.95){
System.out.println("亲,恭喜你中奖啦!");
}
} }
两个很大的数相乘,用一个数组存放。
int[ ] arr1 = new int[ n ];
int[ ] arr2 = new int[ n ];
int[ ] result = new int[ 2*n ];
 
for(int i = 0; i < n; i++){
    for(int j = 0;  j < n; j++){
        int r = arr1[i] * arr2[j] + result[ i+j ];//是一个暂时的数,用于后面分别存放,是i+j位的数(其实就是上一位的 i + j +1 位)
        result[ i+j ] = r % 10;  //表示第 i + j 位的结果
        result[ i+j+1 ] = r / 10; //表示第 i + j + 1 位结果,用于表示进位
    }
}
 

3. Calender --- 抽象类
 
JDK1.8的特性:简书,51CTO,是以讹传讹,自己试试是不是正确。最准确的是别人的官网!!
Map<String, Integer> map = {"a":1, "b":2};   //别人说都没有说

package cn.tedu.time;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; public class DateDemo { public static void main(String[] args) throws Exception { //获取当前时间
System.out.println(new Date().toString()); //获取指定时间
//这个方法在 1990-01的基础上进行累加
@SuppressWarnings("deprecation")
//压制警告
//这个方法已过时
Date date = new Date(2000,2,9);
System.out.println(date); //将字符串转化为日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = sdf.parse("2000-12-15 18:58:45");
System.out.println(date1); //将日期转化为字符串
//XX年XX月XX日
SimpleDateFormat sdf2 = new SimpleDateFormat("yy年MM月dd日 HH时mm分ss秒");
String str = sdf2.format(date1); //格里高利历(GregorianCalendar),毫秒值(time=1534494939307),偏移量---表示当前时期到零时区的毫秒值(offset=28800000)
//WEEK_OF_MONTH=3(不完全周) DAY_OF_WEEK_IN_MONTH=3
// Calendar } }
 
1. 时间包
在 JDK 1.8 中对时间体系进行了全新的详细的划分,LocalDate,LocalTime
 
 
 
 
 
package cn.tedu.time;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit; public class LocalDateDemo { public static void main(String[] args) { //LocalDate 是一个只包含日期,不包含时间
LocalDate date = LocalDate.now();
System.out.println(date); //
LocalDate date1 = LocalDate.of(2014, 7, 8); //向后加几个
System.out.println(date.plus(7,ChronoUnit.WEEKS));//表示周
System.out.println(date.minus(8,ChronoUnit.MONTHS)); System.out.println(date1.getDayOfMonth()); //在某一个日期的后面吗
System.out.println(date1.isAfter(LocalDate.now())); //判断闰年
System.out.println(date1.isLeapYear()); } }
2. 异常
ArithmeticException    --- 运行时异常(比如 1/0)
ArrayIndexOutOfBoundsException  ---(数组下标越界),运行时异常(a[10])
NullPointerException ---- 运行时异常(str=null ,str.length())
ClassCastException  --- 运行时异常(String str = (str)o;)
StringIndexOutOfBoundsException  ---运行时异常
NumberFormatException   ---运行时异常(new Integer("abc"))
CloneNotSupportedException --- 编译时异常(new ExceptionDemo().clone())
UnSupportedEncodingException --- 不支持编码异常(在getBytes() 中就是这样,要抛异常)--- 编译时异常("abc".getBytes("abc");)
ParseException(在simpledateFormat() 参数没有指定时间格式) --- 编译时异常(new simpleDateFormate("yyyy").parse("2012");)
       
  ---异常是 Java 中用于问题处理的一套逻辑
 
运行时异常非得来处理一下,就使用try-catch(){} 捕获一把!!
 
throws PathNotExistException  //告诉调用方法的对象,
 
2.1 Throwalbe --- 异常的顶级父类
        Error --- 错误表示合理(无论在语法上还是在逻辑上都是正确的)的应用程序中出现了严重的问题,而且这个问题不应该试图捕获。 --- 意味着错误一旦出现不能处理。 --- StackOverflowError(递归层次太深,超过了范围),OutOfMemory(堆内存的分配上) 是在虚拟机错误的子类!!
        Exception --- 表示合理的应用程序想要捕获的问题,也因此可以处理。
            编译时异常:在编译时期就已经出现要求处理。必须处理。
            运行时异常:在运行时期出现要求处理。可以处理可以不处理  --- RuntimeException (运行时异常的小父类)
2.2 异常捕获方式
A. 如果多个异常的处理方式各不一样,可以使用多个catch分别捕获分别处理
B. 如果多个异常的处理方式是一样的,可以捕获它们的父类来进行处理
C. 如果多个异常进行了分组,那么同一组的异常之间用 | 隔开进行分组处理 --- 从 JDK1.7 开始(一个分组处理的过程,一个 catch 中写两个异常,中间用 | 分开就行)
(注意:如果先捕获了父类,那么它的子类不能捕获,所以要先子后父)
 
总结:方法的重载和方法的重写
重载:方法名相同,参数列表不同,可以有抛出所有的异常
重写:方法名,参数列表相同,方法体不同,只能抛出比父类范围更小的异常。
方法的重载和重写都是行为多态。
方法重载是指在同一个类中,方法名一致而参数列表不同的方法,和修饰符、返回值类型以及异常没有关系。重载本身是一种编译时多态。
方法的重写指在父子类中存在方法签名一致的非静态方法。子类在重写父类方法的时候,子类权限修饰符的范围要大于等于父类的权限修饰符的范围。如果父类中的方法的返回值类型的基本类型
 
注意:异常一旦抛出,后面的代码就不再运行。主方法中处理了就接着执行下面的代码(主函数是 jvm 调用,相当于把异常抛给了 jvm,会打印栈轨迹)。
(看栈轨迹:先看异常的名字(Number),再看冒号后面的那个异常信息(告诉你什么出错了),接着看一个异常的栈轨迹(你写的一个代码,调用别人的,别人再调用别人的,最后在java最底层,你是最后一个拿到的,所以栈轨迹首先出现的是在 Java 底层。你能够改的是你自己的,所以要栈轨迹要倒着看))e.printStatckTrace() //打印栈轨迹
 
finally  (读文件无论成功与否,都要将文件关闭) --- 无论出现异常与否都要执行一次
 
如果在项目开发期间遇到异常,记录栈轨迹,找异常来源进行改正;如果项目已经上线,记录错误日志(是记录项目运行信息的,在某个链接上卡死,为后续统一工作提供参考),往往跳转错误页面(点进去就网页丢失了,)
 
3. 集合  ---  Collection
(购物车,把东西加到购物车中,每个人买的东西不一样,容器也不一样)
存储多个统一类型的数据的容器 --- 大小不固定
 
3.1 <E> - 泛型 - 在集合中的作用是用于表示元素类型。- 由于泛型的限制,集合中只能存储对象。
String[] arr; arr 的数据类型是数组,元素类型是String
Collection<String> c; c 的数据类型是集合,元素类型是 String。
 
Collection<int[]> c; --- 表示集合中存储的是数组。int[] 是一个引用类型,也是对象。
 
3.2  List - 列表
有序(保证元素的存入顺序)的集合。怎么放就怎么拿出来。 --- 存在了下标,因此能够通过下标来操作这个列表。
package cn.tedu.collection;

import java.util.ArrayList;
import java.util.List; public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); //保证元素的存入顺序
list.add("xiaofang");
list.add("daqiang");
list.add("weichang");
list.add("dadaxu"); //截取子列表 //获取指定元素在列表中第一次出现的位置 //遍历这个列表,是size
for(int i = 0; i < list.size(); i++)
System.out.println(list.get(i)); //向列表的指定的下标插入指定的元素,原位置就移到下一个位置上了,
//放在元素末尾,就是追加了,可以的,但是不能向末尾后面增加,不然就数组下标越界异常!!(移除超过了也会报这个异常)
list.add(2,"插入了");
System.out.println(list); //替换指定位置上的元素,移除这个再插入一位,也有自己的set
list.set(2,"替换了");
System.out.println(list); //比较两个列表的时候是逐位比较是否一致,元素中是new String("xiaoqiang")也是正确的!! } }
 
3.2.1 ArrayList - 顺序表
 
异常的顶级父类是 Throwable。
异常的捕获方式:多个catch;捕获父类,统一处理;将同一组异常之间用 | 隔开,分组处理 --- JDK1.7
 
1. List<E>中的元素是可以重复的。
1.1 ArrayList 扩容是增加一半,是通过右移实现的。增删操作相对复杂,查询操作相对简单。内存空间是连续的。是一个线程不安全的列表!!
 
1.2 LinkedList - 链表
基于节点(Node)来实现的。利用节点来存储数据以及维系链表之间每一个节点的关系。增删操作相对简单,查询操作相对复杂。内存空间不连续。随用随开辟,不需要初始容量。是一个线程不安全的。
 
 
2. Vector - 向量
最早的列表,依靠数组存储数据,初始容量默认是10。每次扩容默认增加两倍(也可以默认初始和增量)。是一个线程安全的列表。
elements() 返回迭代器(一个集合中有很多的元素,通过下标遍历是间接的过程,Java中提供了直接获取的方法,就是这个迭代器)
迭代器:创建指针,通过指针的移动就获取那个元素,指定谁谁就上。每挪动一次,都要判断 hasMoreElements(),找下一个是 nextElement()(候诊室叫号,有人的话就叫下一个)??nextElement()
关于 nextElement() 查看API文档得知是返回这个元素的下一个元素,因为之前在 while 循环中判断了后面是否还有元素,所以在这一步是到不了最后那个元素的,所以不用考虑。
又去百度了一下,说的是nextElement() 如果 Enumeration 中是第一个元素,就取这个,接着联合 hasMoreElement()可以一次取下一个元素。
 
2.1 Stack - 栈
继承了Vector。遵循后进先出/先进后出的原则。(比如往盒子里放东西,从上往下挪,最后诺进去的东西就先拿出来)。最先放入栈中的元素 ---栈底元素,最后放入栈中的元素 --- 栈顶元素。将元素放入栈中 --- 入栈/压栈,将元素从栈中取出 --- 出栈/弹栈。
练习:使用数组/节点完成一个Stack --- empty peek pop push search
 
3. Set - 散列集合
包含的元素不重复。
 
3.1 HashSet
不包含重复的元素,不保证元素的存储顺序。底层基于HashMap来进行数据的存储。默认初始容量是16,默认加载因子是 0.75f。
HashMap 底层是基于数组 + 链表结构
 
 
3.2 TreeSet - 对元素进行整体的自然排序(升序),需要这个元素对应的类实现 comparable 接口
 
Comparator --- 用于给某个对象单独指定规则。
 

Java API 之集合的更多相关文章

  1. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  2. JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14

    一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...

  3. Elasticsearch的CRUD:REST与Java API

    CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...

  4. Java 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

  5. (转)Java API设计清单

    转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...

  6. Java API 快速速查宝典

    Java API 快速速查宝典 作者:明日科技,陈丹丹,李银龙,王国辉 著 出版社:人民邮电出版社 出版时间:2012年5月 Java编程的最基本要素是方法.属性和事件,掌握这些要素,就掌握了解决实际 ...

  7. Spark基础与Java Api介绍

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3832405.html  一.Spark简介 1.什么是Spark 发源于AMPLab实验室的分布式内存计 ...

  8. mybatis Java API

    既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyB ...

  9. Java数据库连接代码集合(转)

    Java数据库连接接口(JDBC)是Java里定义的一套用于数据库连接和操作的API的集合.有不同的数据库厂商提供这套接口的实现类,对于 Java程序员来说,程序员不需要关心数据库的底层的实现,统一的 ...

  10. Java基础--说集合框架

    版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...

随机推荐

  1. 别再被多线程搞晕了!一篇文章轻松搞懂 Linux 多线程同步!

    前言 大家有没有遇到过,代码跑着跑着,线程突然抢资源抢疯了?其实,这都是"多线程同步"在作怪.多线程同步是个老生常谈的话题,可每次真正要处理时还是让人头疼.这篇文章,带你从头到尾掌 ...

  2. 前段生成二维码下载,打印 QrCode

    首先引用js,一个是生成二维码一个是调用打印 2.直接上代码 <div class="container-div"> <div id="qrcodeCa ...

  3. IPC最新发行了新标准:IPC-A-610J, IPC-J-STD-001J, IPC-7711/21D, IPC-2221C

    IPC最新发行了新标准:IPC-A-610J, IPC-J-STD-001J, IPC-7711/21D, IPC-2221C     2024年伊始,IPC又更新了一些新的标准,大家可以及时去更新了 ...

  4. git pull发现有ahead of xx commits问题如何解决

    git pull 的时候发现有提示你ahead of xx commits 这个时候怎么办呢? 直接一句话定位到远程最新分支 git reset --hard origin/分支名称

  5. .NET Core 线程池(ThreadPool)底层原理浅谈

    简介 上文提到,创建线程在操作系统层面有4大无法避免的开销.因此复用线程明显是一个更优的策略,切降低了使用线程的门槛,提高程序员的下限. .NET Core线程池日新月异,不同版本实现都有差别,在.N ...

  6. 如何使用,操作Redis数据库

    本博客不再维护,搬家到 http://zthinker.com .个人微信小程序(分布式编程) Redis是一个开源的内存中键值数据存储.Redis是NoSQL数据库,它不使用结构化查询语言,也称为S ...

  7. golang之路由库gorilla/mux

    gorilla/mux是 gorilla Web 开发工具包中的路由管理库.gorilla Web 开发包是 Go 语言中辅助开发 Web 服务器的工具包.它包括 Web 服务器开发的各个方面, 有表 ...

  8. Golang框架之gin

    gin是目前golang的主要web框架之一,之所以选择这个框架是因为其拥有高效的路由性能,并且有人长期维护,目前github上的star数已经破3W. [安装] go get -u github.c ...

  9. 导航管理工具之OneNav

    github:https://github.com/helloxz/onenav 解决痛点:经常使用的链接,时常被问起, 还要翻找之前的很老的记录,反反复复比较浪费平常的开发时间, 如果可以把这些常用 ...

  10. 光猫HS8145V6命令一部分(一)

    天翼网关说明书-HS8145V6( PON ONT ),快速入门指南 开启telnet, 登录(用户名root,密码adminHW)后可知一些命令 (部分敏感信息已替换) WAP>display ...