目录
基本数据类型封装类
包装类常用属性方法
8中基本数据类型各自所对应的包装类
以下方法以java.lang.Integer为例
代码
运行
装箱和拆箱
装箱
何为装箱
代码
范围问题
代码
运行
拆箱
代码
String类
概述
代码
运行
创建形式
画图讲解
代码
运行
构造方法
代码
运行
成员方法
判断功能
代码
运行
获取功能
代码
运行
转换功能
代码
运行
替换功能 去除字符串两侧空格
代码
运行
StringBuffer类与StringBuilder类
StringBuffer类
添加功能
代码
运行
删除功能
代码
运行
替换功能
代码
运行
反转功能
代码
运行
StringBuilder类
代码
运行
String类 --StringBuffer类--StringBuilder类
基本数据类型封装类
对于包装类来说,这些类的用途主要包含两种:
● 作为和基本数据类型对应的类类型存在。
● 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操 作方法
包装类常用属性方法
8中基本数据类型各自所对应的包装类
以下方法以java.lang.Integer为例
代码
package com.ffyc.javaapi.datatype;
import java.util.Scanner;
public class IntegerDemo1 {
public static void main(String[] args) {
//如何获得一个int类型的包装对象
//通过构造方法 new
Integer a = new Integer(10);
System.out.println(a);//10
Integer b = new Integer("8");
System.out.println(b);//8
//通过valueOf()方法
Integer c = Integer.valueOf(10);
System.out.println(c);//10
Integer d = Integer.valueOf("8");
System.out.println(d);//8
//非静态方法 直接对包装对象中的值操作
int i = a.compareTo(b);//比较大小 返回-1 0 1
System.out.println(i);//1
System.out.println(a == b);//地址比:false
System.out.println(a.equals(b));//数值比:false
int j = a.intValue();//取出包装类型中的基本数据类型的值
System.out.println(j);//10
//静态方法 需要传参
int e = Integer.compare(10, 8);
System.out.println(e);//1
String f = Integer.toHexString(12138);
System.out.println(f);//返回16进制
Integer.max(10, 8);
int g = Integer.parseInt("20");//把字符串类型数值 转为基本类型int
}
}
运行
装箱和拆箱
装箱
何为装箱
装箱:将基本类型可以自动转为包装类型
int a = 10;
Integer a1 = Integer.valueOf(a);
Integer a2 = new Integer(a);
Integer aa = a;自动装箱 直接把基本类型 赋值给包装类型
底层是默认调用valueOf(a);
代码
package com.ffyc.javaapi.datatype;
public class IntegerDemo2 {
public static void main(String[] args) {
int a = 10;
Integer aa = a;
}
}
范围问题
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
自动装箱时,默认调用Integer类中valueOf(),
这份方法内部对-128 -- +127之间进行缓存(数组),在此区间的自动装箱,不会创建新的Integer对象,直接从数组中获取即可
超出此区间后,每次都会new 新的Integer对象
代码
package com.ffyc.javaapi.datatype;
public class IntegerDemo3 {
public static void main(String[] args) {
Integer a = 18;
Integer b = 18;
System.out.println(a == b);//true
System.out.println(a.equals(b));//true
Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println(c == d);//false
System.out.println(c.equals(d));//true
}
}
运行
拆箱
拆箱:将包装类型可以自动转为基本类型 型
底层用到的是intValue();
代码
package com.ffyc.javaapi.datatype;
public class IntegerDemo2 {
public static void main(String[] args) {
int a = 10;
Integer aa = a;
int bb = aa;
}
}
String类
概述
Java.lang.String代表字符串
Java中凡是""括起来的 都是String类的实例(对象)
字符串的值不可改变的,一旦字符串对象被创建,它的值就不能改变了
底层存储字符串内容的数组,是被final修饰的,必须在对象创建之处由构造方法去创建
private final char value[];
String s = "abc"; abc
s += "aaa"; abcaaa
s += "bbb"; abcaaabbb
s += "ccc"; abcaaabbbccc 每次+= + 其实都是创建了一个新的字符串对象
代码
package com.ffyc.javaapi.stringdemo;
public class StringDemo1 {
public static void main(String[] args) {
String s = "abc";//[a,b,c]
s += "aaa";
s += "bbb";
s += "ccc";
System.out.println(s);
}
}
运行
创建形式
Java中字符串创建的两种方式
方式一:
String s1 = "abc";
String s2 = "abc";
在第一次创建s1变量时,会去内存中有一个叫字符串常量池的空间检索,有没有此内容的一个字符串对象,
如果没有,就会在字符串常量池中创建一个字符串对象,把对象的地址赋给s1.
在第二次创建s2变量时,会去字符串常量池中查找,如果有,直接将之前创建的字符串对象赋值给s2.
一旦出现要创建的字符串对象内容一致,返回拿到的是同一个字符串对象的地址
方式二:
String s3 = new String("abc");
String s4 = new String("abc");
无论是否存在相同内容的字符串对象,都会创建一个新的字符串对象
画图讲解
代码
package com.ffyc.javaapi.stringdemo;
public class StringDemo2 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
s1 += "aaa";
System.out.println(s1);
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true
}
}
运行
构造方法
String 构造方法
String(); 无参
String("abc");有参
String(byte[] bytes);
String(char[] bytes);
代码
package com.ffyc.javaapi.stringdemo;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class StringDemo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
String s1 = new String();// this.value = "".value;
String s2 = new String("abc");
String s3 = "abc你好";
//把字符串转为byte类型 转码
//byte[] bytes = s3.getBytes();
//把字符串转为byte类型 转码
byte[] bytes = s3.getBytes("utf-8");
System.out.println(bytes);//[B@1b6d3586
System.out.println(Arrays.toString(bytes));//[97, 98, 99, -28, -67, -96, -27, -91, -67]
//String s4 = new String(bytes);解码
String s4 = new String(bytes,"utf-8");//解码
System.out.println(s4);//abc你好
String s5 = "bced";
//字符串--->转为char数组
char chars[] = s5.toCharArray();
Arrays.sort(chars);
//char数组--->字符串
String s6 = new String(chars);
System.out.println(s6);//bcde
}
}
运行
成员方法
判断功能
成员方法
● 判断功能
boolean equals(Object obj)
boolean equalsIgnoreCase(String str)
boolean contains(String str)
boolean isEmpty()D
boolean startsWith(String prefix)
boolean endsWith(String suffix)
代码
package com.ffyc.javaapi.stringdemo;
public class StringDemo4 {
public static void main(String[] args) {
String s1 = "abcd";
String s2 = "";
//null--->关键字 ""--->字符串对象的值是""
//String s3 = null;
//判断值是否相等
System.out.println(s1.equals("abcd"));//true
//忽略大小写
System.out.println(s1.equalsIgnoreCase("abcD"));//true
//判断是否包含子串(字串必须是连续的)
System.out.println(s1.contains("ab"));//true
System.out.println(s1.contains("ab"));//true
System.out.println(s1.contains("ac"));//false
//判断是否是空串""
System.out.println(s1.isEmpty());//false
System.out.println(s2.isEmpty());//true
//System.out.println(s3.isEmpty());
//判断是否以指定的子串开头
System.out.println(s1.startsWith("ab"));//true
//判断是否以指定的子串结尾
System.out.println(s1.endsWith("bd"));//false
}
}
运行
获取功能
成员方法
● 获取功能
int length()
char charAt(int index)
int indexOf(String str)
int indexOf(String str,int fromIndex)
String substring(int start)
String substring(int start,int end)
代码
package com.ffyc.javaapi.stringdemo;
public class StringDemo5 {
public static void main(String[] args) {
String s1 = "abcdcde";
//0123456
//获取长度
System.out.println(s1.length());//4
//通过索引找位置
System.out.println(s1.charAt(1));//b
//返回指定字符首次出现的位置
System.out.println(s1.indexOf("c"));//2
//返回指定字符串首字母首次出现的位置
System.out.println(s1.indexOf("c"));//2
//从指定位置开始查找
System.out.println(s1.indexOf("c", s1.indexOf("c")+1));//4
//从后向前查找
System.out.println(s1.lastIndexOf("c"));// 4
//从指定位置开始查找
System.out.println(s1.lastIndexOf("c", 3));//2
/*//从指定的位置开始截取字符串,返回一个新的子字符串
String s = s1.substring(3);
System.out.println(s);//dcde*/
//从指定的位置开始到指定的位置结束(不包含结束)截取字符串,返回一个新的子字符串
String s = s1.substring(0,4);
System.out.println(s);//abcd
}
}
运行
转换功能
构造方法
● 转换功能
byte[] getBytes()
char[] toCharArray()
static String valueOf(char[] chs)
String toLowerCase()
String toUpperCase()
String concat(String str)
Stirng[] split(分割符);
代码
package com.ffyc.javaapi.stringdemo;
import java.util.Arrays;
public class StringDemo6 {
public static void main(String[] args) {
Integer a = null;
//System.out.println(a.toString());
//把其他类型转为字符串 建议使用的,避免出现空指针异常
String s = String.valueOf(a);
System.out.println(s);
char[] c = {'a','b','c'};
//基本数据类型转成字符串表示形式
String s1 = String.valueOf(c);
System.out.println(s1);//abc
String s2 = "abcDEF你好";
//将字符串的所有字符转换为小写字母。
System.out.println(s2.toLowerCase());//abcdef你好
//将字符串的所有字符转换为大写字母。
System.out.println(s2.toUpperCase());//ABCDEF你好
String s3 = s2.concat("wwwww");
//将指定的字符串拼接到字符串末尾,返回一个新的字符串
System.out.println(s3);//abcDEF你好wwwww
String s4 = "abc;de;fg";
//正则表达式 使用指定的一个字符,将字符串分割为一个String类型数组
String[] strings = s4.split(";");
System.out.println(Arrays.toString(strings));//[abc, de, fg]
}
}
运行
替换功能 去除字符串两侧空格
构造方法
● 替换功能
String replace(char old,char new)
String replace(String old,String new)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
● 去除字符串两空格
String trim()
代码
package com.ffyc.javaapi.stringdemo;
public class StringDemo7 {
public static void main(String[] args) {
String s1 = "abcdecfg";
//替换字符串中指定字符的所有值
System.out.println(s1.replace('c', 'C'));//abCdeCfg
System.out.println(s1.replace("cd", "jj"));//abjjecfg
//replaceAll()使用正则表达式匹配需要替换的内容
System.out.println(s1.replaceAll("c", "CC"));//abCCdeCCfg
System.out.println(s1.replaceFirst("c", "o"));//abodecfg
String s2 = " asd sax ";
System.out.println(s2.length());//9
//求字符串长度
System.out.println(s2.trim().length());//7
System.out.println(s2.replace(" ", "").trim().length());//6
}
}
运行
StringBuffer类与StringBuilder类
StringBuffer类
因为String声明的对象值一旦给定不能再改变
每次拼接都会创建新的字符串对象,耗时占用空间
StringBuffer是内容可以改变的字符串
char[] value;没有使用final修饰,每次添加内容都是对此数组进行操作,不会创建新的字符串对象
添加功能
代码
package com.ffyc.javaapi.stringdemo;
public class StringBufferDemo {
public static void main(String[] args) {
//添加功能
//创建一个内容长度+16的char数组 20
StringBuffer s1 = new StringBuffer("abcd");
System.out.println(s1.append("efg"));
//空参的构造方法 指定底层数组的长度是16
StringBuffer s2 = new StringBuffer();
System.out.println(s2.append("cz"));
//自定义容量 自动扩容
StringBuffer s3 = new StringBuffer(10);
s3.append("chjbp");
s3.append("kl");
System.out.println(s3.append("ffgg"));
//指定位置添加元素
StringBuffer s4 = new StringBuffer("abc");
System.out.println(s4.insert(2, "A"));
}
}
运行
删除功能
代码
package com.ffyc.javaapi.stringdemo;
public class StringBufferDemo {
public static void main(String[] args) {
//删除功能
StringBuffer s1 = new StringBuffer("abcd");
//删除指定位置元素
System.out.println(s1.deleteCharAt(2));
//删除指定位置的元素 包含开始位置,不包含结束位置
System.out.println(s1.delete(0, 2));
}
}
运行
替换功能
代码
package com.ffyc.javaapi.stringdemo;
public class StringBufferDemo {
public static void main(String[] args) {
//替换功能
StringBuffer s1 = new StringBuffer("abcalkdswbc");
//替换指定区间元素,包含开始位置,不包含结束位置
System.out.println(s1.replace(0, 3, "aaa"));
}
}
运行
反转功能
代码
package com.ffyc.javaapi.stringdemo;
public class StringBufferDemo {
public static void main(String[] args) {
//反转功能
StringBuffer s1 = new StringBuffer("abcdefg");
//将字符串逆序
System.out.println(s1.reverse());
//截取字符串,从StringBuffer中截取一个字符串副本,返回一个新的String对象,StringBuffer对象本身不变
String str = s1.substring(0, 3);
System.out.println(str);
}
}
运行
StringBuilder类
StringBuilder类功能和StringBuffer功能完全一致, StringBuffer是线程 安全的
代码
package com.ffyc.javaapi.stringdemo;
public class StringBuilderDemo {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder("abcd");
StringBuilder s3 = new StringBuilder(10);
System.out.println(s2.append("efg"));
System.out.println(s2.insert(1, " "));
}
}
运行
String类 --StringBuffer类--StringBuilder类
String:是一个值不可以改变的字符串
StringBuffer:值可以改变且不需要创建新对象,方法上都加了锁,是在多线程(任务)执行时是线程安全的
StringBuilder:值可以改变且不需要创建新对象,由于方法上都没有枷锁,在多线程(任务)执行时是线程不安全的,适合单线程