Java一些问题总结
##1. 包装类的享元模式
顾名思义:共享元对象。如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象。
测试:
String num="abs";
String num1="acd";
String num2=new String(" 67 89 we asffds ert ");
//打印 logger debug
System.out.println(Integer.toHexString(num.hashCode()));
System.out.println(Integer.toHexString(num1.indexOf('a')));
System.out.println(Integer.toHexString(num2.charAt(3)));
结果:
17872
0
20
享元模式是为数不多的、只为提升系统性能而生的设计模式。它的主要作用就是复用对象,以节省内存空间和对象创建时间。
##2. 什么是Java对象序列化
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制,该API简单易用。
##3. String类的常用方法
###⑴ length()字符串的长度
String num="6789";
System.out.println(num.length());
输出结果为:4
###⑵ charAt()截取一个字符
String num1="abcd";
System.put.println(num1.charAt(2)); //括号中为索引号
结果为:c
###⑶ toCharArray()转换为字符数组
String num1="afsg";
System.out.println(num1.toCharArray());
结果为:afsg
###⑷ equals()和equalsIgnoreCase()比较两个字符串
String a="Hello";
String b="Hello";
String c="World";
String d="HELLO";
System.out.println(a.equals(b));
System.out.println(a.equals(d));
System.out.println(a.equals(c)); //比较字符串及其长度,并且区分大小写
//比较字符串及其长度,并且不区分大小写
System.out.println(a.equalsIgnoreCase(d));
结果为:true false false true
###⑸ startsWith()方法决定是否以特定字符串开始
System.out.println(a.startsWith("He"));或者System.out.println(a.startsWith(b));
结果是:true
###⑹ endWith()方法决定是否以特定字符串结束
System.out.println(a.endsWith("d"));
结果是:false
###⑺ compareTo()和compareToIgnoreCase() 比较字符串
String s1 = "adger";
String s2 = "adgerfa";
String s3 = "ADGER";
String s4 = "adher";
System.out.println(s1.compareTo(s2));//-2
System.out.println(s1.compareTo(s3));//32
System.out.println(s1.compareToIgnoreCase(s3));//0
System.out.println(s3.compareToIgnoreCase(s4));//-1
compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序)
1、如果字符串相等返回值0
2、如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值代表:前字符串的值小于后字符串,正值代表:前字符串大于后字符串)
3、如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度.
compareToIgnoreCase()方法是不区分大小写,返回值是int,比较方式与compareTo()相同
package lulu1;
import java.util.Arrays;
import java.util.Scanner;
/**
* 比较输入字符串的大小:不分大小写,按照字符串的大小排序
* @author chenglulu
*
*/
public class Compare {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要比较的字符串:");
String input=sc.nextLine();
String[] s = input.trim().split(" "); //trim()是把开头和结尾的空格去掉
for(int i=0;i<s.length-1;i++){
for(int j=0;j<s.length-1-i;j++){
if(s[j].compareToIgnoreCase(s[j+1])>0){
String temp = s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(s));
}
}
//测试
//输入: fas rew ada ADE FAA re bci def BCr aC Bc
//输出:aC ada ADE Bc bci BCr def FAA fas re rew
###⑻ indexOf() 查找字符或者子串第一次出现的地方。
package lulu1;
import java.util.Scanner;
/**
* 查找字符或字符串第一次出现的地方
* @author chenglu
*
*/
public class Date {
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String input =sc.nextLine();
System.out.println(input.indexOf("sed")); //不存在的话,返回-1
System.out.println(input.indexOf('a')); //存在的话,返回相应的索引值
}
}
###⑼ lastIndexOf() 查找字符或者子串是后一次出现的地方。
import java.util.Scanner;
/**
* 查找字符或字符串最后一次出现的地方
* @author chenglu
*
*/
public class Date {
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String input =sc.nextLine();
System.out.println(input.lastIndexOf('s')); //不存在的话,返回-1
System.out.println(input.indexOf('a')); //存在的话,返回相应的索引值
}
}
###⑽ substring()截取字符串
System.out.println(input.substring(2, 6)); //返回索引为2到5的值
结果为:请输入一个字符串:qwerasdf
eras
###⑾ replace() 替换
String a="wertqwertq";
System.out.println(a.replace("tq", "asdf"));//全部替换
System.out.println(a.replaceFirst("w", "mnbv")); //只替换第一个w
System.out.println(a.replaceAll("w", "123456"));//全部替换
结果为:
###⑿ concat() 连接两个字符串
String s="123456";
String s1="78987";
System.out.println(s.concat(s1));
结果为:12345678987
###⒀ trim() 去掉起始和结尾的空格
String d=" as df gh we qw sd df as ";
System.out.println(d.trim());//把开始和结尾的空格去掉
结果为:as df gh we qw sd df as
###⒁ toLowerCase()/ toUpperCase() 大小写
String b="asdfghjk";
String c="ASDFGHJ";
System.out.println(b.toUpperCase());
System.out.println(c.toLowerCase());
System.out.println(s.toLowerCase());
结果为:
ASDFGHJK
asdfghj
123456
###⒂ split(String str)//将str作为分隔符进行字符串分解
String d="as df gh we qw sd df as ";
String[] ss = d.split(" ");
System.out.println(d.split(" ")); //输出地址
System.out.println(ss); //输出地址
System.out.println(Arrays.toString(ss)); //输出数组
结果为: [Ljava.lang.String;@39e5b5
[Ljava.lang.String;@117f31e
[as, df, gh, we, , qw, sd, df, as]