String翻转:
- 将字符串中指定部分进行翻转,比如将”abcdef”反转为”aedcbf”
- 编写方法 public static String reverse(String str,int statr,int end) 搞定
“`
public static String reverse(String str,int statr,int end){<pre><code>//对输入的参数做一个验证 写出正确的情况,然后取反即可
if(!(str != null && start >= 0 && end > start && end < str.length()) ){
throw new RuntimeException("参数不正确")
}//1、先把数组转成char[]
char[] chars = str.toCharArray();
char temp = ''; //交换辅助变量
for(int i = start,j = end;i < j;i++,j–){
temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
//使用chars重新构建一个String
return new String(chars);
</code></pre>}
“`
注册处理题:
输入用户名,密码,邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象
要求:
- 用户名长度为2或3或4
- 密码的长度为6,要求全是数字, isDigital
- 邮箱中包含@和. 并且@在.的前面
思路分析:
- 编写方法userRegister(String name,String pwd,String email){}
- 针对 输入的内容进行校验,如果发现有问题,就抛出异常,给提示
- 单独的写一个方法,判断 密码是否全部都是数字字符boolean
代码实现:
userRegister(String name,String pwd,String email){
int userLength = name.length();
if(!(userLength >=2 && userLength <=4)){
throw new RuntimeException("用户名长度为2或3或4")
}
if(! (pwd.length() == 6 && isDigital(pwd)) ){
throw new RuntimeException("密码长度为6,要求全是数字")
}
//indexOf 获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
int i = email.indexOf("@");
int j = email.indexOf(".")
if (!(i > 0 && j > i)) {
throw new RuntimeException("邮箱中包含@和. 并且@在.的前面")
}
}
public static boolean isDigital(String str){
char[] chars = str.toCharArray();
for(int i = 0;i < chars.length;i++){
if(chars[i] < '0' || chars[i] > '9'){
return false;
}
}
return true;
}
public static void main(String[] args) {
String name = "jack";
String pwd = "123465";
String email = "jack@sohu.com";
try{
userRegister(name,pwd,email);
System.out.print("恭喜你注册成功");
}catch(Exception e){
System.out.print(e.getMessage);
}
}
集合 VS 数组:
数组:
- 长度开始时必须指定,而且一旦指定,不能更改
- 保存的必须为同一类型的元素
- 使用数组进行增加/删除元素的代码比较麻烦
集合:
- 可以动态保存任意多个对象,使用比较方便
- 提供了一系列方便的操作对象的方法:add、remove、set、get等
- 使用集合添加、删除新元素的代码简洁了
集合:
- 集合主要是两组(单列集合,双列集合)
- Collection接口有两个重要的子接口:List,Set,它们的实现子类都是单列集合
- Map接口的实现子类是双列集合,存放的K-V
集合框架体系图:
暂时无法在{app_display_name}文档外展示此内容
- ##### Collection接口 特点 方法
Collection接口的子接口:List实现类:ArrayList、LinkedList、Vector
Collection接口的子接口:Set实现类:HashSet、LinkedHashSet
- ##### Map接口 特点方法 遍历方法
Map接口的实现类:HashMap\Hashtable等
Collections工具类的使用
代码演示:
ArrayList arrayList = new ArrayList();
arrayList.add("jack");
arrayList.add("tom");
HashMap hashMap = new HashMap;
hashMap.put("NO1","北京");
hashMap.put("NO2","上海");
Collection接口和常用方法:
public interface Collection
- collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
方法:
- add:添加单个元素
- remove:删除指定元素
- contains:查找元素是否存在
- size:获取元素个数
- isEmpty:判断是否为空
- clear:清空
- addAll:添加多个元素
- containsAll:查找多个元素是否都存在
- removeAll:删除多个元素
- 说明:以ArrayList实现类来演示
public static void main(String[] args) {
List list = new ArrayList();
//add:添加单个元素
list.add("jack");
list.add(10); //list.add(new Integer(10))
list.add(true);
//remove:删除指定元素
list.remove(0); //删除第一个元素
list.remove("jack"); //指定删除某个元素
//contains:查找元素是否存在
list.contains("jack"); //返回true,若不存在,返回false
//size:获取元素个数
list.size(); //返回3
//isEmpty:判断是否为空
list.isEmpty(); //F
//clear:清空
list.clear(); //清空所有元素
//addAll:添加多个元素
ArrayList list2 = new ArrayList();
list2.add("红楼梦");
list2.add("三国演义")
list.addAll(list2);
//containsAll:查找多个元素是否都存在
list.containsAll(list2); //true
//removeAll:删除多个元素
list.removeAll(list2);
}
Collection接口遍历元素的方式1:使用Iterator(迭代器)
基本介绍:
基本介绍:
接口 Iterator<E>
所有已知子接口:
ListIterator<E>,XMLEventReader
所有已知实现类:
BeanContextSupport.BCSIterator,EventReaderDelegate,Scanner
1、Interator对象成为迭代器,主要用于遍历Collection集合中的元素
2、所有实现了Collection接口的集合类都有一个iterator()方法,
用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器
3、Iterator的结构
hasNext(),1、指针下移 2、下移以后集合位置上的元素返回
如果没有下一个元素了,就返回false
调用
4、Iterator仅用于遍历集合,Iterator本身并不存放对象
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三国演义","罗贯中",10.1));
col.add(new Book("小李飞刀","古龙",5.1));
col.add(new Book("红楼梦","曹雪芹",34.6));
//遍历col集合
//1、先得到col对应的迭代器
Iterator iterator = col.iterator();
//2、使用while循环遍历
while(iterator.hasNext()){ //判断是否还有数据
//返回下一个元素,类型的Object
Object obj = iterator.next();
System.out.print("obj=" + obj);
}
//3、当退出while循环后,这是iterator迭代器指向最后的元素
//4、如果希望再次遍历,需要重置迭代器
iterator = col.iterator(); //重置迭代器
}
Collection接口遍历对象方式2-for循环增强
- 增强for循环,可以代替iterator迭代器,
- 特点:增强for循环就是简化版的iterator,本质一样,只能用于遍历集合或数组
- 增强for底层还是迭代器,可以理解成简化版本的迭代器
基本语法:
for(元素类型 元素名 : 集合名或数组名){
访问元素
}
for (Object book : col) {
System.out.print("book=" + book);
}
//增强for也可以直接在数组使用
int[] nums = {1,8,10,90};
for (int i : nums) {
System.out.print("i=" +i);
}
List接口和常用方法:
List接口基本介绍:
List接口是Collection接口的子接口
- List集合类中元素有序(即添加顺序和去除顺序一致)、且可重复
- List集合中的每个元素都有其应对的顺序索引,即支持索引
- List容器中的元素都对应一个整数型的序号加载其在容器中的位置,可以根据序号存取容器中的元素
- JDK API中List接口库的实现类有:
接口List<E> 所有超级接口: Collection<E>,Interable<E> 所有已知实现类: AbstractList,AbstaractSequentialList,ArrayList,AttributeList, CopyOnWriteArrayList,LinkedList,RoleList,RoleUnresolvedList,Stcak,Vector 常用的有:ArrayList,LinkedList,Vector
List接口的常用方法:
List集合里添加了一些根据索引来操作集合元素的方法
- void add(int index,Object ele):在index位置插入ele元素
- boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
- Object get(int index):获取指定index位置的元素
- int indexOf(Object obj):返回obj在当前集合中首次出现的位置
- int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
- Object remove(int index):移除指定index位置的元素,并返回此元素
- Object set(int index,Object ele):设置指定index位置的元素为ele,相当于是替换
- List subList(int formIndex,int tolndex):返回从formIndex到toIndex位置的子集合
List的三种遍历方式[ArrayList,LinkedList,Vector]
1、方式一:使用iterator
Iterator iter = col.iterator();
while (iter.hasNext()) {
Object o = iter.next();
}
2、方式二:使用增强for
for(Object o:col){
}
3、方式三:使用普通for
for (int i=0;i<list_size();i++ ) {
Object object = list.get(i);
System.out.print(object);
}
说明:使用LinkedList完成 使用方式和ArrayList一样
ArrayList的注意事项
- permits all elements,includeing null,ArrayList 可以加入null,并且多个
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)
多线程情况下,不建议使用ArrayList
ArrayList扩容机制:
1、ArrayList中维护了一个Object类型的数组elementData
transient Object[] elementData; //transient表示瞬间,短暂的;表示该属性不会被序列化
2、当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,
第一次添加,则扩容elementData为10,如需再次扩容,则扩容elementData为1.5倍
3、如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,
则直接扩容elementData为1.5倍
Vector:
- Vector类的定义说明:
public class Vector<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable
- Vector底层也是一个对象数组,protected Object[] elementData;
-
Vector是线程同步,即线程安全,Vector类的操作方法带有Synchronized
public synchronized E get(int index){ if(index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); return elementData(index); }
- 在开发中,需要线程同步安全时,需考虑使用Vector
Vector VS ArrayList:
ArrayList:
底层结构:可变数组
版本:jdk1.2
线程安全(同步)效率:不安全,效率高
扩容倍数:如果是有参构造1.5倍
如果是无参
1、第一次10
2、从第二次开始按1.5扩
Vector:
底层结构:可变数组
版本:jdk1.0
线程安全(同步)效率:安全,效率不高
扩容倍数:如果是无参,默认10,满后,就按2倍扩容
如果指定大小,则每次直接按2倍扩
LinkedList:
- LinkedList实现了双向列表和双端队列特点
- 可以添加任意元素(元素可以重复),包括null
- 线程不安全,没有实现同步
LinkedList的底层操作机制:
- LinkedList底层维护了一个双向链表
- LinkedList中维护了两个属性first和last分别指向 首节点和尾节点
- 每个节点(Node对象),里面又维护了prev,next,item三个属性,其中prev指向前一个,通过next指向后一个节点,最终实现双向链表
- 所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高
ArrayList VS LinkedList:
ArrayList:
底层结构:可变数组
增删的效率:较低,数组扩容
改查的效率:较高
LinkedList:
底层结构:双向链表
增删的效率:较高,通过链表追加
改查的效率:较低
如何选择ArrayList 和 LinkedList:
- 如果改查操作多:ArrayList
- 如果增删操作多:LinkedList
- 一般来说,在程序中,80%~90%都是查询,因此大部分情况下会选择ArrayList
- 在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另外一个模块是LinkedList