一、String
1.常量池
注:
1.直接赋值常量,会先在常量池寻找是否有该常量,如果有直接将常量池中的常量付给对象,如果没有的话java会帮你在常量池创建一个字符串对象。
2.new 对象时赋值 会在堆里创建对象
3。“str1 == str2” 字符串之间加 == 代表 判断二者的地址是否相等
public void test1() {
// "abc"双引号括起来的字符串:常量字符串,他也是一个对象
// 1.8之后常量池放到堆,在常量池里面找有没有这个"abc"对象,
// 如果常量池里面没有这个字符串对象,java就帮你在常量池里面new一个"abc"字符串对象。
// 如果常量池里面有这个字符串,就把这个字符串的地址赋给这个变量。
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
// ==比较的是变量指向的对象的地址值
System.out.println(str1 == str2);// false
System.out.println(str1 == str3);// true
System.out.println(str2 == str3);// false
// 比较字符串的内容是不是相等使用equals()
// 表str1这个字符串和str2这个字符串的内容是不是相等
System.out.println(str1.equals(str2));// true
System.out.println(str1.equals(str3));// true
System.out.println(str2.equals(str3));// true
}
2.Sting常用操作
练习
1.string转double
@Test
public void test1(){
String str = "3.1415926";//当转化成double类型时 字符串中不能有非数字字符
System.out.println(str+1);//str+1 变成了字符串的拼接
double v = Double.parseDouble(str);
System.out.println(v+1 );
}
2.string转换数组
@Test
public void test2(){
String string = "java";
System.out.println(string.charAt(4));
}
3.获取:charAt、indexOf、lastIndexOf
@Test
public void test3(){
int[] array = {1,2,3,4};
System.out.println(array.length);
String string = "java AndroidA";
System.out.println(string.length());//13
char[] chars = string.toCharArray();
System.out.println(string.charAt(5));//A
// indexOf
System.out.println(string.indexOf('n'));//6
System.out.println(string.indexOf('A',7));//12 从第7个开始找A
System.out.println(string.indexOf("And"));//5 找到的第一个的下标
System.out.println(string.indexOf("oid",5));//9
// lastindexOf
System.out.println(string.lastIndexOf('A'));//12
System.out.println(string.lastIndexOf('i',12));
System.out.println(string.lastIndexOf("dA"));
System.out.println(string.lastIndexOf("A",8));
}
4.判断:equals、equalsIgnoreCase、contains、startsWith、endsWith、isEmpty
@Test
public void test4(){
String string1 = "abc";
String string2 = "Abc";
// 字符串相等
System.out.println(string1.equals(string2));//flase
// 字符串相等忽略大小写
System.out.println(string1.equalsIgnoreCase(string2));//true
// 字符串是否包含子串
String str = "java AndroidA";
System.out.println(str.contains("And"));//true
// 判断是否为字符串的前缀
System.out.println(str.startsWith("java"));//true
// 判断是否为下标5的前缀
System.out.println(str.startsWith("And",5));//toffset 偏移量 true
// 判断是否为字符串的后缀
System.out.println(str.endsWith("iodA"));//flase
// 判断字符串是否为空
System.out.println(str.isEmpty());//fasle
String str1 = "";
System.out.println(str1.isEmpty());//true
char[] array = {'j', 'a', 'v', 'a', ' ', 'A', 'n', 'd'};
char[] chars = str.toCharArray();
String str2 = new String(array);
System.out.println(str2);
// replace 将全部的字符进行替换,但返回一个新的字符串类型,原来的字符串不进行修改
String replace = str.replace('A', 'B');
System.out.println(str);
System.out.println(replace);
}
5.切割
@Test
//根据空格将字符串进行切割
public void test5(){
String string = "java AndroidA";
String[] array = string.split(" ");
for (String s : array) {
System.out.println(s);
}
}
6.获取子串
@Test
public void test6(){
//subtree 子树
String string = "java AndroidA";
System.out.println(string.substring(5));//AndroidA
System.out.println(string.substring(5, 11));//Androi
System.out.println(string.substring(5, 13 ));
}
@Test
3.stringBuffer、stringBuilder
String、StringBuffer、StringBuilder
相同点:都是final类,都不能被继承。
不同点:
1、String长度是不可改变的,StringBuffer、StringBuilder长度是可变的。
2、StringBuffer是线程安全(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)。
String长度不可改变
str1 = str1 +str2 + str3 + str4 + str5
new 一个新的对象后再把值赋给str1
除了最后一个对象其他对象全都没有用,浪费了对象
如果对这段代码加锁,就可以实现每次只有一个用户能进入这段代码,当执行完了之后,释放这个锁,另一个用户才能进来。
if (money>1000) {
money = money - 1000;
}
常量字符串的拼接,编译器会做优化,使用String就可以:
String str = “Java” + “PHP” + “Python” + “C”;
@Test
public void test7(){
String string = " skahdkasjd ";
System.out.println(string);
System.out.println(string.trim());
String string1 = "abc";
String string2 = "def";
String string3 = "ghi";
string1 = string1 + string2 + string3;
System.out.println(string1);
StringBuffer stringBuffer = new StringBuffer("abc");
stringBuffer.append(string2);
stringBuffer.append(string3).append(string1);
System.out.println(stringBuffer);
StringBuilder stringBuilder = new StringBuilder("abc");
stringBuilder.append(string2);
stringBuilder.append(string3);
System.out.println(stringBuilder);
}
二、包装数据类型
1.概念
Java是纯面向对象语言,int、double都是基本数据类型。
Byle类 byte类型的包装类
Short类 short类型的包装类
Integer类 int类型的包装类
Long类 long类型的包装类
Float类 float类型的包装类
Double类 double类型的包装类
Character类 char类型的包装类
Boolean类 boolean类型的包装类
String和Date本身就是类。所以也就不存在什么包装类的概念了。
除了基本数据类似之外的都是引用数据类型,用一个类来描述。
所有引用数据类型的默认值是null。
虽然基本数据类型和包装数据类型互相转换有装箱和拆箱的过程,但是我们平时使用的时候
就把包装数据类型当成基本数据类型来使用就可以。
包装数据类型最主要使用:包装数据类型和字符串之间的转换
1、把基本数据类型转换成字符串
(1) 基本数据类型+"" : String str = 12 + “”; // “12”
(2) 基本数据类型的包装类.toString()
String str1 = Integer.toString(3);
String str2 = Double.toString(3.14);
2、把字符串转换成基本数据类型(从网页的输入框中得到的都是字符串)
(1) Integer.parseInt(String str); // “23” “3.14”
Double.parseDouble(String str);
Boolean.parseBoolean(String str);
XXXX.parseXXXX(String str);
(2) new对象: Integer integer = new Integer(String str);
Integer interger = new Integer(“4”);
int i = integer.intValue();
练习:
@Test
public void test8(){
Integer integer1 = 12;
//装箱
Integer integer2 = new Integer(12);
//拆箱
int i =integer1.intValue();
System.out.println(i);
integer1 = integer1 +12;
System.out.println(integer1);
}
练习题
1、实现trim方法
String trim(String str);
“java Android”
" java Android"
"java Android "
“”
" "
@Test
public void test(){
// String string = " java Android ";
// String string = " java Android";
// String string = "java Android ";
String string = " ";
String str = trim(string);
System.out.println(str);
}
public String trim(String string) {
if (string == null || string.equals("")){
return "";
}
int end = string.length()-1;
int start = 0;
while ((start >= end) && (string.charAt(start) == ' ')){
start++;
}
while ((start >= end) && (string.charAt(start) == ' ')){
if (start >= end){
return "";
}
end--;
}
String substring = string.substring(start, end + 1);
return substring;
}
2、实现把“I Love Java!”的字符全部转换为小写并输出到控制台。
toLowerCase() toUpperCase()
Case Sensitive大小写敏感
@Test
public void test(){
String string = "I Love Java!";
System.out.println(lowerCase(string));
}
private String lowerCase(String string) {
if (string == null){
return "";
}
char[] toCharArray = string.toCharArray();
for (int i = 0; i < toCharArray.length; i++) {
if (toCharArray[i] >= 'A'&& toCharArray[i] <= 'Z'){
// toCharArray[i] += 32;
toCharArray[i] = (char) (toCharArray[i] + 32);
}
}
String string2 =new String(toCharArray );
return string2;
}
3、使用String类中的split()函数,统计出“this is my homework! I must finish it!”中单词的个数。
(注意:单词之间用一个空格来分隔。)
@Test
public void test1(){
String str = "this is my homework! I must finish it!";
String[] split = str.split(" ");
for (String s : split) {
System.out.print(s);
System.out.print(" ");
}
System.out.println();
System.out.println(split.length);
}