List、Set、Map的概念:
List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合; List中存储的数据是有顺序,并且允许重复; Map中存储的数据是无序的,其键是不能重复的,但是值是可以重复的; Set中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的hashCode决定, 位置是固定的(Set 根据hashcode来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的);
实现类:
List接口有三个实现类
LinkedList:基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。
链表增删快,查找慢;
ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于插入删除;
Vector:基于数组实现,线程安全的,效率低
相关代码:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list);
System.out.println(list.get(1));
System.out.println("List集合的遍历");
// for (int i= 0;i<list.size();i++){
// String s=list.get(i);
// System.out.println(s);
// }
for (String s : list) {
System.out.println(s);
}
Map接口有三个实现类
HashMap:基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键; HashTable:线程安全,低效,不支持 null 值和 null 键; LinkedHashMap: HashMap 的一个子类,保存了记录的插入顺序; SortMap 接口: TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序;
相关代码:
Map<String,Object> map = new HashMap<>();
map.put("name","奈申博");
map.put("age","20");
map.put("phone","1523653936");
map.put("address","河南省");
System.out.println(map);
System.out.println("map的集合遍历");
Set<String> keySet = map.keySet();//获取map中所有key的值的set集合
Iterator<String> ite = keySet.iterator();
while(ite.hasNext()){
String key = ite.next();
Object value = map.get(key);
System.out.println(key+"---->"+value);
}
Set接口有两个实现类
HashSet:底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hashCode()方法; LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap;
相关代码:
Set<String> set = new HashSet<>();
set.add("q");
set.add("w");
set.add("e");
set.add("r");
System.out.println(set);
System.out.println("Set的集合遍历");
Iterator<String> iterator= set.iterator();
while (iterator.hasNext()){
String s = iterator.next();
System.out.println(s);
}
区别:
List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素; Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复; Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 TreeSet 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator<Type>接口来自定义排序方式
String类
一、概念:
String表示字符串类型,属于 引用数据类型
,不属于基本数据类型。
在java中随便使用 双引号括起来
的都是String对象。
ava中规定,双引号括起来的字符串,是 不可变
的,也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也不能变成"ab
字符串的不变性
1.字符串是常量,他们的值在创建之后不能更改,String类定义一个字符数组常量,一旦赋值不能更改字符的值
2.String类定义了常量字符数组,一旦赋值,这个字符数组的值不能被改变
3.经常需要变化的字符串建议使用StringBuffer定义
案例:
public class StringTest02 {
public static void main(String[] args) {
String s1 = "hello";
// "hello"是存储在方法区的字符串常量池当中
// 所以这个"hello"不会新建。(因为这个对象已经存在了!)
String s2 = "hello";
// == 双等号比较的是变量中保存的内存地址
System.out.println(s1 == s2); // true
String x = new String("xyz");
String y = new String("xyz");
// == 双等号比较的是变量中保存的内存地址
System.out.println(x == y); //false
}
}
字符串对象之间的比较不能使用“== ”,"=="不保险。应该调用String类的equals方法。
二、构造方法:
构造方法名 | eg |
String s = “xxx” | 最常用 |
String(String original) | String(“xxx”) |
String(char数组,起始下标,长度) | |
String(byte数组) | |
String(byte数组,起始下标,长度) | |
String(StringBuffer buffer) | |
String(StringBuilder builder) | |
案例:
package com.lib.test01;
public class StringTest {
public static void main(String[] args) {
String s2= "nnn";//在内存中查找中查找是否存在nnn字符串,存在把该字符的地址放入s2线内存中
System.out.println(s1==s2);
s1="sss";//不是修改s1地址映射的字符串的内容,重新在内存中查找字符串,存在就赋值,不存在就创建后赋地址
StringBuffer sb1 = new StringBuffer("zhansan");
sb1.append("xxx");
System.out.println(sb1);
}
}
三、方法
案例:
class StringTest{
public static void main(String[] args) {
String s1 = "hello world";
System.out.println(s1.charAt(6));//w
String s2 = "abc";
String s3 = "xyz";
String s4 = "xyz";
System.out.println(s2.compareTo(s3));//-23
System.out.println(s3.compareTo(s4));//0
System.out.println(s4.compareTo(s1));//16
System.out.println(s2.equals(s3));//false
System.out.println(s1.endsWith("world"));//true
System.out.println(s1.endsWith("t"));//false
String s5 = "HELLO worLD";
System.out.println(s1.equalsIgnoreCase(s5));//true
byte[] b = s1.getBytes();
System.out.println(Arrays.toString(b));//[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
System.out.println(s1.indexOf("world"));//6
System.out.println(s1.indexOf("h"));//0
System.out.println(s1.isEmpty());//false
System.out.println(s1.length());//11
String s6 = "javapythonc++cphpjavapython";
System.out.println(s6.lastIndexOf("java"));//17
System.out.println(s6.lastIndexOf("h"));//24
String s7 = "name=zhangsan&age=18&sex=男";
String newS7 = s7.replace("&", ";");
System.out.println(newS7);//name=zhangsan;age=18;sex=男
String[] splitS7 = s7.split("&");
System.out.println(Arrays.toString(splitS7));//[name=zhangsan, age=18, sex=男]
System.out.println(s6.startsWith("java"));//true
System.out.println(s6.startsWith("python"));//false
System.out.println(s6.substring(10));//c++cphpjavapython
System.out.println(s6.substring(10, 13));//c++
char[] charS6 = s6.toCharArray();
System.out.println(Arrays.toString(charS6));//[j, a, v, a, p, y, t, h, o, n, c, +, +, c, p, h, p, j, a, v, a, p, y, t, h, o, n]
System.out.println(s6.toUpperCase());//JAVAPYTHONC++CPHPJAVAPYTHON
System.out.println(s5.toLowerCase());//hello world
String s8 = " 你 好 世 界 ";
System.out.println(s8.trim());//你 好 世 界
System.out.println("------------------------------");
System.out.println(String.valueOf(123));//123
System.out.println(String.valueOf(3.14));//3.14
System.out.println(String.valueOf(true));//true
System.out.println(String.valueOf(new Object()));//java.lang.Object@4554617c
//valueOf会自动调用toString()方法
}
}