StringBuffer:
1)StringBuffer:线程安全的可变字符序列
线程的安全问题,是难点(多线程属于难点) 多线程------>解决了多线程安全问题------>是死锁 :生产消费模式(Java中等待唤醒机制)
线程安全 --->同步的---->执行效率低
举例:
银行的网站,医疗平台...
线程不安全---->不同步---->执行效率高
举例:
新闻网站,XXX论坛...
String和StringBuffer的区别:
1.String是不可变的字符序列,StringBuffer是可变的字符序列
2.从内存角度看:String定义时,会在常量池开辟空间,耗费内存
StringBuffer字符串缓冲区(里面存储的全是字符串),他会释放掉
StringBuffer的构造方法:
StringBuffer():无参构造的形式,初始容量为16
StringBuffer(int capacity):指定容量构造一个字符串缓冲区
StringBuffer(String str):构造一个字符串缓冲区,将指定的字符串内容作为其初始化内容
StringBuffer的获取功能:
public int length():返回长度
public int capacity():返回容量(如果超过容量,系统会自动分配(存储字符串的时候,英文的))
package org.westos.StringBuffer1;
public class StringBufferDemo1 {
public static void main(String[] args) {
//创建字符串缓冲区
StringBuffer sb1=new StringBuffer();//无参构造
System.out.println(sb1.length());
System.out.println(sb1.capacity());
System.out.println("----------");
StringBuffer sb2=new StringBuffer("asdfqwer");
System.out.println(sb2.length());
System.out.println(sb2.capacity());
System.out.println("----------");
StringBuffer sb3=new StringBuffer(5);
sb3.append("asdfzxcv");
System.out.println(sb3.length());
System.out.println(sb3.capacity());
}
}
2)StringBuffer的添加功能
public StringBuffer append(String/int/boolean....):在字符串缓冲区末尾追加数据,并返回字符串缓冲区本身
public StringBuffer insert(int offest,String str):在指定位置处添加字符串,并返回字符串缓冲区本身
package org.westos.StringBuffer1;
public class StringBufferDemo2 {
public static void main(String[] args) {
StringBuffer str1=new StringBuffer();
str1.append("asdf");
str1.append('q').append(123).append(true).append(12.34);
System.out.println(str1);//asdfq123true12.34
System.out.println("-----------");
StringBuffer str2=new StringBuffer("hello");
str2.insert(2,"java");
str2.insert(2,"football").insert(2, 12);
System.out.println(str2);//he12footballjavallo
}
}
3)StringBuffer的删除功能:
public StringBuffer deleteCharAt(in index):移除指定位置处的字符
public StringBuffer delete(int start,int end): 移除从start处到end-1处的字符串
package org.westos.StringBuffer1;
public class StringBufferDemo2 {
public static void main(String[] args) {
StringBuffer str1=new StringBuffer();
str1.append("asdf");
str1.append('q').append(123).append(true).append(12.34);
System.out.println(str1);//asdfq123true12.34
System.out.println("-----------");
StringBuffer str2=new StringBuffer("hello");
str2.insert(2,"java");
str2.insert(2,"football").insert(2, 12);
System.out.println(str2);//he12footballjavallo
System.out.println("-----------");
System.out.println("str2:"+str2.deleteCharAt(0));//str2:e12footballjavallo
System.out.println("str2:"+str2.delete(0, 7));//str2:balljavallo
}
}
4)StringBuffer的反转功能:
public StringBuffer reverse():将字符串缓冲区中的字符串序列反转,返回它本身
package org.westos.StringBuffer1;
public class StringBufferDemo3 {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("asdfqwerzxcv");
System.out.println(sb.reverse());//vcxzrewqfdsa
}
}
5)StringBuffer的截取功能:
public String subString(int index):从指定位置开始截取到末尾,返回一个新的字符串
public String subString(int start,int end):从start处开始截取到end-1处结束,返回一个新的字符串
StringBuffer的替换功能:
public StringBuffer replace(int start,int end,String str):在该字符串缓冲区中把从start处到end-1处的字符串用str替换, 返回它本身
package org.westos.StringBuffer1;
public class StringBufferDemo3 {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("asdfqwerzxcv");
System.out.println("sb:"+sb.replace(0, 4, "uiop"));//sb:uiopqwerzxcv
String str=sb.substring(4);
String str1=sb.substring(4, 8);
System.out.println("str:"+str+",str1:"+str1);//str:qwerzxcv,str1:qwer
}
}
6)jdk5以后的特性:自动拆装箱
int---Interger(是int类型的包装类类型) 需要将int--->String
Interger--int:自动拆箱
char---Character: 需要char--String
为什么要类和类之间转换
要将A类类型转换成B类型,为了使用B类的功能
有时候,有需要将B类转换成A类,可能需求需要的是A类型
String和StringBuffer之间的相互转换:
stringBuffer中的功能: public String toString():将字符串缓冲区中的字符串取出,返回给一个新的字符串
package org.westos.StringBuffer1;
public class StringBuffer4 {
public static void main(String[] args) {
//将字符串转换为字符串缓冲区
String str="qwer";
//通过带参构造的方式将字符串转换为StringBuffer
StringBuffer sb=new StringBuffer(str);
System.out.println("sb:"+sb);
//调用append方法转换
StringBuffer sb2=new StringBuffer();
sb2.append(str);
System.out.println("sb2:"+sb2);
System.out.println("------------");
//将字符串缓冲区转换为字符串
StringBuffer sb3=new StringBuffer("java");
//通过带参构造转换
String str1=new String(sb3);
System.out.println("str1:"+str1);
//通过Stringbuffer中的public String toString()方法转换
String str2=sb3.toString();
System.out.println("str2:"+str2);
}
}
7)
1.String,StringBuffer,StringBuilder的区别?
StringBuffer与StringBuilder都是可变的字符序列,提供一个缓冲区(两者都可看做一个容器)
StringBuffer:线程安全的,同步的,执行效率低
StringBuilder:子安成不安全的,不同步的,执行效率高,并在单线程中优先使用StringBuilder
StringBuffer执行效率虽然低,但为String类型与可变的字符串序列提供了缓冲区
2 StringBuffer和数组的区别?
数组:是可以存储多个数据的容器,并且每个数据的类型必须一致
数组长度:length属性
StringBuffer:也是容器,在字符串缓冲区存储的数据类型必须是数据类型
长度:length()属性基本类的包装类类型:
基本类型对应都有一个保证类型,目的就为了将基本数据类型可以String类型之间进行互相转换
byte Byte
short Short
int Integer (讲)
long Long
float Float
double Double
char character (讲)
boolean Boolean
Integer:
1)
Integer类是int类型的包装类类型
需要将100十进制(整数默认十进制)转化为二进制,八进制,十六进制
Integer的静态功能:
public static String toBinaryString(int i)
public static String toOctalString(int i)
public static String toHexString(int i)
获取Integer的最值:
public static final int MAX_VALUE: 值为 231-1 的常量,它表示 int
类型能够表示的最大值。
public static final int MIN_VALUE: 值为 -231的常量,它表示 int
类型能够表示的最小值。
package org.westos.Integer;
public class IntegerDemo1 {
public static void main(String[] args) {
int x=1000;
String str1=Integer.toBinaryString(x);
System.out.println(str1);//1111101000
System.out.println(Integer.toOctalString(x));//1750
System.out.println(Integer.toHexString(x));//3e8
System.out.println("----------");
System.out.println(Integer.MIN_VALUE);//-2147483648
System.out.println(Integer.MAX_VALUE);//2147483647
}
}
2)
Integer的构造方法:
public Integer(int value)
public Integer(String str)该String类型的值必须是数字字符串
package org.westos.Integer;
public class IntegerDemo2 {
public static void main(String[] args) {
Integer i1=new Integer(11);
Integer i3=12;//实际执行的是Integer.valueOf(int i)方法
Integer i4=Integer.valueOf(12);
Integer i2=new Integer("123");//该String类型的值必须是数字字符串
System.out.println(i2+"---"+i1);
System.out.println(i3+"---"+i4);
}
}
3)
int类型与String类型的转换
Integer的功能:
public static String toString(int i)
public static int parseInt(Sting str)
package org.westos.Integer;
public class IntegerDemo3 {
public static void main(String[] args) {
//int转换为String类型
//字符串拼接
String str1="";
str1+=12;
System.out.println(str1);
//int--Integer--String
int x=12;
Integer i=Integer.valueOf(x);
String str2=i.toString();
System.out.println("str2:"+str2);
//toString(int i)方法
String str3=Integer.toString(x);
System.out.println("str3:"+str3);
//String转换为int类型
//String--Integer--int
Integer i2=new Integer("12345");
int x2=i2.intValue();
System.out.println("x2:"+x2);
//parseInt(String str)方法
int x3=Integer.parseInt("12345");
System.out.println("x3:"+x3);
}
}
4)JDK5以后提供了自动拆装箱
可以将int-->装箱 Integer
也可以将Integer-->拆箱 int
JDK5 还提供了哪些特性:
泛型,可变参数,增强for循环(在集合中)等等..
JDK8特性:
Stream流 --> 表达式
package org.westos.Integer;
public class IntegerDemo4 {
public static void main(String[] args) {
//装箱
Integer i1=12;
int i2=13;
i2+=i1;//先将i1拆箱-->int,在执行i1+i2
System.out.println("i2:"+i2);
i1+=i2;//先将i1拆箱-->int,在执行i1+i2,-->在装箱Integer
System.out.println("i1:"+i1);
System.out.println("---------");
/*反编译之后的代码块
* Integer i1 = Integer.valueOf(12);
int i2 = 13;
i2 += i1.intValue();
System.out.println((new StringBuilder("i2:")).append(i2).toString());
i1 = Integer.valueOf(i1.intValue() + i2);
System.out.println((new StringBuilder("i1:")).append(i1).toString());*/
}
}
Character
1)Character类:
Character类在对象中包装了基本类型char的值,Character类型的对象包含char类型的单个字节
已确定字符的大小写,数字类型
构造方法:public Character(char value)
package org.westos.Character;
public class CharacterDemo1 {
public static void main(String[] args) {
Character ch=new Character('a');
Character ch2=new Character((char)65);
Character ch3=new Character('5');
System.out.println("ch:"+ch+"--"+"ch2:"+ch2+"---"+"ch3:"+ch3);
}
}
Character类的判断功能:
public static boolean isDigit(char ch)指定字符是否为数字
public static boolean isUpperCase(char ch)是否为大写字母
public static boolean isLowerCase(char ch)是否为小写字母
转换功能:
public static int toUpperCase(int value)
public static int toLowerCase(int value)
package org.westos.Character;
public class CharacterDemo1 {
public static void main(String[] args) {
//创建Character类对象
Character ch = new Character('a');
Character ch2 = new Character((char) 65);
Character ch3 = new Character('5');
System.out.println("ch:" + ch + "--" + "ch2:" + ch2 + "---" + "ch3:" + ch3);
//判断该字符是否为数字
System.out.println(Character.isDigit(ch));
System.out.println(Character.isUpperCase(ch2));
System.out.println(Character.isLowerCase(ch3));
//判断是否为小写字母
System.out.println(Character.isDigit(ch));
System.out.println(Character.isUpperCase(ch2));
System.out.println(Character.isLowerCase(ch3));
//判断是否为大写字母
System.out.println(Character.isDigit(ch));
System.out.println(Character.isUpperCase(ch2));
System.out.println(Character.isLowerCase(ch3));
System.out.println("-------");
//将大写字母转换为小写
char ch4=Character.toLowerCase('A');
System.out.println(ch4);
//小写转换为大写
char ch5=Character.toUpperCase('b');
System.out.println(ch5);
System.out.println(Character.toLowerCase(67));//99
}
}
2)需求:键盘录入一个字符串,统计当前字符串中大写字母字符,小写字母字符,数字字符的个数(不考虑其他字符)
package org.westos.Character;
import java.util.Scanner;
public class CharacterDemo2 {
public static void main(String[] args) {
while (true) {
int numcount = 0;
int smallcount = 0;
int bigcount = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.nextLine();
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i)))
numcount++;
else if (Character.isUpperCase(str.charAt(i)))
bigcount++;
else if (Character.isLowerCase(str.charAt(i)))
smallcount++;
}
System.out.println("该字符串中大写字母有" + bigcount + "个");
System.out.println("小写字母有" + smallcount + "个");
System.out.println("数字字符有" + numcount + "个");
}
}
}
冒泡排序的两种方法
1)两两比较,大的往后放,第一次比较完毕最大值出现在最大索引处....
package org.westos.Array;
public class AyyayDemo {
public static void main(String[] args) {
//创建数组
int []arr=new int[] {12,43,23,87,49,30,16} ;
printArray(arr);
paixu(arr);
printArray(arr);
}
//排序功能
public static void paixu(int []arr) {
for(int x=0;x<arr.length-1;x++)
for(int y=0;y<arr.length-1-x;y++) {
if(arr[y]>arr[y+1]) {
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
//遍历功能
public static void printArray(int []arr) {
System.out.print("[");
for(int i=0;i<arr.length;i++) {
if(i==arr.length-1)
System.out.println(arr[i]+"]");
else System.out.print(arr[i]+",");
}
}
}
2)选择排序: 用0索引对应的元素依次后面索引对应的元素进行比较, 1索引..... 小的数据往前方法,就可以得到一个排好序的数组...
package org.westos.Array;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayDemo2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串");
String str=sc.nextLine();
byte []by=str.getBytes();//把该字符串转换为数组
printArray(by);
paixu2(by);
printArray(by);
String str2=Arrays.toString(by);//把该数组转换为字符串形式的数组
System.out.println(str2);
String str3=new String(by);//把该数组转换为字符串
System.out.println(str3);
}
//遍历功能
public static void printArray(byte[]bytes) {
System.out.print("[");
for(int i=0;i<bytes.length;i++) {
if(i==bytes.length-1)
System.out.println(bytes[i]+"]");
else
System.out.print(bytes[i]+",");
}
}
//排序功能
public static void paixu2(byte[]by) {
for(int x=0;x<by.length-1;x++)
for(int y=x+1;y<by.length;y++)
if(by[x]>by[y]) {
byte temp=by[x];
by[x]=by[y];
by[y]=temp;
}
}
}
在数组中使用二分法查找索引
数组中的元素查找法(基本查找法)
***注意:该数组必须是有序的
折半查找(二分查找) :数组一定是有序
分析:
A:定义最小索引和最大索引
B:计算中间索引
C:中间索引对应的元素和需要查找的元素比较
相等,直接返回中间索引
不相等:
大了,左边找
max = mid -1 ;
小了,右边找
min = mid + 1 ;
E:重新计算中间索引 ,回到B继续查找
public class ArrayDemo3 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {11,22,33,44,55,66,77} ;
//写一个方法来调用
int index = search(arr, 33) ;
System.out.println("index:"+index);
int index2 = search(arr, 333) ;
System.out.println("index2:"+index2);
}
/**
* 两个明确:
* 明确返回值类型:int
* 明确参数类型:2个参数 int[] arr ,int value
*/
public static int search(int[] arr,int value) {
//1定义数组中的最小索引和最大索引
int min = 0 ;
int max = arr.length -1 ;
//2 计算出中间索引
int mid = (max+min)/2 ;
//3)拿中间索引对应的元素和需要查找的元素进行比较
//如果相等,返回
while(arr[mid]!=value) {
//不相等
if(arr[mid] >value) {
max = mid -1 ;
}else {
min = mid + 1 ;
}
//如果这value在数组中找不到,找不到返回-1
if(min>max) {
return -1 ;
}
//重新计算出中间索引
mid = (max+min)/2 ;
}
return mid ;
}
}