深圳幻海软件技术有限公司 欢迎您!

Java——包装类和List及ArrayList

2023-03-31

目录包装类(WrappedClass)包装类的使用---装箱和拆箱自动装箱和自动拆箱 Integer的易错题javap反编译工具List接口的使用方法  ArrayList使用打印区别扩容机制ArrayList练习字符集合杨辉三角​编辑  &nbsp

目录

包装类(Wrapped Class)

包装类的使用---装箱和拆箱

自动装箱和自动拆箱 

Integer的易错题

javap反编译工具

List接口的使用

方法 

 

ArrayList

使用

打印

区别

扩容机制

ArrayList练习

字符集合

杨辉三角

​编辑 


 

 

包装类(Wrapped Class)

Object 引用可以指向任意类型的对象,但有例外出现了, 8 种基本数据类型不是对象,那岂不是刚才的 泛型机制要 失效了?
实际上也确实如此,为了解决这个问题,java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程 中,会将类似 int 这样的值包装到一个对象中去。
 

包装类的使用---装箱和拆箱

int i = 10;
//显式
// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
Integer ii = Integer.valueOf(i);
Integer ij = new Integer(i);
 
// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int j = ii.intValue();
 

自动装箱和自动拆箱 

int i=10;

 

nteger ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱
 
int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

Integer的易错题

  1. Integer a=127;
  2. Integer b=127;
  3. Sysyem.out.print(a==b);

 答案:true

  1. Integer a=128;
  2. Integer b=128;
  3. Sysyem.out.print(a==b);

 

javap反编译工具

javap-c(jdk 中一个反编译工具来查看下自动装箱和自动拆箱过程,并且看到这个过程是发生在编译期)

 

List接口的使用

方法 

序列化:把一个对象转变为字符串
方法
boolean add(E e) 尾插 e
 
void add(int index, E element) 将 e 插入到 index 位置
 
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
 
E remove(int index) 删除 index 位置元素
 
boolean remove(Object o) 删除遇到的第一个 o
 
E get(int index) 获取下标 index 位置元素
 
E set(int index, E element) 将下标 index 位置元素设置为 element
 
void clear() 清空
 
boolean contains(Object o) 判断 o 是否在线性表中
 
int indexOf(Object o) 返回第一个 o 所在下标
 
int lastIndexOf(Object o) 返回最后一个 o 的下标
 
List<E> subList(int fromIndex, int toIndex) 截取部分 list
 
方法
ArrayList() 无参构造
 
ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
 
ArrayList(int initialCapacity) 指定顺序表初始容量
 

 

ArrayList

使用

boolean add(E e) 尾插 e
 
void add(int index, E element) 将 e 插入到 index 位置
 
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
 
E remove(int index) 删除 index 位置元素
 
boolean remove(Object o) 删除遇到的第一个 o
 
E get(int index) 获取下标 index 位置元素
 
E set(int index, E element) 将下标 index 位置元素设置为 element
 
void clear() 清空
 
boolean contains(Object o) 判断 o 是否在线性表中
 
int indexOf(Object o) 返回第一个 o 所在下标
 
int lastIndexOf(Object o)

打印

五种方法

  1. List<Integer> list1=new ArrayList<>(10);
  2. List<String> list2=new ArrayList<>();
  3. ArrayList<String> list3=new ArrayList<>();
  4. list2.add("It");
  5. list2.add("was love ");
  6. list2.add("at first sight.");
  7. //关于打印
  8. System.out.println(list2);
  9. System.out.println("------------------");
  10. for (int i = 0; i < list2.size(); i++) {
  11. System.out.print(list2.get(i)+" ");
  12. }
  13. System.out.println();
  14. System.out.println("------------------");
  15. for(String s:list2){
  16. System.out.print(s+" ");
  17. }
  18. System.out.println("--使用迭代器打印--");
  19. Iterator<String> it=list2.iterator();
  20. while(it.hasNext()){//判断后面是否还有元素
  21. System.out.print(it.next()+" ");//
  22. }
  23. System.out.println("--迭代器List相关打印");
  24. ListIterator<String> it2=list2.listIterator();
  25. while(it2.hasNext()){
  26. System.out.print(it2.next()+" ");
  27. }
  28. /**
  29. * 使用迭代删除(Iterator.remove()),可能会因为没有it.next()抛出并发修改异常(,
  30. * 先迭代元素再删除,避免对同一个迭代器remove多次而异常
  31. * ArrayList不是线程安全的
  32. * ***/

 

 

区别

  1. List<String> list1=new ArrayList<>();
  2. ArrayList<String> list2=new ArrayList<>();

list1的方法比list2少,因为list1由父类List调用,就只能调用List接口的方法。除非子类重写了父类的方法。

扩容机制

ArrayList是一个动态的扩容机制,在插入元素过程中会自动扩容。

  1. List<Integer> list = new ArrayList<>();
  2. for (int i = 0; i < 100; i++) {
  3. list.add(i);
  4. }
  5. //既然没给初始值,就不会存在越界问题吗?
  1. 检测是否需要扩容,如果是调用grow准备扩容;
  2. 预估需要库容的大小
  • 初步预估按照1.5倍进行扩容;
  • 如果用户所需要的大小超过预估1.5倍左右,则按照用户所需大小进行扩容;
  • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败;
  • 使用copyOf进行扩容;

 如果ArrayList调用不带参数的构造方法,那麽顺序表的大小是0,第一次add的时候,整个顺序表才变成了10;当这个10放满了,以1.5倍扩容;

