Java之String类常用API
- Java之String类常用API
- char chatAt(int index)
- int length()
- char[] toCharArray()
- String(char value[])
- String(char value[], int offset, int count)
- int compareTo(String anotherString)
- String concat(String str)
- boolean contains(CharSequence s)
- boolean endsWith(String suffix)
- startsWith(String prefix)
- boolean equals(Object anObject)
- byte[] getBytes()
- String(byte bytes[])
- int hashCode()
- int indexOf(int ch)
- int indexOf(String str)
- int indexOf(int ch, int fromIndex)
- int lastIndexOf(String str)
- int lastIndexOf(int ch)
- int lastIndexOf(String str, int fromIndex)
- native String intern()
- boolean isEmpty()
- String replace(char oldChar, char newChar)
- String substring(int beginIndex)
- String substring(int beginIndex, int endIndex)
- String toUpperCase()
- String toLowerCase()
- String toString()
- String trim()
- static String valueOf(Object obj)
Java之String类常用API
public final class String
,String类被final修饰,代表的是最终类。字符串在内存中以字符数组的形式来存储
private final char value[];
字符串是常量,本身被存储在方法区的常量池中,只要字符串的实际值是一样的,那么用的就是同一个字符串,意思是可以被共享。
字符串都是String类的实例。
public class StringDemo {
public static void main(String[] args) {
String str = "abc";
str = "def";
str = "abc";
//栈内存直接指向方法区
String str2 = "abc";
//栈内存指向堆内存,堆内存指向方法区
String str3 = new String("abc");
//"a"和"b"都是字面量(数字,字符,字符串,布尔值),因此在编译的时候会对字面量进行运算
//相当于编译完之后就是:String str4 = "abc";
String str4 = "a" + "b" + "c";
System.out.println(str == str2);
System.out.println(str == str4);
//因为字符串变量进行拼接操作,所以在底层并不是直接的拼接
//而是调用了StringBuilder中的append方法进行拼接
String str5 = "a";
//str5 = new StringBuilder(str5).append("bc").toString();
//toString方法在底层就是return new String(value, 0, count);
str5 = str5 + "bc";
System.out.println(str == str5);
}
}
以下所有方法均省略public。
char chatAt(int index)
/*通过下标获取指定位置上的字符*/
//源码
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
int length()
/*获取字符串的长度*/
//源码:
public int length() {
return value.length;
}
char[] toCharArray()
/*将字符串转换成对应的字符数组*/
//源码:
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
String(char value[])
String(char value[], int offset, int count)
/*将字符数组转换为字符串*/
//源码:
//public String(char value[])
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
//public String(char value[], int offset, int count)
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
//count=0且offset小于等于字符串的长度,构造空字符串
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
//示例:
char[] ch = {'a','b','c','d','e'};
String str = new String(ch);
System.out.println(ch);//abcde
String str1 = new String(ch,3,2);
System.out.println(str1);//de
value - 要操作的字符数组
offset - 偏移量,即起始下标
count - 拼接字符的个数
int compareTo(String anotherString)
/* 比较两个字符串*/
//compareTo 源码
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
/*
1.两个字符串在底层都是以字符数组的形式来存储
2.遍历两个字符数组,然后去依次比较每一位上的字符是否相等
3.如果对应位置不相等 那么返回两个字符之差
4.如果相等,则比较下一位
5.如果一直都相等,直到有一个字符串结束,返回两个字符串之差
*/
String s3 = "abcde";
String s4 = "ABCDE";
System.out.println(s3.compareTo(s4));//32
//compareToIgnoreCase 忽视大小写
System.out.println(s3.compareToIgnoreCase(s4));//0
String concat(String str)
/*将指定的参数拼接到字符串的末尾不改变原先的字符串
底层就是进行了数组的合并*/
//源码
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
//示例:
String str1 = "abc";
String str2 = "abc";
System.out.println(str2.concat(str1));//abcabc
boolean contains(CharSequence s)
/*判断是否包含指定的子字符串*/
contains
//源码:
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
//示例:
String str1 = "ab";
String str2 = "abcd";
System.out.println(str2.contains(str1));//true
System.out.println(str1.contains(str2));//false
boolean endsWith(String suffix)
/*判断是否是指定的结尾 */
String str1 = "ab";
String str2 = "abcd";
System.out.println(str2.endsWith(str1));//false
startsWith(String prefix)
/*判断是否是指定的开头*/
String str1 = "ab";
String str2 = "abcd";
System.out.println(str2.startsWith(str1));//true
boolean equals(Object anObject)
/*判断字符串值是否相等*/
//源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
//示例
String str1 = "ab";
String str2 = new String("ab");
String str2 = "a"+"b";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
/*忽略字母大小写的字符串值比较*/
String str1 = "ab";
String str4 = "AB";
System.out.println(str4.equalsIgnoreCase(str1));//true
byte[] getBytes()
/*将字符串转换为字节数组,在转化为字节数组的过程中,如果没有指定编码,默认时当前工程的编码,意味着代码中的编码将会跟着工程编码一起改变*/
//示例
String s = "abcd";
byte[] bs = s.getBytes();
System.out.println(Arrays.toString(bs));//[97, 98, 99, 100]
//避免编码方式不确定,可以强制编码的名字 (需要在方法中抛出异常)
//public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
String ss = "字节数组";
byte[] bssGBK = ss.getBytes("gbk");
byte[] bssUTF8 = ss.getBytes("utf-8");
String(byte bytes[])
/*将字节数组转换为字符串--String构造器*/
//示例
byte[] newBs = {43,43,54,65,76};
String s0 = new String(newBs);
System.out.println(s0);//++6AL
/*指定编码,编码不对应,则转换不成功*/
//public String(byte bytes[], String charsetName) throws UnsupportedEncodingException
String s2 = new String(bssUTF8);
String s3 = new String(bssGBK,"gbk");
System.out.println(s2+","+s3); //字节数组,字节数组
/*构造字符串时截取*/
//public String(byte bytes[], int offset, int length, String charsetName) throws UnsupportedEncodingException
String str = new String(bssUTF8,0,6,"utf-8");
System.out.println(str);//字节
int hashCode()
/*字符串的哈希码 hashCode*/
//对Object中的hashCode方法进行了重写
//示例
String str = "abc";
System.out.println(str.hashCode());//96354=(97*31+98)*31+99
int indexOf(int ch)
int indexOf(String str)
int indexOf(int ch, int fromIndex)
/*获取字符或子字符串在字符串中第一次出现的下标位置*/
//示例
String s = "abcdabcdabcd";
System.out.println(s.indexOf('a'));//0
System.out.println(s.indexOf("aa"));//-1
//从fromIndex开始,字符出现的位置
System.out.println(s.indexOf('a',4));//4
int lastIndexOf(String str)
int lastIndexOf(int ch)
int lastIndexOf(String str, int fromIndex)
/*获取字符或子字符串在字符串中最后出现的位置*/
System.out.println(s.lastIndexOf("abcd"));//8
System.out.println(s.lastIndexOf('d'));//11
//从fromIndex向前,字符最后出现的位置
System.out.println(s.lastIndexOf("abc",3));//0
native String intern()
/*强制返回字符串的常量池地址*/
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1==s2);//false
System.out.println(s1==s2.intern());//true
System.out.println(s1.equals(s2));//true 一般用equals
boolean isEmpty()
/*判断字符串的长度是否为0*/
//源码:
public boolean isEmpty(){
return value.length ==0;
}
/*空串和字符串为空的区别*/
//空串:长度为0,但是有常量池地址,相当于char[] value = new char[0];
String str1 = "";
//字符串为空:没有地址 并没有区内存中实际开辟空间
// 可以认为内存中对象并不存在,所以调用isEmpty()方法会报错
String str2 = null;
System.out.println(str2.isEmpty());//!false java.lang.NullPointerException
System.out.println(str1.isEmpty());//true
String replace(char oldChar, char newChar)
/*将字符串的字符替换,用newChar替换oldChar*/
String str1 = "abc";
String str2 = str1.replace('a','e');
System.out.println(str2);//ebc
System.out.println(str1);//abc
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
/*截取子字符串*/
String str = "abcdefg";
//从beginIndex到最后一位
String str1 = str.substring(2);//cdefg
//从beginIndex开始,到endIndex的前一位
String str2 = str.substring(3,4);//d
String toUpperCase()
String toLowerCase()
/*大小写转换*/
String s = "abc";
String s1 = s.toUpperCase();
String s2 = s1.toLowerCase();
System.out.println(s1);//ABC
System.out.println(s2);//abc
String toString()
/*重写了Object类的toString方法,返回对象本身*/
//源码
public String toString() {
return this;
}
String trim()
/*去掉字符串的前导空白和尾部空白--> 去掉头部和尾部的空白字符*/
//空白字符:空格,\t制表符 \r \n \f
String s = "\t\n \t \t \t dwead \f \r";
String s1 = s.trim();
System.out.println(s);
System.out.println(s1);
static String valueOf(Object obj)
/*将传入的参数转换为字符串*/
//源码:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
//System.out.println(Object obj)底层就是调用String.valueof(obj),将传入对象转换为字符串
//示例:
String.valueOf(3);
//如果将对象转换为字符串,底层调用对象的toString方法
String str = String.valueOf(new Object());
System.out.println(str);//java.lang.Object@1b6d3586
int[] arr = {1,2,34};
String str1 = String.valueOf(arr);
System.out.println(str);//java.lang.Object@1b6d3586
/*如果是字符数组,打印的是拼接之后的字符串而不是地址*/
//源码:
public static String valueOf(char data[]) {
return new String(data);
}
//示例:
char[] arrChar = {'q','w','e'};
String str2 = String.valueOf(arrChar);
//return new String(data);
System.out.println(str2);//qwe
如有错误,欢迎大家评论区指正!
Java之String类常用API的更多相关文章
- java中FILE类常用API介绍
- 【java】String类常见操作
秋招做题需要,总结String类常用api如下: 简单的:str.length().str.isEmpty().str.split(“;”)切割 1.字符串反转:借助StringBuilder/Str ...
- Java api 入门教程 之 JAVA的String 类
1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语 ...
- String类常用的API
String类常用的API 字符串内容的比较: 注意: 不能使用 == 去比较两个字符串的内容.原理:比较的是字符串的地址. (如果两个字符串都是使用""进行赋值,那么他们都是放在 ...
- JAVA的String 类
String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s ...
- Java 的String类
String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s ...
- JAVA的String 类【转】
String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s ...
- java 中String类的常用方法总结,带你玩转String类。
String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...
- java中String类为什么不可变?
在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象 ...
随机推荐
- shell学习(20)- xargs
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据. xargs 也可以将单行或多 ...
- git操作——TortoiseGit指定某个分支clone
需求 需要使用TortoiseGit 克隆某个项目分支 操作 勾选分支,输入分支名称clone代码即可
- pictures
- DENSE_RANK(),允许并列名次、名次不间断,如122344456
将score按ID分组排名:dense_rank() over(partition by id order by score desc) 将score不分组排名:dense_rank() over(o ...
- Flask学习之四 数据库
英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database 中文翻译地址:http://ww ...
- php parse_url linux 解析问题
耕毅 解析url函数parse_url() (PHP 4, PHP 5, PHP 7) parse_url — 解析 URL,返回其组成部分 mixed parse_url ( string $url ...
- 深入python
while循环知识: while是关键字 格式我们要怎么写:; while 条件 : 缩进 循环(代码块) 这里面有个死循环######条件如果一直为真,就形成了一个环,就成为了死循环 那我们如 ...
- css 文字超出部分隐藏
未做隐藏处理 执行结果: 1.1行超出部分省略号 效果: 2.多行超出部分隐藏(目前只能在chrome浏览器中使用,其他浏览器不兼容) 效果: -webkit-line-clamp 属性定义显示行数可 ...
- LightOJ 1123 Trail Maintenance
题意:n个城市m天.每一天修一条道路,输出当前天数的最小生成树,但是这里有一个条件,就是说最小生成树必须包括全部n个城市,否则输出-1 思路:边数有6000如果每一天跑一次最小生成树的话就接近O(m^ ...
- H3C 面向连接和无连接的服务