1.单例模式
1)单例类只能有一个实例
2)单例类必须自己创建自己的唯一实例
3)单例类必须给其他所有对象提供这一实例
分为三种:懒汉式单例、饿汉式单例、懒汉式单例(高并发、多线程并发情况下)。
1.饿汉式单例
public class Singleton {
private Singleton(){}
private static Singleton singleton=new Singleton(); //在类初始化时,已经自行实例化
public static Singleton getSingleton(){
return singleton;
}
}
//==================================
Singleton a1=Singleton.getSingleton();
System.out.println(a1);
在类初始化时,已经自行实例化,浪费资源
2.懒汉式单例
public class Singleton {
private Singleton(){}
private static Singleton singleton=null;
public static Singleton getSingleton(){ //在第一次调用的时候实例化自己
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
//==================================
Singleton a1=Singleton.getSingleton();
System.out.println(a1);
//在第一次调用方法的时候实例化自己
3.懒汉模式(高并发、多线程并发情况下,会出现问题)
public class Singleton {
private Singleton(){}
private static Singleton singleton=null;
public static Singleton getSingleton(){
if(singleton==null){
try {
Thread.sleep(1); //时差,间隔1毫秒,实例化了多次
} catch (InterruptedException e) {
e.printStackTrace();
}
singleton=new Singleton();
}
return singleton;
}
}
//========================================
public class Test05 {
public static void main(String[] args) {
ExecutorService executorService=Executors.newCachedThreadPool();
executorService.execute(new Thead1());
executorService.execute(new Thead1());
executorService.execute(new Thead1());
executorService.execute(new Thead1());
executorService.execute(new Thead1());
}
}
//线程定义
class Thead1 extends Thread{
@Override
public void run(){
Singleton s1=Singleton.getSingleton();
System.out.println(s1);
}
}
有指令时差,间隔1毫秒,实例化了多次
2.字符串String类操作方法整理
字符串的基本用法
1)获取字符串的长度 length()
string.length();
2)获取字符串的第i个字符 charAt(i)
string.charAt(i);
3)获取指定位置的字符方法getChars(4个参数)(从字符串中提取部分存储到char数组中)
String s="abcd";
char[] c=new char[80];
s.getChars(0,4,c,0); //0:开始位置;4:结束位置;c:数组ming;0:数组开始位置;
System.out.println(c);
字符串比较
字符串比大小
(1)不忽略字符串大小写情况下字符串的大小比较方法compareTo(another str)
格式:int result = str1.compareTo(str2);
输出三种比较结果:若该字符串的Unicode值<参数字符串的Unicode值,结果返回一负整数;若若该字符串的Unicode值=参数字符串的Unicode值,结果返回0;若该字符串的Unicode值>参数字符串的Unicode值,结果返回一正整数。
(2) 忽略字符串大小写情况下字符串的大小比较方法compareTOIgnoreCase(another str)
格式:int result = str1.compareToIgnoreCase(str2);
在忽略字符串大小写情况下,返回三种比较结果:输出三种比较结果:若该字符串的Unicode值<参数字符串的Unicode值,结果返回一负整数;若若该字符串的Unicode值=参数字符串的Unicode值,结果返回0;若该字符串的Unicode值>参数字符串的Unicode值,结果返回一正整数。
字符串是否相等
然后看一下第二种判别两种字符串是否相等(相等情况下必须保证二者长度相等)需求中的方法:
1)不忽略字符串大小写情况下判别字符串相等的方法eaquals(another str)
格式:boolean result = str1.equals(str2);
当且仅当str1和str2的长度相等,且对应位置字符的Unicode编码完全相等,返回true,否则返回false
2)忽略字符串大小写情况下判别字符串相等的方法equalsIgnoreCase(another str)
格式:boolean result = str1.equals(str2);
字符串与其他数据类型的转换
Boolean b=s1.equalsIgnoreCase(s2);
s2=String.valueOf(b); //bool转换为string
s2=b.toString(); //bool转换为string
字符串查找
1) 查找字符出现位置
返回指定字符在字符串中第一次出现位置的索引
int i=str.indexOf(‘a’);
返回指定字符在字符串中最后一次出现位置的索引
int i=str.lastIndexOf(‘a’);
2) 查找字符串出现位置
返回字符串第一次出现的位置索引
String s1="bcd";
String s2="Abcd";
int i=s2.indexOf(s1);
System.out.println(i);
返回字符串最后一次出现的位置索引
String s1="bcd";
String s2="Abcd";
int i=s2.lastIndexOf(s1);
System.out.println(i);
截取与拆分
(1) 截取方法
1、substring()方法
格式1:String result = str.substring(index); //index之后保留
格式2:String result = str.substring(beginIndex,EndIndex);//实际索引号[beginIndex,EndIndex-1]
结果:截取出范围内的字符串
(2)拆分方法
1、split()方法
格式1 :String strArray[] = str.split(正则表达式);// 拆分的结果保存到字符串数组中
例:String stringArray[] = str.split(" "); //根据空格要求拆分出所有单词保存到字符串数组中
格式2:String strArray[] = str.split(正则表达式,limit);
替换和修改
(1)concat()方法合并字符串
格式:String result = str1.concat(str2); //将str1和str2合并
(2) toLowerCase()方法 将字符全部转化为小写
格式: String result = str.toLowerCase();
(3) toUpperCase()方法 将字符全部转化为大写
格式:String result = str.toUpperCase();
(4)replaceAll()、replaceFirst()方法:需要匹配正则表达式