Java基础10-集合
作业回顾
-
蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉。蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s。
十只蜜蜂和两只熊。-
蜜蜂
bag: 20
每次产1,耗时10ms
满5的时候给蜜罐添加 -
蜜罐
max : 30 -
熊
eat//蜜蜂线程 public class Bee extends Thread{ public static final int BAG=20; private int currentCount = 0; private String name; private Pool pool; public Bee(String name,Pool pool){ this.name = name; this.pool = pool; } public void run(){ while(true){ synchronized(pool){ //如果蜜罐当前量已满 if(pool.currentNo>=Pool.MAX){ //如果蜜蜂自身蜜囊已满,通知熊吃蜂蜜,并进入等待队列 if(currentCount>=Bee.BAG){ try{ pool.notifyAll(); pool.wait(); }catch(Exception e){ } } //如果蜜蜂自身蜜囊未满,通知熊吃蜂蜜,自身蜜囊加1 else{ pool.notifyAll(); currentCount++; } } //如果蜜罐未满 else{ //蜜罐剩余的空间 int count = Pool.MAX-pool.currentNo; //如果蜜蜂自身的量超过蜜罐剩余空间,则将蜜罐加满,自身的量相应减少 if(currentCount>=count){ pool.currentNo = Pool.MAX; currentCount = currentCount -count; pool.notifyAll(); } //如果蜜罐自身的量不够蜜罐剩余空间,则全部加入到蜜罐中,自身的量清零 else{ pool.currentNo += currentCount; currentCount = 0; } } } } } } //熊线程 public class Bear extends Thread{ private String name; private Pool pool; public Bear(String name, Pool pool){ this.name = name; this.pool = pool; } public void run(){ while(true){ synchronized(pool){ if(pool.currentNo==Pool.MAX){ System.out.println(name+"吃了蜂蜜:"+ pool.currentNo); pool.currentNo = 0; pool.notifyAll(); } else{ try{ pool.wait(); } catch(Exception e){ } } } } } } //蜜罐类 public class Pool{ public static final int MAX=30; public int currentNo = 0; } //测试类 public class App{ public static void main(String[] args){ Pool pool = new pool(); Bee bee1 = new Bee("bee-1",pool); Bee bee2 = new Bee("bee-2",pool); Bee bee3 = new Bee("bee-3",pool); Bee bee4 = new Bee("bee-4",pool); Bee bee5 = new Bee("bee-5",pool); Bee bee6 = new Bee("bee-6",pool); Bee bee7 = new Bee("bee-7",pool); Bee bee8 = new Bee("bee-8",pool); Bear bear1 = new Bear("bear-1",pool); bee1.start(); bee2.start(); bee3.start(); bee4.start(); bee5.start(); bee6.start(); bee7.start(); bee8.start(); bear1.start(); } }
-
-
取出两个字符串中最大的公共子串。
public class subStringDemo { public static void main(String[] args) { String str1 = "how中are国you123"; String str2 = "your国are国howu123"; //System.out.println(str1.compareTo(str2)); //String str3 = str1-str2; char c='a'; //System.out.println(str1.lastIndexOf(c)); //System.out.println(str1.substring(0,str1.length())); System.out.println(str1.charAt(0)); System.out.println(getMaxSameStr(str1,str2));//are国 } /** * Find the max same subString of two strings * */ public static String getMaxSameStr(String str1,String str2) { String maxSameStr=""; String temp=""; int len = str1.length(); //从大到小在str1中取子串,和str2匹配 // 缺陷,当有两个同样长度的公共子串时,只能找到前面一个 for(int i=0;i<len;i++) { for (int j=0;j<=i;j++) { temp = str1.substring(j,j+len-i); if(str2.indexOf(temp)!=-1) { maxSameStr=temp; return maxSameStr; } } } return maxSameStr; } }
-
StringBuffer是线程安全的,StringBuilder不是线程安全。单线程访问情况下,性能是否一致?
public class StringBuilderBuffer { public static void main(String[] args) { //测试单线程访问情况下,StringBuilder与 StringBuffer的性能 StringBuilder str1 = new StringBuilder(); StringBuffer str2 = new StringBuffer(); long l1 = System.currentTimeMillis(); for(int i=0;i<1000000;i++) { str1.append(i); } System.out.println(System.currentTimeMillis()-l1);//272 long l2 = System.currentTimeMillis(); for(int j=0;j<1000000;j++) { str2.append(j); } System.out.println(System.currentTimeMillis()-l2);//434, StringBuffer是线程安全的,其方法中有同步这一步骤,因此访问较慢 } }
-
完成8种基本数据类包装类的练习,完成自动拆装箱操作。
import java.io.UnsupportedEncodingException; public class StringDemo { public static void main(String[] args) throws Exception { String str = "한국어"; byte[] b = str.getBytes("euc_kr"); /* int count = 0; for(int i=0;i<=0xffff;i++) { count++; System.out.print((char)i); if(count>=20) { count = 0; System.out.println(); } } */ System.out.println(new String(b,"euc_kr"));//한국어 //字符串倒序输出,不支持中文 String str2 = "abcde123"; byte[] b2 = str2.getBytes("utf-8"); byte[] b3 = new byte[b2.length]; for(int i = 0;i<b2.length;i++) { b3[i] = b2[b2.length-i-1]; } System.out.println(new String(b3,"utf-8"));//321edcba //自动装箱 Integer a = 12; System.out.println(a);//12 //自动拆箱 int i = a; System.out.println(i);//12 } }
-
substring(String str, int beginIndex, int length);
返回一定长度的子串/** * return subString of String based on the given beginIndex and length * */ public static String subString(String str, int beginIndex, int length){ String subStr = null; if(str==null || str.length()==0) { System.out.println("字符串非法"); return null; } if(beginIndex<0 || beginIndex>=str.length()) { System.out.println("开始索引非法"); return null; } if(length<=0 || beginIndex+length>str.length()) { System.out.println("长度非法"); return null; } return str.substring(beginIndex,beginIndex+length); }
-
找到自己名字对应的Unicode码
for(int i=0;i<=0xffff;i++) { if((char)i=='翟') { System.out.println(i); int2hex(i); System.out.println((char)i); } if((char)i=='大') { System.out.println(i); int2hex(i); System.out.println((char)i); } if((char)i=='壮') { System.out.println(i); int2hex(i); System.out.println((char)i); } } public static void int2hex(int l) { char hex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; System.out.print("0x"); for(int i=28;i>=0;i=i-4) { System.out.print(hex[(l>>i)&0x0f]); } System.out.println(); }
StringBuffer
-
字符串缓冲区
-
mutable, 可变的
-
java.lang.AbstractStringBuilder
|--------java.lang.StringBuffer
-
线程安全的
StringBuilder
-
字符串构建器
-
mutable, 可变的
-
java.lang.AbstractStringBuilder
|--------java.lang.StringBuilder
-
线程不安全
集合类
-
List : 列表,接口 ArrayList()
interface java.lang.Iterable /|\ |------interface java.util.Collection /|\ |-----interface java.util.List |---------------class java.util.ArrayList
-
ArrayList读取快,写入慢
list.add(...);
list.get(int index);
list.remove(int index);
list.clear();
-
LinkedList
存储速度快,查询速度慢
链表,手拉手实现的对象引用
-
-
[]数组
length //长度属性
-
String
length() //方法.
- ==判断的是对象的内存地址,不是对象的内容
- equals方法判断是对象的内容是否相同
-
interface Collection
-
size() //方法
-
isEmpty() // ==null ?
-
判断集合有效性
col != null && col.isEmpty() -
contains(Object obj) //判断是否包含指定的对象
-
List //有序,可重复
-
Set //无序,不重复
-
Map //key-value
-
-
instanceof(非精准判断)
运算符,判断变量是否是指定类型的对象。
boolean b = obj instanceof String ;
String 是final类,不可以被继承精准判断须用:
this.getClass()==obj.getClass();
练习
-
创建集合
-
存放String[tom,tomas,tomsLee]
-
存放Integer[100,200,300]
-
存放Student{name,sex,age,标准javabean}[tom,tomas,tomsLee]
List list = new ArrayList(); //存放String list.add("tom"); list.add("tomas"); list.add("tomslee"); //存放Integer list.add(100); list.add(new Integer(200)); list.add(300); //存放Student list.add(new Student("s-1",10,'f')); Student s = new Student("s-2",11,'m'); list.add(s); list.add(new Student("s-3",12,'m')); Object obj = null; //利用索引遍历列表 for(int i=0;i<list.size();i++) { obj = list.get(i); if(obj instanceof String) { System.out.println((String)obj); } else if(obj instanceof Integer) { System.out.println(100+(Integer)obj); } else { Student s2 = (Student)obj; System.out.println("name:"+s2.getName()+" age:"+s2.getAge()+" sex:"+s2.getSex()); } } System.out.println("------------------"); //利用迭代器遍历列表 Iterator it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); }
-
-
Student :
判断学生类对象内容是否相同,重写equals方法。需要三个条件同时满足name + age + sex都相同才相同。public boolean equals(Object obj) { if(obj==null) { return false; } if(obj==this) { return true; } if(obj.getClass() == Student.class ) { Student s = (Student)obj; boolean nameEqu = false; boolean ageEqu = false; boolean sexEqu = false; if(s.getName()==null) { if(this.getName()==null) { nameEqu = true; } else { nameEqu = false; } } else { nameEqu = s.getName().equals(this.name); } /*if(this.age==s.getAge()) { ageEqu = true; }*/ ageEqu = (this.age==s.getAge()); /*if(this.sex == s.getSex()) { sexEqu = true; }*/ sexEqu = (this.sex == s.getSex()); return nameEqu && ageEqu && sexEqu; } return false; }
-
练习Vector向量类。
//与AarryList的不同点在于,Vector是线程安全的 Vector vector = new Vector(); Student s1 = new Student("s1",10); //向集合中添加元素 vector.add(s1); vector.add(new Student("s2",20)); //重复添加元素 //添加的是重复的地址,匿名对象添加的是新地址(就算重写了equals方法,也是新地址) vector.add(s1); vector.add(new Student("s1",10)); vector.add(new Student("s2",20)); System.out.println("重复添加元素,重写equals方法"); Iterator it = vector.iterator(); while(it.hasNext()) { System.out.println(it.next()); } Student2 s2 = new Student2("s3",10); vector.add(s2); vector.add(s2); vector.add(new Student2("s3",10)); System.out.println("重复添加元素,没有重写equals方法"); it = vector.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //在指定位置插入元素,后续元素往后串 vector.add(0, new Student("s3",30)); //索引越界异常 //vector.add(10,new Student("s4",30)); System.out.println("在指定位置插入元素"); it = vector.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //删除元素,后续元素往前串 System.out.println("按索引删除元素"); vector.remove(0); it = vector.iterator(); while(it.hasNext()) { System.out.println(it.next()); }
作业:
-
remove(int index); //删除指定位置的元素
-
remove(Object o); //删除指定对象,考虑删除对象的规则是什么?
-
removeAll(Collection col);//删除指定集合中的所有元素。
-
contains(Object o); //是否包含
-
contains(Collection col); //是否包含集合。