最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

Java 系列教程 (10)包装类、常用类

[复制链接]
跳转到指定楼层
楼主
发表于 2018-1-23 15:35:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
1、包装类#
1.1 包装类简介#
包装类是为了把基本类型包装成对象类型,从而能被 Object 类型统一管理。
Sun 公司为我们提供的八种包装类
file

1.2 六种转换#
三种类型,指的是字符串类型、基本类型、包装类类型。
以基本类型的int 和 包装类Integer为例,如下图示:
file
六种转换方式如下图:

以下内容回帖刷新可见#
file
代码示例:
file

1.3 自动封箱拆箱#
在 JDK5.0 中,由系统自动完成基本类型和包装类之间的转换
例如:
file
其中:
intValue = integer;
这行代码,编译器会自动翻译成:
int intValue = integer.intValue();
在这个过程中,由于调用 intValue 方法时, 当 integer 的值为 null 时,相当于对一个 null值调用了 intValue()方法。
这行代码会抛出 NullPointerException 这个异常。
file

2、Object类#
Object 类是 Java 中所有类的父类,当定义一个类时,没有使用extends关键字为它显示指定父类,则该类默认继承Object类。

2.1 getClass方法#
getClass 方法是 Object 类中的一个公开方法,这个方法的作用是:返回对象的运行时实际类型。
getClass 方法能够返回一个对象的实际类型,通过比较两个对象 getClass 的返回值,
就能够判断这两个对象是否是同一个类型。
例如:
file
因此,利用 getClass 方法,就能够避免 instanceof 操作符的麻烦。改写 isDog 方法如下:
file

2.2 equals方法#
语法格式:boolean equals(Object obj)
由于Object类的equals实现时用的是“==”,所以Object类的equals是判断指定对象与该对象是否相等,判断标准是,两个对象是同一对象,因此该equals方法通常没有太大实用价值。
若想用equals判断,则需要重写Object类的equals方法。
2.2.1重写equals方法应该满足的条件
1)自反性:对任意x,x.equals(x)一定返回true。
2)对称性:对任意x和y,如果y.equals(x)返回true,则x.equals(y)也返回true。
3)传递性:如果有三个不为 null 的引用 a、b、c,如果 a.equals(b)为true,b.equals(c)为true,则a.equals(c)也必然为true。
4)一致性:指的是如果有两个不为 null 的引用 x 和 y,在不改变x 和 y 的属性的前提下,每次调用 x.equals(y)返回的值都相同。
5)对任何不是 null 的x,x.equals(null) 一定返回false。
示例:
file
创建一个Person类,类里有姓名,年龄,
然后重写equals方法,只要两个对象中的姓名相等,就算是同一对象。
file
测试类:
file

2.2.2 String类型的equals方法
String已经重写了Object的equals方法,String的equals方法判断两个字符串相等的标准是:
只要两个字符串所包含的字符序列相同,通过equals方法比较返回true,否则返回false。
file
2.2.3 单例模式
单例:单例对象的类必须保证只有一个实例存在。
对单例的实现可以分为两大类——懒汉式和饿汉式
2.2.3.1 懒汉式

指全局的单例实例在第一次被使用时构建。
file
测试类
file
2.2.3.2 饿汉式

指全局的单例实例在类装载时构建。
什么是类装载时:
1)生成该类对象的时候,会加载该类及该类的所有父类;
2)访问该类的静态成员的时候;
3)class.forName("类名")(反射);
file
测试类:
file

2.3 toString方法#
语法格式:String toString()
返回该对象的字符串表示,Object类的toString方法返回“运行时类名@十六进制hashCode值”格式的字符串。
如果需要返回表述对象信息的字符串,则需要重写Object类的toString方法
示例:
Student对象有名称和年龄属性,要用toString打印这个两个属性的信息,就需要重写toString方法
file

3、String、StringBuffer、StringBuilder类#
3.1 String类#
字符串是不可变的。一个字符串对象一旦被配置,其内容是不可变的。
String 是 final类,内部存储空间也是final修饰的

3.1.1 常量池#
常量池(constant pool):指的是在堆中分配出来的一块存储区域,在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

3.1.2 String 与 创建对象#
1)单独使用""引号创建的字符串都是常量,编译期就已经确定存储到常量池中;
2)使用new String("")创建的对象会存储到堆中,是运行期新创建的;
3)使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到常量池中;
4)使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在堆中;
file
示例:
file
String的intern()方法
String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。
示例:
file
运行结果:
file

常用方法如下:
file
file
实现字符串的trim()方法
file

3.2 String、StringBuilder、StringBuffer异同点#
用来处理字符串常用的类有3种: String、StringBuilder、StringBuffer。
它们的异同点:
1) 都是 final 类, 都不允许被继承;
2) String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的;
3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。

String VS StringBuffer
String 类型和StringBuffer的主要性能区别:String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

StringBuilder
StringBuilder是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

使用策略
1) 基本原则:
如果要操作少量的数据,用String ;
单线程操作大量数据,用StringBuilder ;
多线程操作大量数据,用StringBuffer。
2) 不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
3) StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。
4) 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。

