Java学习日志--常见类库(上)

前言

        学习一个类,我们首先需要了解这个类的大致作用是什么,就好像我们知道Random是为了生成随机数的的一个类,又或者Date类和日期相关。

        之后我们要去看他的成员以及构造器,了解我们可以如何根据自己的需求,通过构造器如何去创建一个适合的对象。

        之后要了解它的方法(方法名,参数列表,返回值类型),确定要传什么参,需要用什么类型去接收返回值,都是很有必要的。

一、API

1.1 API概述

1)API(Application Programming Interface):应用程序编程接口。它是厂商或者第三方提供好的一系列类库,这些类库能帮助你开发出你想要的项目。

2)Java API指的是JDK中提供的各种功能的Java类库。类库就是别人已经写好的类和方法,可以直接使用。这些类库已经提供了完整的实现,我们不需要关心它如何实现的,只需要学会如何使用这些类即可。

3)JDK类库(API):由sun开发的基础类库,和后期甲骨文公司开发扩展的。

4)第三方API:由第三方人员开发提供的类库,在使用时需要导jar包。

1.2 API文档

APi文档,可以帮助我们快速的学习掌握和了解对应类结构的一个文档工具。

具体关于API文档的运用,我后面会专门出一期,再详细介绍。

二、Object类

2.1 Object类概述

1)Object是基类,所有的类都会直接或间接地继承Object类,默认继承,不需要显式写出。

2)Object存在于java.lang包中,不需要导包可以直接使用。

2.2 构造器

Object类只有一个无参构造器,一般不直接使用Object创建对象。

Object obj = new Object();

2.3 Object的一些方法

Object obj = new Object();

obj.hashCode(); // 返回obj的哈希值

obj.equals(obj); // 判断对象是否相同,相同返回true,不同返回false

obj.toString(); // 返回obj转化成的对应的字符串,
                //一旦该对象有toString方法,则打印对象时,默认调用toString方法
                //所以我们可以在子类中对toString方法进行重写,来达到我们想要的输出效果

三、String类

3.1 String类概述

1)在 Java 中,String 是最常用的字符串类。所有用双引号括起来的数据都会自动创建为 String 对象,无需使用 new 关键字,语法支持直接使用双引号创建。

2)String类是 java.lang包中的类,使用的时候无需导包。

3)String类是不可变字符串,一旦创建后其内容无法修改。当为String对象重新赋值时,实际上是创建了一个新的字符串对象,而非修改原有对象。原字符串将被垃圾回收机制回收。

3.2 其在内存中的体现

首先,我们需要了解栈空间,堆空间之间一般存放的内容,当我们new一个对象时,对象名存储着对象在堆空间的内存地址,它本身是在栈空间,所以我们在了解String类在内存中的关系,我们就要先了解一个东西:常量池。

我们有两种方式去定义一个字符串,第一种就是直接使用双引号创建;另一种就是新建一个String对象,然后给这个对象填值。

//1
String str1 = "Hello";
String str2 = "World";

//2
String str3 = new String("Hello");
String str4 = new String("World");

直接使用双引号创建,是在常量池开辟一个空间存放字符串,之后直接将字符串在常量池中的地址给了在栈空间中的对象名,所以输出的是字符串在常量池中的地址。

创建String对象时,首先会在字符串常量池中开辟空间存储字符串值,然后将该字符串地址赋给堆内存中的对象。栈内存中的变量名则保存着堆内存对象的地址。图示说明如下:

而所谓的“一旦创建后其内容无法修改”,是因为不管是哪种方法创建的,字符串的值都是在常量池中存储着,而一旦检索到你要给String对象赋的值在常量池中有相同的,他就会将该字符串在常量池中的地址给出去,而不是新建一个空间去存储。

同样的,你要对一个字符串进行修改,实际上原本的那个字符串是已经死了的,不能改变了,本质上是又新开辟了一个空间,将你修改的内容放了进去,然后返回相应的地址。

3.3 字符串比较

3.3.1 “==”

==是关系运算符,用来比较等于号两边是否相等。

