一:String
java.lang.String使用了final修饰,不能被继承,字符串底层封装了字符数组及针对字符数组的操作算法,字符串一旦创建,对象无法改变,但字符串引用可以重新赋值,任何一个字符对应两字节定长编码,静态字符串(字面量/常量/常量的连接结果)在常量池中创建 //两个常量的连接也创建一个对象放在常量池中 //重用字符串常量池中的对象
例如:String str = new String ("ABC");//这个代码执行期创建了两个字符串对象,一个是“ABC”,另一个是new出来的str对象还创建了一个数组对象
.length()方法可以检查字符串中字符的个数 ,字符串的长度是方法,数组的长度是属性
String提供了charAt()方法获取指定位置上的字符
例如:char ch = str.charAt(0); //获取str字符串第一个字符
valueOf()方法:将其他类型转换为String类型
例如:
int pi = 3;
double d = 3.14;
char c = 'c';
boolean flag = true;
String str = String.valueOf(pi);
str = String.valueOf(d);
str = String.valueOf(c);
str = String.valueOf(flag);
indexOf()方法:检查字符串中字符或字符串出现的位置
String str = "http://www.zijietiaodong.com/";
int n = str.indexOf('/');//在字符串中检查'/'出现的位置,如果找到第一个字符的位置,就返回这个位置,如果没有找到指定字符就返回-1,查找字符串时候返回的是匹配字符的起始位置;
indexOf()也有重载函数:n = str.indexOf('/',7);表示从字符串的第八个开始查找'/'的位置,查找字符串同理,没查到也返回-1
lastIndexOf()方法返回的也是字符或字符串下标的位置,只不过是重后向前找 ,与indexOf类似
截取子字符串方法:substring(起始位置,结束位置), 包含起始位置不包含结束位置
例如:String str1 = "http://www.zijietiaodong.com/";
String s = str1.substring(4, 7);
substring重载:从起始位置到后面全部截取 例如:String s9 = str1.substring(8);//重第八个开始到后面全部截取
.trim()f方法:去除当前字符串的两端空白 trim()如果字符串两端有空白则返回这个字符串的一个两端没有空白的副本 没有空白则返回原字符串 空白:编号小于等于32的字符
例如:String str2 = "\n \r \t Tom \t\r";
String url = str2.trim();
startWith()和endsWith(): 用来检测一个字符串是否以指定字符串开头或结尾 返回boolean型
例如:String st = "Thing in Java";
System.out.println(st.startsWith("T"));//true
System.out.println(st.endsWith("Java"));//true
例题:/*
* http://canglaoshi.org/index.html
* https://canglaoshi.org/index.html
* 0123456789
* 截取主机名(主机名就是//后面的到/前面的)
*/
String url3 = scan.nextLine();
int start = url3.startsWith("https")?8:7;
int end = url3.indexOf("/",start);
String host = url3.substring(start,end);
System.out.println(host);
String str = scan.next().toUpperCase();//输入的字符无论大小写都转成大写toLowerCase为转成小写
if(str.equals("EXIT")) { //.equals是判断字符串内容相等
char[ ] input = str.toCharArray();//把str字符串转换成char数组
StringBuilder:(可变字符串):字符串中的字符数组元素可以被改变(数组容量通常为16个,不够了就自动扩容,扩容个数为一倍加二)
可变字符串StringBuilder Java 中的String连接过程就是利用StringBuilder实现的
StringBuilder是非线程安全的,并发处理的,性能快 ,新jdk的
StringBuffer:是线程安全的,同步处理,性能慢,老jdk的
字符串复杂的内容计算(例如for循环字符串连接“+”号)建议用StringBuilder的append然后.toString()转换成String
StringBuilder中的append()方法,追加字符串
例如:StringBuilder buf = new StringBuilder();
buf.append("abc");//添加 buf.length() //数组的长度 buf.capacity() //数组的容量
//insert(int位置,String内容)方法插入字符串
//delete(int start,int end)删除字符串(包含起始不包含结束)
//replace(int start,int end,String str)替换字符串
//reverse()字符串反转
例如:str.append("ABCDE"); //ABCDE
str.append("FG"); //ABCDEFG
str.insert(0, "ZZZ"); ZZZABCDEFG
str.delete(0, 3); //ABCDEFG
str.replace(0, 2, "ZZZ"); ZZZDEFG
str.reverse(); //GFEDZZZ
StringBuilder方法的返回都是当前方法的引用
例如:上面可以写成(函数编程风格):str.append("ABCDE").append("FG").insert(0, "ZZZ").delete(0, 3).replace(0, 2, "ZZZ").reverse();
八个基本类型的包装类:
包装类
由于八个基本类型没有面向对象特性,为了能让他们参与到面向对象的开发中,java为这八个基本类型提供了对应的 八个包装
六个数字相关的包装类继承自java.lang.Number ,Number是一个抽象类,定义了不同类型的数字之间相互转换的方法,所以六个数字类型的包装类都可以将其表示的基本类型在这六个类型之间转换
将基本类型转换为包装类
方法一:Integer i1 = new Integer(1);//将基本类型1转换为引用类型的包装类 int----Integer char----Character 其他都是变为首字母大写
方法二:推荐使用包装类的静态方法valueOf来转换 , Integer i1 = Integer.valueOf(128);
包装类转换为原类型:
int n = i1.intValue();
double dou = i1.doubleValue();
byte b = i1.byteValue();
数字类型包装类都支持两个常量:MAX_VALUE,MIN_VALUE , 分别表示对应的基本类型的取值范围
例如:int n = Integer.MAX_VALUE;
int m = Integer.MIN_VALUE;
long lmax = Long.MAX_VALUE;
char cmax = Character.MAX_VALUE;
包装类都提供了一个静态方法:parseXX(String str) , 可以将字符串解析为对应的基本类型数据,但是前提是该字符串描述的数据能被基本类型正确表示
例如:
String str = "123";
int n = Integer.parseInt(str);
double d = Double.parseDouble(str);
JDK1.5之后推出了一个新特性:自动拆装箱 ,该特性是编译器认可,而不是JVM , 编译器在编译代码是若遇到基本类型与包装类互用时会自动补全他们之间转换的代码,这样做可以让我们在源代码中编写时不在考虑转换
例如:int n = new Integer(2);
Integer out = n;
//jdk1.5后 , 触发了自动拆箱特性 , 编译器内部会自动将代码改编为
int n = new Integer(2).intValue();
Integer out = Integer.valueOf(n);