4 Math 类#
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
double Math.ceil(double a)
得到不小于某数的最大整数,即向上取整。
double Math.floor(double a)
得到不大于某数的最大整数,向下取整。
long Math.round(double a)
四舍五入
double Math.random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
代码示例:
file

5 产生随机数#
伪随机数:看起来是随机的,但从总体上看是有规律可循的,这种可预测的随机数,为伪随机数。
创建随机数的方法:

5.1 用 Math.random()#
创建随机数方法:
(数据类型)(最小值+Math.random()(最大值-最小值+1))
例:从1到10的int型随数
(int)(1+Math.random()(10-1+1))

5.2 用 Random 类#
此类的实例用于生成伪随机数流。
double nextDouble()
返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值。
float nextFloat()
返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 float 值。
int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
long nextLong()
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
例如:从1 到 10 的 int 型随机数
file

5.3 用 ThreadLocalRandom 类#
ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。

ThreadLocalRandom类提供了一个静态的current()方法来获取ThreadLocalRandom对象
获取该对象之后即可调用各种nextInt()方法来获取伪随机数。
file
代码示例:
file

6 BigDecimal#
   一般的 float 型和 double 型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到 java.math.BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值。
   建议将小数先转成String类型,然后再用 BigDecimal 构造方法,传入String 类型的参数,这样可保证数值一致。
舍入模式:
ROUND_HALF_UP: 遇到.5的情况时往上近似,例: 1.5 ->;2
ROUND_HALF_DOWN : 遇到.5的情况时往下近似,例: 1.5 ->;1
工具类:
file

7 处理日期的类#
7.1 Date类#
    Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.。
代码示例:

7.2 Calendar类#
因为Date在设计上有缺陷,所以Java 提供了Calendar 类来更好地处理日期和时间,Calendar 用于表示日历。
Calendar类是个抽象类,不能使用构造方法来创建Calendar 对象,需要通过getInstance()方法来获取Calendar 对象。
创建Calendar 对象
Calendar c = Calendar.getInstance();
示例代码 :
file

8 正则表达式#
    在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。
    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
8.1 创建正则表达式#
正则表达式就是一个用于匹配字符串的模板,所以创建正则表达式就是创建一个特殊的字符串。
\反斜杠
file

^为限制开头
file

加入特定限制条件[]
file

[]中加入^后加再次限制条件[^]
file

在限制条件为特定字符出现0次以上时,可以使用*
file

在限制条件为特定字符出现1次以上时,可以使用+
file

在限制条件为特定字符出现有0或1次以上时,可以使用?
file

限制为连续出现指定次数字符{a}
file

文字a个以上,并且{a,}
file

文字a个以上,b个以下{a,b}
file

两者取一|
file

()中规定一个组合类型
比如,我查询字符串"aaa111bbb222ccc"中即有"aaa",又有"bbb"的数据,可写作"(aaa|bbb)"

8.2 使用正则表达式#
可以使用Pattern 和 Matcher 来使用正则表达式。
正则表达式字符串必须先被编译为Pattern 对象,然后再利用该Pattern 对象创建对应的Matcher 对象。
执行匹配所涉及的状态保留在Matcher 对象中,多个Matcher 对象可共享同一个Pattern 对象。
一般调用顺序如下:
file

如果正则只使用一次,可直接使用Pattern 类的静态 matches 方法。格式如下:
file
Pattern 是不可变类,可供多个并发线程安全使用。

Matcher 类提供的常用方法:
boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
String group()
返回由以前匹配操作所匹配的输入子序列。
int start()
返回以前匹配的初始索引。
int end()
返回最后匹配字符之后的偏移量。
boolean lookingAt()
尝试将从区域开头开始的输入序列与该模式匹配,只要字符串开头匹配就返回true。
boolean matches()
尝试将整个区域与模式匹配,匹配所有。
Matcher reset()
重置匹配器,重新填装要匹配的字符串。
代码示例:
file
运行结果:
file #
测试正则表达式:
file
运行 结果:
file #
匹配email示例:
file

9 格式化#
9.1 使用NumberFormat 格式化数字#
NumberFormat 可用于格式化和解析任何语言环境的数字。
可使用工厂方法来得到NumberFormat对象:
static NumberFormat getCurrencyInstance() :返回当前默认语言环境的货币格式。
static NumberFormat getNumberInstance() :返回当前默认语言环境的通用数字格式。
static NumberFormat getPercentInstance() :返回当前默认语言环境的百分比格式。
代码示例:
file

9.2 使用 SimpleDateFormat 格式化日期#
由于DateFormat功能不够强大,此处不做扩展。
主要讲解DateFormat 子类 SimpleDateFormat 类。
SimpleDateFormat 可以灵活的格式化Date,也可以用于解析各种格式的日期字符串。
创建 SimpleDateFormat 对象时需要传入一个日期模板字符串。
定义了以下模式字母
file
代码示例:
file

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海牛部落-海牛博士,http://hainiubl.com/topics/138
楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-8 09:40

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表