String
关于Java JDK中内置的一个类:java.lang.String
1.String表示字符串类型,属于引用数据类型,不属于基本数据类型。
2.在java中所有使用双引号括起来的都是String对象。
3.java中规定,双引号括起来的字符串,是不可变的。
4.在JDK只当中双引号括起来的字符串,都是直接存储在“方法区”的“字符串常量池”中。
为什么SUN公司把字符串存储在一个“字符串常量池”中?
分析:
①凡是双引号括起来的都在字符串常量池
②使用new的方式创建的字符串对象,一定在堆内存中开辟空间。
public class UserTest { public static void main(String[] args) { User user=new User(110,"张三"); } }
public class User { private int id; private String name; public User() {} public User(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
String类型-"直接用双引号"
public class StringTest02 { public static void main(String[] args) { String s1="hello"; String s2="hello"; System.out.println(s1==s2);//true } }
String类型-new对象
public class StringTest02 { public static void main(String[] args) { String x=new String ("xyz"); String y=new String ("xyz"); System.out.printlnx==y);//false System.out.println(x.equals(y));//true } }
关于String类中的构造方法
①String s = new String("");
②String s = "";
③String s = new String(char 数组);
④String s = new String(char数组,起始下标,长度);
⑤String s = new String(byte数组);
⑥String s = new String(byte数组,起始下标,长度);
String类中常用的方法
1.charAt(int index):返回 char指定索引处的值。
char c="中国人".charAt(1);//国
2.(了解) int compareTo(String anotherString):按字典顺序比较两个字符串
int result="abc".compareTo("abc");//0:前后一致 int result2="abcd".compareTo("abce");//-1:前小后大 int result3="abce".compareTo("abcd");//1:前大后小 int result4="xyz".compareTo("yxz");//-1:只比较第一个不同的字符
3.(掌握) boolean contains(CharSequence s):判断前面的字符串是否包含后面额子字符串
>System.out.println("http://www.baidu.com".contains("http://"));//true
4.(掌握) boolean endsWith(String suffix):判断当前字符串是否以某个字符串结尾
System.out.println("test.txt".endsWith(".txt"));//true >System.out.println("asjdasabnkjdkaass".endsWith("ss"));>//true
5.(掌握) boolean equals(Object ):比较两个字符串必须使用equals方法,不能使用“==”
System.out.println("abc".equals("abc"));//true
6.equalsIgnoreCase(String anotherString):判断两个字符串是否相等,忽略大小写
System.out.println("ABc".equalsIgnoreCase("abC"));//true
7.(掌握) byte[] getBytes():将字符串对象转换成字节数组
byte[] bytes="abcdef".getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.println(bytes[i]); }
8.(掌握) int indexOf(String str):判断某个子字符串在当前字符串中第一次出现处的索引
System.out.println("oraclejavac++.netc#phppythonjavaoraclec++".indexOf("java"));//6
9.(掌握) boolean isEmpty():判断某个字符串是否为空
String s1=""; System.out.println(s1.isEmpty());//true String s2="a"; System.out.println(s2.isEmpty());//false
10.(掌握) int length():判断数组长度是length属性,判断字符串长度是length()方法
System.out.println("abc".length());//3 System.out.println("".length());//0
11.(掌握)lastIndexOf(int ch):返回指定字符的最后一次出现的字符串中的索引。
System.out.println("oraclejavac++.netc#phppythonjavaoraclec++".lastIndexOf("java"));//28
12.(掌握)replace(char oldChar, char newChar):返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
String newString="http://www.baidu.com".replace("http://","https://"); System.out.println(newString);
13.replaceAll(String regex, String replacement):用给定的替换替换与给定的 regular expression匹配的此字符串的每个子字符串。
String[] ymd="1980-10-11".split("-"); for (int i = 0; i < ymd.length; i++) { System.out.println(ymd[i]); } String param="name=zhangsan&password=123&age=20"; String[] params=param.split("&"); for (int i = 0; i < params.length; i++) { System.out.println(params[i]); }
14.(掌握) boolean startsWith(String prefix):判断某个字符串是否以某个字符串开始.
System.out.println("http://www.baidu.com".startsWith("http"));//true System.out.println("http://www.baidu.com".startsWith("https"));//false
15.(掌握) String substring(int beginIndex):截取字符串,参数是起始下标
System.out.println("http://www.baidu.com".substring(7));//www.baidu.com
16.(掌握) String substring(int beginIndex,int endIndex):截取字符串,参数是起始下标(包括)、结束下标(不包括)
System.out.println("http://www.baidu.com".substring(7,10));//www
17.(掌握) char[] toCharArray():将字符串转换成char数组
char[] chars="我是中国人".toCharArray(); for (int i = 0; i <chars.length ; i++) { System.out.println(chars[i]); }
18.(掌握) String toLowerCase():将所有在此字符 String使用默认语言环境的规则,以小写。
System.out.println("ABCDefKXyz".toLowerCase());
19.(掌握) String toUpperCase():将所有在此字符 String使用默认语言环境的规则,以大写。
System.out.println("ABCDefKXyz".toUpperCase());
20.(掌握) String trim():去除字符串前后空白
System.out.println(" hello word ".trim());//hello word
21.(掌握) valueOf:将非字符串转换成字符串
public class StringTest05 { public static void main(String[] args) { //String中只有一个方法是静态的,不需要new对象 String s1=String.valueOf(100); System.out.println(s1); String s2=String.valueOf(new Customer()); System.out.println(s2);//没有重写toString方法前是对象内存地址 } }
class Customer{ @Override public String toString() { return "Customer{}"; } }
StringBuffer
思考:我们在实际的开发中,如果需要进行字符串的频繁拼接,会有什么问题?
因为Java中的字符串是不可变的,每一次拼接都会产生新字符串。
这样会占用大量的方法去内存,在成内存空间的浪费。
例如:String s = "abc"; s+="hello"; //就以上两行代码,导致在方法去字符串常量池当中创建了3个对象: "abc"、"hello"、"abchello"
如果以后需要进行大量字符串的拼接操作,建议使用JDK自带的:
java.lang.StringBuffer
StringBuffer底层实际上是一个byte[] 数组,往StringBuffer中放字符串实际上是放到byte数组当中。拼接字符串调用append()方法。public class StringBufferTest02 { public static void main(String[] args) { //创建一个初始化容量为16个byte[] shuzu .(字符串缓冲区对象) StringBuffer stringBuffer =new StringBuffer(); stringBuffer.append("a"); stringBuffer.append("b"); stringBuffer.append("d"); stringBuffer.append(3.14); stringBuffer.append(true); //appen方法底层在进行追加的时候,如果byte数组满了,会自动扩容 stringBuffer.append(100L); System.out.println(stringBuffer.toString()); //指定初始化容量的StringBuffer对象(字符串缓冲区对象) StringBuffer sb=new StringBuffer(100); sb.append("hello"); sb.append("world"); sb.append("hello"); sb.append("kitty"); System.out.println(sb.toString()); } }
java.lang.StringBuilder
public class StringBuilderTest01 { public static void main(String[] args) { //使用StringBuilder也可以完成字符串的拼接 StringBuilder sb=new StringBuilder(); sb.append(100); sb.append(true); sb.append("hello"); sb.append("kitty"); System.out.println(sb); } }
StringBuffer与StringBuilder的区别:
StringBuffer的方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行是安全的。StringBuilder中的方法都没有synchronized关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。
基础类型对应的8个包装类
1.java中为8种基本数据类型准备了对应的8种包装类型。8种包装类属于引用数据类型,父类是Object。
2.思考:为什么要提供8种包装类呢?👇
调用doSome()方法的时候需要传数字进去,但数字属于基本数据类型,doSome()方法的参数类型是Object,即doSome()方法无法接受基本数据类型的数字。
public class IntegerTest01 { public static void main(String[] args) { doSome(数字); } public static void doSome(Object obj){ System.out.println(obj); } }
解决方法:传一个数字对应的包装类进去
/* SUN公司已经写好,8种基本数据类型对应的8种包装类, 实际开发时直接用,不需要自己写包装类。 */ public class MyInt { int value; public MyInt() {} public MyInt(int value) { this.value = value; } @Override public String toString() { return String.valueOf(value); } }
public class IntegerTest01 { public static void main(String[] args) { MyInt myInt=new MyInt(100); doSome(myInt); } public static void doSome(Object obj){ System.out.println(obj); } }
8种基本数据类型对应的包装类型名:
基本数据类型 包装类型
byte-> java.lang.Byte(父类Number)
short-> java.lang.Short(父类Number)
int-> java.lang.Integer(父类Number)
long-> java.lang.Long(父类Number)
float-> java.lang.Float(父类Number)
double-> java.lang.Double(父类Number)
boolean-> java.lang.Boolean(父类Object)
char-> java.lang.Character(父类Object)
Number是抽象类,无法实例化对象,但是可以利用Number中的方法
public class IntegerTest02 { public static void main(String[] args) { //基本数据类型-(转换)>引用数据类型 Integer i = new Integer(213); //引用数据类型-(转换)>基本数据类型 float f=i.floatValue(); System.out.println(f); } }
这不是自动装箱
在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
Integer i = new Integer(10);
而从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:
Integer i = 10;
这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型:
Integer i = 10; //装箱
int n = i; //拆箱
简单一点说,装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型装箱与拆箱概念:
作者:Matrix海子
出处:http://www.cnblogs.com/dolphin0520/
关于 Integer类的构造方法:
Integer(int)->jdk9之后不建议使用这个构造方法
Integer(String)public class IntegerTest03 { public static void main(String[] args) { //将数字100转换成Integer包装类型(int --> Integer) Integer x = new Integer(100); //将String类型的数字,转换成Integer包装类型(String --> Integer) Integer y = new Integer("123"); } }
其他包装类型也是如此👆
通过访问包装类的常量,来获取最大值和最小值
public class IntegerTest04 { public static void main(String[] args) { System.out.println("int的最大值:"+Integer.MAX_VALUE); System.out.println("int的最小值:"+Integer.MIN_VALUE); System.out.println("byte的最大值:"+Byte.MAX_VALUE); System.out.println("byte的最小值:"+Byte.MAX_VALUE); } }
思考题:String为什么是不可变的?
答:String类中的byte数组是使用final修饰的。因为数组一旦创建长度就不可变,并且被final修饰的引用一旦指向某个对象之后,不可再指向其他对象。所以String是不可变的。
思考题:StringBuffer为什么是可变的呢?
答:StringBuffer/StringBuilder内部实际上是一个byte[]数组,且这个byte[]数组没有被final修饰。StringBuffer/StringBuilder的初始化容量为16,当存满之后会进行扩容,底层调用了数组拷贝的方法System.arraycopy()。所以。StringBuffer/StringBuilder适合于使用字符串的频繁拼接操作。
注意:
字符串不可变是指双引号里面的字符串对象不可变,变量可指向其他对象。
String s="abc";
"abc"不可变成"ab"
s="xyz";没问题
日期相关类
数字相关类
Random
Enum
类在强制类型转换过程中,如果是类转换成接口类型。java语言允许类和接口之间不需要存在继承关系,也可以转换。