String类
一、String类
1、字符串是生活中常见的一种数据,Java将它封装成了对象,并定义了很多功能,以便操作字符串。
2、有关字符串中的操作都存放在java.lang.String中。
3、String类是final类,代表着String类不能有子类,所以String中操作字符串的功能是不会被复写的。
4、只要是被双引号引起来的就是一个具体的String类对象,"abc":是一个对象。
5、字符串最大的特点:字符串一旦初始化就不可以被改变(字符串常量)。
6、字符串的存储:
在内存中有个常量池中,常量池里边是个数组,用来存放字符。
当你创建"abc",就将 ‘a‘、‘b‘、‘c‘ 这三个字符存放到数组中;
当你创建"def",就将 ‘d‘、‘e‘、‘f‘ 这三个字符存放到数组中;
当你又创建"abf",就在数组中找到字符 ‘a‘、‘b‘和‘f‘,重新组成个新的字符串对象;
7、String类有自己的equals方法,功能是:判断字符串内容是否相同。
二、String类面试题
1、判断定义为String类型的s1和s2是否相等
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
解析:
第一个输出语句结果为false:
s1和s2指向的是两个不同的对象,他们存储的地址值不同,所以s1和s2不相等;
第二个输出语句结果为true:
String类重写了equals方法,String类中的equals方法比较的是字符串的内容是否相同,s1和s2的字符串内容相同。
2、判断定义为String类型的s1和s2是否相等
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
解析:
这两个输出语句结果都为true。
s1和s2都指向"abc"这个对象,所以他们存储的地址值相同,字符串内容也相同。
3、下面这两句话有什么区别?
String s1 ="abc";
String s1 = new String("abc");
解析:
第一句话在内存中创建了一个对象;第二句话在内存中创建了两个对象。
4、判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
解析:
这两个输出语句结果都为true,原因参见String类中的第6条:字符串的存储。
5、判断定义为String类型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
解析:
第一个输出语句结果为false:
第二个输出语句结果为true:
三、构造函数
1、字节数组
byte[] arr = {97,98,99};
String str = new String(byte[]) //解码,让我们看的懂的,通过默认的编码表,将字节数组转换成字符串
String(byte[], String) //解码,通过指定的编码表,将字节数组转换成字符串
String(byte[], int offset, int length, String)//解码,截取字节数组,offset是开始索引,length是截取的长度
2、字符数组
String(char[]) //将字符数组转换成字符串
String(char[], int offset, int length) //截取字符数组,offset是开始的索引,length是截取的长度
四、String类的常用方法
1、判断
1.1、boolean equals(Object); //判断传入的字符串是否与调用的字符串字符序列是否相同,相同就返回true否则false
1.2、boolean equalsIgnoreCase(string); //判断传入的字符串是否与调用的字符串字符序列是否相同,不区分大小写,相同就返回true否则false
1.3、boolean contains(string); //判断传入的字符串是否被调用的字符串包含
1.4、boolean startsWith(string); //判断调用的字符串是否以传入的字符串开头
1.5、boolean endsWith(string); //判断调用的字符串是否以传入的字符串结尾
1.6、boolean isEmpty(); //判断字符串是否为空
2、获取
2.1、int length(); //获取字符串的长度
2.2、char charAt(index); //通过索引获取对应的字符
2.3、int indexOf(int ch); //通过传入int数或者是字符找对应索引
int idnexOf(int ch,fromIndex); //在指定fromIndex的位置查找传入的字符
2.4、int indexOf(string str); //通过传入字符串查找字符串所对应的索引
int idnexOf(string str,fromIndex); //通过指定fromIndex的位置查找传入的字符串
2.5、int lastIndexOf(ch); //通过传入的字符从后向前找字符的索引值,把从后向前第一次找到的索引值返回
int lastIndexOf(ch,fromIndex); //通过指定fromIndex的位置,从后向前查找字符,把从后向前第一次找到的索引值返回
2.6、int lastIndexOf(string); //通过传入的字符串,从后向前查找,将第一次找到字符串中第一个字符的索引返回
int lastIndexOf(string,fromIndex); //通过指定fromIndex的位置,从后向前查找对应字符串,将第一次找到字符串中第一个字符的索引返回
2.7、String substring(start); //通过传入的索引值开始向后截取,截取的是索引到length
String substring(start,end); //通过传入的两个索引值截取,有开始有结尾,包含头不包含尾
3、转换
3.1、byte[] getBytes(); //编码,让计算机看的懂的,用默认的编码表,将字符串转换成字节数组
byte[] getBytes(String) //用指定的编码表进行编码
3.2、char[] toCharArray(); //将字符串转换成字符数组
3.3、static String copyValueOf(char[]); //将字符数组转换成字符串
static String copyValueOf(char[] data, int offset, int count);//将字符数组转换字符串,通过offset开始,截取count个
3.4、static String valueOf(char[]); //将字符数组转换成字符串
static String valueOf(char[] data, int offset, int count);//将字符数组转换字符串,通过offset开始,截取count个
3.5、static String valueOf(int); //将一个int数转换成字符串
static String valueOf(double);
static String valueOf(boolean);
……
3.6、static String valueOf(object);
和object.toString():结果是一样的。
3.7、String toLowerCase(): //将字符串全部转换为小写
String toUpperCase(): //将字符串全班转换为大写
3.8、"abc".concat("kk"); //将两个字符串相连接,产生新的字符串
4、替换
4.1 String replace(oldChar,newChar); //将newChar替换OldChar,如果OldChar不存在,原字符串直接赋值给替换后字符串
4.2 String replace(string,string);
5、切割
String[] split(regex); //通过regex切割字符串,切割后会产生一个字符串数组
String s = "你好 我好 大家好";
String[] arr = s.split(" ");
6、去除字符串两空格
String trim();
7、比较
String str = "ab";
String str1 = "bc";
int num = str.compareTo(str1); //如果str比str1大的话,返回的正数
//如果str比str1小的话,返回负数
//如果str和str1相等就返回0
五、StringBuffer的常用方法
1、添加
1.1、StringBuffer append(int x); //在缓冲区的末尾追加
1.2、StringBuffer insert(int index,String str); //在指定索引位置添加
2、删除
2.1、StringBuffer delete(int start, int end); //包含头索引,不包含尾部索引
2.2、StringBuffer delete(0,sb.length); //清空缓冲区
StringBuffer sb = new StringBuffer();
sb.append("aaaaa");
sb = new StringBuffer();
2.3、StringBuffer deleteCharAt(int index); //根据指定的索引删除索引对应的元素
3、修改
3.1、StringBuffer replace(int start,int end,string); //用String替换,包含头不包含尾
3.2、void setCharAt(int index ,char); //修改,把指定索引位置的值改成传入的char值
3.3、StringBuffer reverse(); //将缓冲区的元素反转
3.4 void setLength(int len); //根据传入的len值截取缓冲区的长度
4、查找
4.1 int indexOf(str); //查找str在缓冲区第一次出现的位置
4.2 int lastIndexOf(str); //从后向前查找查找str在缓冲区第一次出现的位置
六、StringBuilder和StringBuffer
1、StringBuilder和StringBuffer与String的区别
StringBuilder和StringBuffeer是可变字符序列
String是不变得,一但被初始化,就不能改变
2、StringBuilder和StringBuffer的区别
StringBuilder是线程不安全的,所以效率比较高,1.5版本出现
StringBuffer是线程安全的,效率相对较低,1.0版本出现的
包装类和其它类
一、包装类
1、什么是包装类
8种基本数据类型都会对应一个包装类
int是Integer, char是Character, 其他都是首字母大写double Double short Short boolean Boolean
2、什么时候使用
集合的泛型中只能写包装类型
后面的课程中会学到集合, 集合是只能装对象的, 而基本数据类型不是对象不能直接装入
在JDK5之前, 如果想把基本数据类型装入集合, 必须人工的进行包装(转为包装类对象)
JDK5之后, 基本数据类型和包装类之间可以自动的互相转换了
Integer i = 10;
int x = i + 20;
Integer i1 = 98;
Integer i2 = 98;
i1 == i2?
Integer i3 = 198
Integer i4 = 198
i3== i4
3、包装类常用的方法
static int parseInt(String s) //将数字字符串转换成数字,如果是非数字字符串会转换失败,抛异常
Integer.toBinaryString() //将一个十进制数字,转换成二进制的字符串
Integer.toOctalString() //将一个十进制数字,转换成八进制的字符串
Integer.toHexString() //将一个十进制数字,转换成十六进制的字符串
static long parseLong(String s)
static double parseDouble(String s)
static char forDigit(int digit, int radix)// radix代表的是进制例如二进制就传2,八进制就传8,digit代表后面进制里面的元素,而且不能超出后面进制的范围
String s = "123";
int x = Integer.parseInt(s);
String s = "abc";
char ch = Character.parseChar(s);
二、Scanner
1、创建对象
使用构造函数Scanner(InputStream)传入一个输入流, 该Scanner就可以读取数据了System.in
2、读取各种类型的数据
nextInt() 可以读取一个int
nextLine() 读取一行字符串
3、关闭问题
使用结束后要调用close()方法释放资源
三、BigInteger
1、创建对象
可以使用BigInteger(String)来创建一个很大的整数, 精度可以无限大, 值创建之后不会被改变(类似String)
2、常用方法
BigInteger add(BigInteger val) //加
BigInteger subtract(BigInteger val) //减
BigInteger multiply(BigInteger val) //乘
BigInteger divide(BigInteger val) //除
BigInteger mod(BigInteger m ) //模
BigInteger max(BigInteger val) //两个数的最大值
BigInteger min(BigInteger val) //两个数的最小值
四、BigDecimal
1、创建对象
BigDecimal(double); //不建议用,运算结果不精确
BigDecimal(String); //可以,但是每次都要传字符串给构造函数
static BigDecimal valueOf(double) //可以,而且可以直接传double数
因为double数是不精确,是无限接近那个数,用BigDemal这个类可以让其精确
2、常用方法
BigDecimal add(BigDecimal augend)
BigDecimal subtract(BigDecimal subtrahend)
BigDecimal multiply(BigDecimal multiplicand)
BigDecimal divide(BigDecimal divisor)
五、时间类
1、Date
比较古老的一个类, 大多数方法已过时, 但通常我们还会用它来获取当前时间
new Date()可以创建日期对象, 然后使用SimpleDateFormat可以将其格式化成我们需要的格式
通常使用的格式为: "yyyy-MM-dd HH:mm:ss", 具体格式说明详见SimpleDateFormat类yyyy年MM月dd日 E HH:mm:ss
a、获取当前时间的毫秒值
Date d = new Date();
d.getTime(); //获取的是1970年1月1日0时0分0秒到当前时间的毫秒值
System.currentTimeMillis();
b、将毫秒值转换成时间对象
Date d = new Date(毫秒值) //同毫秒值获取时间对象
Date d = new Date();
d.setTime(毫秒值);
2、Calendar
很多方法都是替代了Date类的方法, 最常用的就是
int get(int field)(Calendar.YEAR) //通过传入的字段获取对应的值,(获取年对应的值)
void add(int field, int amount) //field代表传入的时间字段可以是年月日等,amount代表是数值,整数就是在传入的字段上加,负数减
void set(int field, int value) //field代表传入的时间字段可以是年月日等,value代表设置的值,想设置哪一年或月日等,就写哪个值
void set(int year, int month, int date)
可以对指定的字段获取, 设置, 以及增减
六、计时器
1、Timer
Timer类可以在指定的时间或者延迟指定毫秒之后执行一个任务
定义类继承TimerTask, 重写run()方法, 定义任务
调用Timer类的schedule()方法安排任务
七、系统类
1、System
System.in是程序的标准输入流, 默认指向键盘输入
System.out是程序的标准输出流, 默认指向控制台
System.exit()是退出Java虚拟机
System.gc()回收虚拟机中的垃圾对象
2、Runtime
Process exec(String command) 方法可以执行一个Dos命令
八、算术类
1、Math
提供了一些和数学运算相关的方法,
static double PI //获取π(派)的值
static double floor(double a) //是小于等于a这个double值的最大整数对应的double值
static double ceil(double a) //是大于等于a这个double值的最小整数对应的double值
static long round(double a ) //四舍五入,返回是一个long值
static double sqrt(double a) //开平方
static double pow(double a, double b) //a是底数,b是指数返回的是a的b次幂
九、随机类
1、Random
可以生成随机数, nextInt(), nextDouble(), nextBoolean()