Java SE 核心 I
Java SE 核心 I
1、Object类
在 Java 继承体系中,java.lang.Object 类位于顶端(是所有对象的直接或间接父类)。如果一个类没有写 extends 关键字声明其父类,则该类默认继承 java.lang.Object 类。Object 类定义了“对象”的基本行为,被子类默认继承。
public class Object
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
11个方法:3个重载方法。9个方法。
1)toString():得到对象的字符串表示形式。
2)equals(Object o):比较两个对象是否相等的。(比较内容)。
3)getClass():得到对象的大Class 对象。
4)hashCode():得到对象的哈希码。
5)wait():线程等待。(重载)
6)notify():唤醒线程。
7)notifyAll():唤醒所有线程。
8)clone():克隆 对象。
9)inalize():垃圾回收相关的。
2、String类
是字符串类型,是引用类型,是“不可变”字符串,无线程安全问题。在 java.lang.String中
注意事项:String str =“abc”;和 String str=new String(“abc”);的区别!
1)String 在设计之初,虚拟机就对他做了特殊的优化,将字符串保存在虚拟机内部的字符串常量池中。一旦我们要创建一个字符串,虚拟机先去常量池中检查是否创建过这个字符串,如有则直接引用。String 对象因为有了上述的优化,就要保证该对象的内容自创建开始就不能改变!所以对字符串的任何变化都会创建新的对象,而不是影响以前的对象!
2)String 的 equals 方法:两个字符串进行比较的时候,我们通常使用 equals 方法进行比较,字符串重写了 Object 的 equals 方法,用于比较字符串内容是否一致。虽然 java 虚拟机对字符串进行了优化,但是我们不能保证任何时候“==”都成立!
3)编程习惯:当一个字符串变量和一个字面量进行比较的时候,用字面量.equals 方法去和变量进行比较,即:if("Hello".equals(str))因为这样不会产生空指针异常。而反过来用,即:if(str.equals("Hello"))则我们不能保证变量不是 null,若变量是 null,我们在调用其 equals 方法时会引发空指针异常,导致程序退出。若都为变量则 if(str!=null&&str.equals(str1))也可。
4)String 另一个特有的 equals 方法:euqalsIgnoreCase,该方法的作用是忽略大小写比较字符串内容,常用环境:验证码。if("hello".equalsIgnoreCase(str))。
5)String 的基本方法:
① String toLowerCase():返回字符串的小写形式。如:str.toLowerCase()
② String toUpperCase():返回字符串的大写形式。如:str.toUpperCase()
③ String trim():去掉字符串两边的空白(空格\t\n\r),中间的不去。如:str.trim()
④ boolean startsWith():判断字符串是否以参数字符串开头。如:str.startsWith("s")
⑤ boolean endsWith():判断字符串是否以参数字符串结尾。如:str.endsWith("s")
⑥ int length():返回字符串字符序列的长度。如:str.length()
6)indexOf 方法(检索):位置都是从 0 开始的。
①int indexOf(String str):在给定的字符串中检索 str,返回其第一次出现的位置,找不到则返回-1。
②int indexOf(String str,int from):在给定的字符串中从 from 位置开始检索 str,返回第一次出现的位置,找不到则返回-1(包含 from 位置,from 之前不看)
③int lastIndexOf(String str):在给定的字符串中检索 str,返回其最后一次 出 现 的位置,找不到则返回-1(也可认为从右往左找,第一次出现的位置)。
④int lastIndexOf(String str,int from):给定字符串从 from 位置开始检索str,返回最后一次出现的位置,找不到则返回-1(包含 from 位置,from 之后的不看)
7)charAt 方法:char charAt(int index):返回字符串指定位置(index)的字符。
8)substring 方法(子串):字符串的截取,下标从 0 开始的。
①String substring(int start,int end):返回下标从 start 开始(包含)到 end 结束的字符串(不包含)。
②String substring(int start):返回下标从 start 开始(包含)到结尾的字符串。
9)getBytes 方法(编码):将字符串转换为相应的字节。
①byte[] getBytes():以当前系统默认的字符串编码集,返回字符串所对应的二进制序列。
如:byte[] array=str.getBytes(); System.out.println(Arrays.toString(array));
②byte[] getBytes(String charsetName):以指定的字符串编码集,返回字符串所对应的二进制序列。这个重载方法需要捕获异常,这里可能引发没有这个编码 集的异常,UnsupportedEncodingException,如:str="常"; byte[] bs=info.getBytes("UTF-8");
注意事项:
Windows 的默认编码集 GBK:英文用 1 个字节描述,汉字用 2 个字节描述;
ISO-8859-1 欧洲常用编码集:汉字用 3 个字节描述;GBK 国标;GB2312国标;UTF-8 编码集是最常用的:汉字用 3 个字节描述。
编码:将数据以特定格式转换为字节;解码:将字节以特定格式转换为数据。
String(byte[] bytes, String charsetName) :通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。如:String str=new String(bs,"UTF-8");
10)split 方法(拆分):字符串的拆分。
String[] split(String regex):参数 regex 为正则表达式,以 regex 所表示的字符串为分隔符,将字符串拆分成字符串数组。其中,regex 所表示的字符串不被保留,即不会存到字符串数组中,可理解为被一刀切,消失!
11)replace 方法:字符串的替换。
String replaceAll(String regex,String replacement):将字符串中匹配正则表达式 regex的字符串替换成 replacement。如:String str1=str.replaceAll("[0-9]+", "chang");
12)String.valueOf()方法:重载的静态方法,用于返回各类型的字符串形式。
String类常用方法
问题序列:
1)为什么String对象称为“不可变对象?
2)看图
3)String类和常量池
在Java的内存分析中,我们会经常听到关于“常量池”的描述,实际上常量池也分了以下三种:
1. 全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
3. 运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
4)Java常用类的基本用法(结合Java API文档学习)
String类常用方法一
String类常用方法二
3、StringBuilder
与 String 对象不同,StringBuilder 封装“可变”的字符串,有线程安全问题。对象创建后,可通过调用方法改变其封装的字符序列。
StringBuilder 常用方法:
1)追加字符串:StringBuilder append(String str)
2)插入字符串:StringBuilder insert(int index,String str):插入后,原内容依次后移
3)删除字符串:StringBuilder delete(int start,int end)
4)替换字符串:StringBuilder replace(int start,int end,String str):含头不含尾
5)字符串反转:StringBuilder reverse()
StringBuilder和StringBuffer
StringBuilder和StringBuffer非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。
StringBuilder和StringBuffer称之为“可变字符序列”。那两者有什么区别呢?
1)StringBuffer JDK1.0版本提供的类,线程安全,做线程同步检查, 效率较低。
2)StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。
4、Date时间类(java.util.Date)
java.util.Date 类用于封装日期及时间信息,一般仅用它显示某个日期,不对他作任何操作处理,作处理用 Calendar 类,计算方便。查看API文档大家可以看到其实Date类中的很多方法都已经过时了。JDK1.1之前的Date包含了:日期操作、字符串转化成时间对象等操作。JDK1.1之后,日期操作一般使用Calendar类,而字符串的转化使用DateFormat类。
5、Calendar日历类
java.util.Calendar 类用于封装日历信息,其主作用在于其方法可以对时间分量进行运算。
1)通过 Calendar 的静态方法获取一个实例该方法会根据当前系统所在地区来自行决定时区,帮我们创建 Calendar 实例,这里要注意,实际上根据不同的地区,Calendar 有若干个子类实现。而 Calendar 本身是抽象类,不能被实例化!我们不需要关心创建的具体实例为哪个子类,我们只需要根据 Calendar 规定的方法来使用就可以了。
2)日历类所解决的根本问题是简化日期的计算,要想表示某个日期还应该使用 Date 类描述。Calendar 是可以将其描述的时间转化为 Date 的,我们只需要调用其 getTime()方法就可以获取描述的日期的 Date 对象了。
3)通过日历类计算时间:为日历类设置时间,日历类设置时间使用通用方法 set。set(int field,int value),field 为时间分量,Calendar 提供了相应的常量值,value 为对应的值。
4)只有月份从 0 开始:0 为 1 月,以此类推,11 为 12 月,其他时间是正常的从 1 开始。也可以使用 Calendar 的常量 calendar.NOVEMBER……等。
5)Calendar.DAY_OF_MONTH 月里边的天---号;
Calendar.DAY_OF_WEEK 星期里的天---星期几
Calendar.DAY_OF_YEAR 年里的天
6)获取当前日历表示的日期中的某个时间单位可以使用 get 方法.
6、DateFormat类和SimpleDateFormat类
把时间对象转化成指定格式的字符串。反之把指定格式的字符串转化成时间对象。DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。
7、包装类(包装类均位于java.lang包,八种包装类和基本数据类型的对应关系)
Java 语言的 8 种基本类型分别对应了 8 种“包装类”。每一种包装类都封装了一个对应的基本类型成员变量,同时还提供了针对该数据类型的实用方法。
1)包装类的目的:用于将基本类型数据当作引用类型看待。
2)包装类的名字:除了 Integer(int),Character(char)外,其余包装类名字都是基本类型名首字母大写。
3)拆、装箱:Integer i=new Integer(1);创建一个以对象形式存在的整数 1,这种从基本类型转为引用类型的过程称之为“装箱”,反之叫“拆箱”。
4)装箱:方式一:Double d=new Double(2.2);//装箱
方式二:Double d=Double.valueOf(2.2);//基本类型都有 valueOf 方法
5)拆箱:double num=d.doubleValue();//拆箱
6)包装类使用前提:JDK1.5+
已经有了基本数据类型了,为何还要提供对应的包装类型的?
原因:
1:包装类中提供了各种用于操作基本数据类型的方法,主要的方法就是基本数据类型和字符串之间的相互的转换。
2:有些时候,基本数据类型不能直接使用,必须当作 Object 的实例才能使用。必须有对应的包装的类型才能满足需求。
自动装箱和拆箱
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing)
自动装箱底层实现:通过调用 Integer.valueOf(int) 实现。
自动拆箱底层实现:通过调用 对象.intValue()来实现的。
包装类空指针异常问题
null表示i没有指向任何对象的实体,但作为对象名称是合法的(不管这个对象名称存是否指向了某个对象的实体)。由于实际上i并没有指向任何对象的实体,所以也就不可能操作intValue()方法,这样上面的写法在运行时就会出现NullPointerException错误所以自动装箱与拆箱的功能是所谓的“编译器蜜糖(Compiler Sugar)”,虽然使用这个功能很方便,但在程序运行阶段得了解Java的语义,如不熟悉特殊情况,可能会出错!
Java SE 核心 I的更多相关文章
- Java SE 核心 II【Collection 集合框架】
Collection集合框架 在实际开发中,需要将使用的对象存储于特定数据结构的容器中.而 JDK 提供了这样的容器——集合框架,集合框架中包含了一系列不同数据结构(线性表.查找表)的实现类.集合的引 ...
- Java SE核心之一:常用类,包装类,其他基本数据类型包装类。
在Java继承体系中,java.lang.Object类位于顶端(是所有对象的直接或间接父类).如果一个类没有写extends关键字声明其父类,则该类默认继承java.lang.Object类.Obj ...
- Java SE 简介 & 环境变量的配置
Java SE 简介 & 环境变量的配置 一.Java 技术的三个方向 Java 技术分为三个方向 javaSE( Java Platform Standard Edition 标准版)用来开 ...
- Java SE、Java EE和Java ME有什么区别?
Java现在已不仅仅是一种语言,从广义上说,它代表了一个技术体系.该体系根据应用方向的不同主要分为Java SE.Java EE和Java ME的3个部分. 1998年12月份Sun公司公布的Java ...
- Java SE 6 新特性: 对脚本语言的支持
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...
- Java SE/ME/EE的概念介绍
转自 Java SE/ME/EE的概念介绍 多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用. ...
- java se 6在solaris的可观察性特征分析
java平台标准版(java se)6,代码名为"mustang",是最新的java se发行版本(正在开发中).java se 6源码和二进制代码都可以在www.java ...
- Java SE 6 新特性: HTTP 增强--转
概述 Java 语言从诞生的那天起,就非常注重网络编程方面的应用.随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展.在 Java SE 6 当中,围绕着 HT ...
- DynamicMBean(Java SE 6 新特性: JMX 与系统管理)
Dynamic MBean 是一种在运行时定义其管理接口的 MBean.例如,配置 MBean 可以通过解析 XML 文件来确定它所公开的属性名称和类型. 任何实现 DynamicMBean 接口的类 ...
随机推荐
- 用mongodump以及mongorestore来完成mongo的迁移任务
首先粘贴官网说明: 详细请见:https://docs.mongodb.com/manual/ 在实际操作中,一般只需用到 mongodump -h ip:port -d dbName -o path ...
- Apache 流框架Flink简介
1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意.Flink是原生的流处理系统,提供high level的API.Flink也提供 API来像Spark ...
- python中学习K-Means和图片压缩
python中学习K-Means和图片压缩 大家在学习python中,经常会使用到K-Means和图片压缩的,我们在此给大家分享一下K-Means和图片压缩的方法和原理,喜欢的朋友收藏一下吧. 通俗的 ...
- CentOS7或CentOS8 安装VirtualBox Guest Addon缺少kernel-headers的解决办法
CentOS7或CentOS8 在Oracle VM VirtualBox中安装Guest Addon时,如果缺少kernel-headers和相应的编译库,会提示出错. "kernel h ...
- Mybatis Guide
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的.SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得.而SqlS ...
- jvm小白
tomcat设置可被jconsole监控: 在catalina.bat或catalina.sh里面加上. set JAVA_OPTS=-Djava.rmi.server.hostname=127.0. ...
- Django之logging配置
1. settings.py文件 做开发离不开必定离不开日志, 以下是我在工作中写Django项目常用的logging配置. # 日志配置 BASE_LOG_DIR = os.path.join(BA ...
- SQL易错锦集
1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...
- mysql --explain+slowlog
一.EXPALIN 在SQL语句之前加上EXPLAIN关键字就可以获取这条SQL语句执行的计划 那么返回的这些字段是什么呢? 我们先关心一下比较重要的几个字段: 1. select_type 查询类型 ...