基本类型:比较的是值是否相等;引用类型:比较的是地址是否相等。

总结:==只负责比较,等号两侧放的是值就比较值,放的是地址,就比较地址。

所以当两个字符串都是直接使用双引号创建的,且字符串内容相同时,对象名中存储的是字符串常量池中相同的地址,所以 str1 == str2,结果会是true。

而如果一个是new的,一个是双引号创建的,那么new的对象名存储的是对象在堆空间的地址,而双引号创建的时常量池中字符串的地址,即使内容相同,str1 != str2的。

3.3.2 equals

实际开发中:判断字符串是否相等,指的是内容是否相等,而不是内存地址是否相等。

判断字符串内容是否相等使用equals方法。

如果要忽略大小写比较的话,使用equalsIgnoreCase方法。例如:判断验证码是否正确。

3.4 构造器

//创建一个没有任何内容的字符串对象
String()    

//根据字符数组的内容,来创建一个字符串对象
String(char! chs)    

//创建一个字符串对象,字符串的内容是字符数组中下标从offset开始的count个字符
String(charl chs, int offset,int count)

//根据字节数组的内容,来创建一个字符串对象
String(bytel bytes)

//创建一个字符串对象,字符串的内容是字节数组中下标从offset开始的count个字节
String(bytel bytes, int offset.int count)

//直接赋值的方式创建字符串对象,内容是abc,并未用任何构造方法。推荐
String s = "abc";

3.5 String的一些方法

下面列举了一些String类常用的对字符串进行操作的方法,有缺漏大家可以帮忙填补一下。

//获取当前字符串的长度,即多少个字符。
public int length() 

//获取指定下标的字符。下标从0开始,最大下标是length()-1
public char charAt(int index)

//判断字符串中是否包含指定的 字符串
public boolean contains(String str); 

//判断字符串是否以指定的字符串开头
public boolean startsWith(String str); 

//判断字符串是否以指定的字符串结尾
public boolean endsWith(String str); 

/*获取指定的下标,查找范围是:下标0到字符串.length()-1;
  从前往后找,返回第一个匹配内容的下标, 如果找不到匹配的内容, 返回-1
  */
public int indexOf(int ch); 
public int indexOf(String subStr);

/*获取指定的下标,查找范围是:下标fromIndex到字符串.length()-1;
  从前往后找,返回第一个匹配内容的下标, 如果找不到匹配的内容, 返回-1
  */
public int indexOf(int ch, int fromIndex); 
public int indexOf(String subStr, int fromIndex); 

/*获取指定[字符]的下标,查找范围是:下标0到字符
  串.length()-1;从前往后找,返回最后一个匹配内容的下标,如果找不到匹配的内容, 返回-1
  */
public int lastIndexOf(int ch);
public int lastIndexOf(String subStr);

/*获取指定[字符]的下标,查找范围是:下标0到
  toIndex;从前往后找,返回最后一个匹配内容的下标,如果找不到匹配的内容, 返回-1
  */
public int lastIndexOf(int ch, int toIndex);
public int lastIndexOf(String subStr, int toIndex);

//字符替换
public String replace(char oldChar,char newChar) 

//字符串按regex规则分割成多个小段
public String[] split(String regex) 

//将多个字符串合并成一个,合并的时候添加指定的连接符
public static String join(CharSequence delimiter,CharSequence... s) 

//获取从beginIndex开始到字符串结尾的子串
public String subString(int beginIndex) 

//获取从beginIndex到endIndex之间的子串,不含下标为endIndex的字符
public String subString(int beginIndex, int endIndex) 

//将字符串改成全小写
public String toLowerCase() 

//将字符串改成全大写
public String toUpperCase() 

//删除字符串左右两侧的空白(空格、换行符\n、缩进符\t)
public String trim() 

//将其他数据类型的数据转换为字符串,需要使用类名.方法名调用
public static String valueOf(数据类型 变量名) 
//也可以通过""+变量进行转换,例如:int a = 10; String str = a + "";

***************************************************************************************************

**还有(下)哦!(下)要包含Random类,Date类,SimpleDateFormat类和包装类。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值