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 ; } }