如果调用的是给定容量的构造方法,那麽顺序表的大小就是你给定的容量,放慢了就仍然以1.5倍进行扩容;

ArrayList练习

1. 学生对象放在List中,每个学生有一个姓名,班级,考试成绩属性(double)次考试结束后,每个学生都获得了一个考试成绩,遍历list集合,并把学生对象的属性打印出来;
2.有一个List中存放整形元素,要求使用Collections.sort对他们排序

 

  1. class Student{
  2. private String name;
  3. private String classes;
  4. private double score;
  5. public Student(String name, String classes, double score) {
  6. this.name = name;
  7. this.classes = classes;
  8. this.score = score;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public String getClasses() {
  17. return classes;
  18. }
  19. public void setClasses(String classes) {
  20. this.classes = classes;
  21. }
  22. public double getScore() {
  23. return score;
  24. }
  25. public void setScore(double score) {
  26. this.score = score;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Student{" +
  31. "name='" + name + '\'' +
  32. ", classes='" + classes + '\'' +
  33. ", score=" + score +
  34. '}';
  35. }
  36. }
  37. public class TestDemo {
  38. public static void main2(String[] args) {
  39. ArrayList<Integer> integers=new ArrayList<>();
  40. integers.add(33);
  41. integers.add(11);
  42. integers.add(22);
  43. Collections.sort(integers);//Collections是一个类进行升序
  44. System.out.println(integers);
  45. }
  46. public static void main1(String[] args) {
  47. //<>中可以放自定义类型
  48. ArrayList<Student> students=new ArrayList<>();
  49. students.add(new Student("小明","102",99));
  50. students.add(new Student("小美","102",99.7));
  51. System.out.println(students);
  52. }
  53. }

sum:


 * Collection是接口,继承他的接口的主要是List接口,Set接口,Queue接口
 * Collections是类,提供了集合相关操作的静态方法类,eg:Collections.reverse(list).

 * ArrayList可以在<>中放自定义类型;
 * *

 

3.删除第一个字符串中出现的第二个字符串中的字符。使用ArrayList解决

eg:

  1. String str1="welcome to";
  2. String str2="come";
  3. 输出结果:wl t  
  1. public static void main(String[] args) {
  2. String str1 = "welcome to";
  3. String str2 = "come";
  4. ArrayList<Character> list = new ArrayList<>();
  5. for (int i = 0; i < str1.length(); i++) {
  6. char ch = str1.charAt(i);
  7. if(!str2.contains(ch+"")){
  8. list.add(ch);
  9. }
  10. }
  11. //这样直接打印list的话打印的数组类型,so
  12. for(char ch:list){
  13. System.out.print(ch);
  14. }
  15. }

sum:

String中的contains方法(返回boolean类型,源码重写了equal方法):A.contains(B),判断A字符串中是否包含字符串B

  1. public static void main(String[] args) {
  2. String str1="hello";
  3. String str2="eo";
  4. System.out.println(str1.contains(str2));
  5. }
  6. 输出false

字符集合

  1. public class TestDemo {
  2. //a-97,A-65
  3. public static String func1(String str){
  4. StringBuilder sb=new StringBuilder();
  5. int[] array=new int[124];
  6. for (int i = 0; i < str.length(); i++) {
  7. char ch=str.charAt(i);
  8. if(array[ch]==0){
  9. sb.append(ch);
  10. array[ch]=0;
  11. }
  12. }
  13. return sb.toString();
  14. }
  15. public static String func(String str){
  16. StringBuilder sb=new StringBuilder();
  17. for(int i = 0;i< str.length();i++){
  18. char ch = str.charAt(i);
  19. if(!sb.toString().contains(ch+"")){
  20. sb.append(ch);
  21. }
  22. }
  23. return sb.toString();
  24. }
  25. public static void main(String[] args) {
  26. Scanner scanner = new Scanner(System.in);
  27. while(scanner.hasNextLine()){
  28. String str=scanner.nextLine();
  29. String ret=func(str);
  30. System.out.println(ret);
  31. }
  32. }
  33. }

杨辉三角

 

  1. class Solution {
  2. public List<List<Integer>> generate(int numRows) {
  3. List<List<Integer>> ret=new ArrayList<>();
  4. //第一行
  5. List<Integer> list1=new ArrayList<>();
  6. list1.add(1);
  7. ret.add(list1);//把第一行数据放在List中
  8. for(int i=1;i<numRows;i++){
  9. List<Integer> list=new ArrayList<>();
  10. list.add(1);//每一行开始都是1
  11. List<Integer> preRow=ret.get(i-1);//上一行
  12. for(int j=1;j<i;j++){
  13. int num1=preRow.get(j)+preRow.get(j-1);
  14. list.add(num1);
  15. }
  16. list.add(1);
  17. ret.add(list);
  18. }
  19. return ret;
  20. }
  21. }

 

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览42577 人正在系统学习中