Java中基 *本数据类型:四类八种,都会对应一个引用类型(JDK5以后新特性:自动拆装箱)
基本类型 对应的引用类型
* byte Byte
* short Short
* int Integer
* long Long
* float Float
* double Double
* char Character
* boolean Boolean
*
* 基本类型 内存中---引用类型:好处就是可以String类型之间进行转换!
*
*
* Character:包含了一个char的值
* 构造方法
* public Character(char value) :创建Character类对象,参数为char类
*
* 提供 了一些判断功能
* public static boolean isDigit(char ch):判断这个ch字符是否为数字
* public static boolean isLowerCase(char ch):判断这个ch字符是否为小写字母字符
* : public static boolean isUpperCase(char ch):判断这个ch字符是否为大写字母字符
Integer类的静态的功能
* public static String toBinaryString(int i):将十进制转换成二进制(以字符串形式体现)
* public static String toOctalString(int i):转换八进制(返回String)
* public static String toHexString(int i):转换成十六进制(返回String)Integer类:
* 成员变量:
* public static final int MIN_VALUE:包装了int类型的最小值
* public static final int MAX_VALUE:包装了int类型的最大值构造方法
* public Integer(int value):将int类型的数据包装为Integer类型
* public Integer(String s) throws NumberFormatException :将字符串值包装为Integer类型
*此s参数必须为数字字符串,否则程序出现 NumberFormatException(数字格式化异常)
int num = 200; //声明这个变量int
Integer i = new Integer(num); //创建一个Integer类对象:将int---->装箱为Integer了
//public int intValue()
//public static Integer valueOf(int i)
i = Integer.valueOf(i.intValue() + 100); // i = Ineger.valueOf(先将Integer拆箱为int) ---->在装箱为Integer类型
System.out.println(i);Jdk5以后新特性:
* 静态导入,自动拆装箱,增强for循环,可变参数,枚举...
*
* 自动拆装箱:
* 装箱: 基本数据类型 会自动的包装为对应的引用类型
* 拆箱: 引用类型会自动的转换为基本数据类型Integer类中存在一个:内部缓存区 IntegerCache(Integer的成员内部类): 范围:-128~127
*
* 直接赋值:----考虑到值的是否在范围内
*
* Integer xx = 值 ;---->底层执行的valueOf(int )
*
* public static Integer valueOf(int i) {
* if (i >= IntegerCache.low && i <= IntegerCache.high){
* return IntegerCache.cache[i + (-IntegerCache.low)]; //127 + 128
* }else{
* return new Integer(i); //new Integer(128) ;
* }
*
*
* }
*
* 如果不在内部缓存区 的范围内(-128~`27):会重新开辟空间new Integer
* 如果在内部缓存区中:直接从缓冲区(Integer的静态的成员内部类) :直接从缓存区中取值!public class IntegerTest { public static void main(String[] args) { Integer i1 = 127 ; // Integer i2 = new Integer(127) ; Integer i2 = 126 ; System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.println("-------------------------"); Integer i3 = new Integer(127) ; Integer i4 = new Integer(127) ; System.out.println(i3==i4); System.out.println(i3.equals(i4)); System.out.println("--------------------------"); Integer i5 = 128 ; Integer i6 = 128 ; System.out.println(i5 == i6);//false System.out.println(i5.equals(i6)); System.out.println("--------------------------"); Integer i7 = 129 ; Integer i8 = new Integer(129) ; System.out.println(i7==i8); System.out.println(i7.equals(i8));
==和equals的区别
* ==:连接的引用类型变量:比较的是地址值是否一样
* equals:默认比较的是两个对象的地址值是否相同,只要他重写了Object的equals方法,比较的是对象中的内容是否相同
* String类本身重写了equals方法
*
* 将常量赋值给String变量以及new String("常量")区别
* 前者是在常量池中去寻找是否存在这个常量,有就返回它常量池中的这个常量地址;否则,就在常量池中开辟空间!
* 后者:是在堆内存中开辟空间,同时字符串常量标记,需要在常量池中寻找这个常量字符串变量相加:先开空间,不会直接先拼接;
* 而字符串常量相加,直接先相相加,然后看结果是否在常量池中有,如果存在,直接返回当前这个地址;否则开辟的新的空间
*
*public class StringDemo2 {
public static void main(String[] args) {
String s1 = "hello" ;
String s2 = "world" ;
String s3 = "helloworld" ;
System.out.println((s1+s2)==s3)
System.out.println((s1+s2).equals(s3));
System.out.println("-----------------------------");
System.out.println(("hello"+"world")==s3);
System.out.println(("helloworld").equals(s3));
}
}运行结果:
false
true
-----------------------------
true
true反编译工具
可以使用反编译工具查看当前字节码文件----如何进行优化的!
String s = "hello";
String s1 = "world";
String s2 = "helloworld";
System.out.println((new StringBuilder()).append(s).append(s1).toString() == s2);
System.out.println((new StringBuilder()).append(s).append(s1).toString().equals(s2));
System.out.println("-----------------------------");
System.out.println("helloworld" == s2);
System.out.println("helloworld".equals(s2));
}
字符串的判断功能
* public boolean equals(Object anObject):
* 判断当前字符串和此传递进来的字符串进行对比:内容是否相同
* public boolean equalsIgnoreCase(String anotherString):不区分大小写,对比的字符串内容
* public boolean contains(CharSequence s):判断是否包含指定的字符值
* public boolean isEmpty():判断字符串 是否为空内容
* boolean startsWith(String prefix) :判断以指定的字符串开头
* boolean endsWith(String suffix):判断以指定的字符串结尾
public class StringDemo {
public static void main(String[] args) {
//创建一个字符串
String s = "helloJavaEE" ;
//public boolean equals(Object anObject): 区分大小写的(如果为字符串类型)
System.out.println("equals():"+s.equals("HELLOJavaEE"));
System.out.println("equals():"+s.equals("helloJavaEE"));
System.out.println("------------------------------------");
// public boolean equalsIgnoreCase(String anotherString):不区分大小写,对比的字符串内容
System.out.println("equalsIgnoreCase():"+s.equalsIgnoreCase("HELLOJavaEE"));
System.out.println("------------------------------------");
// public boolean contains(String s):判断是否包含指定的子字符串
System.out.println("contains():"+s.contains("hello"));
System.out.println("contains():"+s.contains("ak47"));
System.out.println("------------------------------------");
// public boolean isEmpty():判断字符串 是否为空内容
//不是空内容就是flase,为空内容,就是true
/* s = "" ;//空字符串: 空字符序列
System.out.println(s.isEmpty());
s = null ; //空对象
// System.out.println(s.isEmpty());
if(s!=null){
System.out.println(s.isEmpty());
}else{
System.out.println("对不起,没有字符串对象存在");
}*/
System.out.println("--------------------------------");
System.out.println(s.startsWith("hel"));
System.out.println(s.endsWith("ee"));
}
}
String的应用
* 键盘录入字符串,遍历字符串:就是将字符串中每一个字符一一获取!
public class StringDemo3 {
public static void main(String[] args) {
/* Scanner sc = new Scanner(System.in) ;
System.out.println("请你输入一个字符串:");
String line = sc.nextLine() ;*/
String s = "helloworld" ;
//原始的做法:charAt(索引值)
System.out.println(s.charAt(0));
System.out.println(s.charAt(1));
System.out.println(s.charAt(2));
System.out.println(s.charAt(3));
System.out.println(s.charAt(4));
System.out.println(s.charAt(5));
System.out.println(s.charAt(6));
System.out.println(s.charAt(7));
System.out.println(s.charAt(8));
System.out.println(s.charAt(9));
System.out.println("-------------------------");
//charAt(int ch)+length()
//直接使用String类的获取功能
for(int x = 0 ; x < s.length() ; x ++){
char ch = s.charAt(x) ;
System.out.print(ch+"\t");
}
System.out.println();
System.out.println("-------------------------");
//使用转换功能去完成:
//char[] toCharArray()
char[] charArray = s.toCharArray();
for (int i = 0; i <charArray.length ; i++) {
//每一个字符获取到了
char ch = charArray[i] ;
System.out.print(ch+"\t");
}
System.out.println();
}
}
String类的转换功能
* public char[] toCharArray():将指定的支持转换成新的字符数组
* public byte[] getBytes():编码,将指定的字符串以平台默认编码集进行编码(String---byte[])
* public String toLowerCase():将当前字符串转换成小写
* public String toUpperCase():将当前字符串转换成大写
* static String valueOf(int i/boolean/double/float/Object):将部分的基本数据和Object引用类型转换成String
String类的截取功能
* public String substring(int beginIndex) :从指定的位置开始进行截取,默认截取到末尾为止
* public String substring(int beginIndex,int endIndex)
* 获取一个新的字符串,从指定位置开始,到指定位置结束(包前不包后)(endIndex-)
vString类的 其他功能
*
* 替换功能
* public String replaceAll(String regex,
* String replacement):替换所有:参数1为:匹配的正则表达式的子字符串
* 参数2:要替换的内容
* 邮箱: 数字或者字母@数字或者字母.com
* public String replace(char oldChar,
* char newChar):将oldChar使用newChar进行替换
*
* public String replace(String target,
* String replacement) :将指定target子串使用指定 replacement子串进行替换
*
*
* 去重两端空格
* public String trim():应用场景:
* 在IO中传输一些字符串数据的时候,防止前部和尾部存在空格字符,导致io异常,将字符串先去除两端空格
* "hello"
* " hello "
*
* 按照字典顺序比较
* public int compareTo(String anotherString)
先读取出字符串的第一个“字母”进行比较,比较的方法是ascii码表的值(字符所对应的十进制值),如果前面的大那么返回1,后面的大返回-1;此位置相同,继续比较下一位,直到最后一位,如果都相同的话,就返回0;
Java中的compareTo()函数用法比较另一个函数字符:public int compareTo(String anotherString)
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象在参数字符串之前,则比较结果为一个负整数。
如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只有在方法 equals(Object) 返回 true 时才返回 0。
这是字典排序的定义。如果这两个字符串不同,则要么它们在某个索引处具有不同的字符,该索引对二者均为有效索引,要么它们的长度不同,或者同时具备上述两种情况。
如果它们在一个或多个索引位置上具有不同的字符,假设 k 是这类索引的最小值;则按照 < 运算符确定的那个字符串在位置 k 上具有较小的值,其字典顺序在其他字符串之前。
这种情况下,compareTo 返回这两个字符串在位置 k 处的两个不同的 char 值,即值:
this.charAt(k)-anotherString.charAt(k)
如果它们没有不同的索引位置,则较短字符串在字典顺序上位于较长字符串的前面。这种情况下,compareTo 返回这两个字符串长度的不同,即值:
this.length()-anotherString.length()
指定者: 接口 Comparable 中的 compareTo
参数: anotherString - 要比较的 String。
返回: 如果参数字符串等于此字符串,则返回 0 值;如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值;如果按字典顺序此字符串大于字符串参数,则返回一个大于 0 的值。