Java编程思想第十一章"持有对象"的11.5~11.9小节的笔记和练习题

Java之——实现对文件进行MD5加密 public class MD5Utils {/***/protected static char hexDigits[] = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ };protected static MessageDigest messagedigest = null;static {try {messagedigest = MessageDigest.getInstance(“M 阅读详情

    11.5 List
    有两种类型的List:
    ①、ArrayList:擅长随机访问元素,但在List中间插入和移除元素较慢。
    ②、LinkedList:在List中间进行插入和删除操作的代价较低,优化的顺序访问,随机访问较慢,特性集比ArrayList大。
    书中的代码就不贴在这里了,然后书中介绍了常用的API,需要的话可以自行去查帮助文档。
    有几个方法我没用过或很少用,在这里特别记录一下:
    ①、List<E> subList(int fromIndex, int toIndex):返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。
    示例代码:
Integer[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// 实例化一个list,并获取其一个子集
List<Integer> list = new ArrayList<Integer>(Arrays.asList(a));
List<Integer> subList = list.subList(2, 5); // [2,5)
System.out.println("original list:" + list);
System.out.println("original subList:" + subList);
// 子集的索引从0开始
System.out.println("subList get(0):" + subList.get(0));
// 在子集中增、删、改、清空均会影响到父集
System.out.println("----------subList remove----------");
subList.remove(0);
System.out.println("original list:" + list);
System.out.println("subList remove(0):" + subList);
System.out.println("----------subList add----------");
subList.add(10);
System.out.println("original list:" + list);
System.out.println("subList add(10):" + subList);
System.out.println("----------subList set----------");
subList.set(0, 20);
System.out.println("original list:" + list);
System.out.println("subList set(0, 20):" + subList);
System.out.println("----------subList clear----------");
subList.clear();
System.out.println("original list:" + list);
System.out.println("subList clear():" + subList);

运行结果如下:
original list:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
original subList:[2, 3, 4]
subList get(0):2
----------subList remove----------
original list:[0, 1, 3, 4, 5, 6, 7, 8, 9]
subList remove(0):[3, 4]
----------subList add----------
original list:[0, 1, 3, 4, 10, 5, 6, 7, 8, 9]
subList add(10):[3, 4, 10]
----------subList set----------
original list:[0, 1, 20, 4, 10, 5, 6, 7, 8, 9]
subList set(0, 20):[20, 4, 10]
----------subList clear----------
original list:[0, 1, 5, 6, 7, 8, 9]
subList clear():[]

    对父集list进行了某些结构性的修改,比如add()、remove()等导致modCount的值改变,则再调用子集subList的某些方法,如:set()、get()、size()等方法会抛出异常java.util.ConcurrentModificationException(子集方法中调用了checkForComodification()方法,该方法会检查父集list的modCount与创建子集subList时的modCount是否相等)。
    示例代码:
Integer[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// 实例化一个list,并获取其一个子集
List<Integer> list = new ArrayList<Integer>(Arrays.asList(a));
List<Integer> subList = list.subList(2, 5); // [2,5)
System.out.println("original list:" + list);
System.out.println("original subList:" + subList);
list.remove(0);
// 子集的索引从0开始
System.out.println("subList get(0):" + subList.get(0));

运行结果如下:
original list:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
original subList:[2, 3, 4]
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)
    at java.util.ArrayList$SubList.get(ArrayList.java:1043)
    at com.example.test.container.Test.main(Test.java:23)

    备注:subList()方法返回的是ArrayList的内部类SubList。其和ArrayList是两个独立的个体,无法强转为ArrayList(我之前好像犯过这个错误!)。

    ②、public static void shuffle(List<?> list):使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的。
    public static void shuffle(List<?> list, Random rnd):使用指定的随机源对指定列表进行置换。所有置换发生的可能性都是相等的,假定随机源是公平的。
    这是我在帮助文档中看到的解释,但是我觉得看得不太明白。其实,shuffle()方法就是打乱List中元素的顺序,就好像该单词的英文翻译一样:洗牌。
    示例代码:
Random random = new Random(47);
Integer[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// 实例化一个list
List<Integer> list = new ArrayList<Integer>(Arrays.asList(a));
System.out.println("Before shufflig:" + list);
// 指定随机源打乱元素
Collections.shuffle(list, random);
System.out.println("After shufflig:" + list);

运行结果如下:
Before shufflig:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
After shufflig:[3, 5, 2, 0, 7, 6, 1, 4, 9, 8]

    ③、boolean retainAll(Collection<?> c):仅在列表中保留指定 collection 中所包含的元素(未包含在指定collection中的所有元素均被移除),即获取两个集合的交集。
    代码如下:
Integer[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Integer[] b = { 7, 8, 9, 10, 11, 12, 13, 14 };
// 实例化两个list
List<Integer> aList = new ArrayList<Integer>(Arrays.asList(a));
List<Integer> bList = new ArrayList<Integer>(Arrays.asList(b));
System.out.println("original aList:" + aList);
// 获取aList与bList的交集
aList.retainAll(bList);
System.out.println("after retainAll:" + aList);

运行结果如下:
original aList:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
after retainAll:[7, 8, 9]

    练习题5和练习题6略过。
    练习题7:创建一个类,然后创建一个用你的类的对象进行过初始化的数组。通过使用subList()方法,创建你的List子集,然后在你的List中移除这个子集。
    代码如下:
public class Fish {

    private String kind;

    public Fish(String kind) {
        this.kind = kind;
    }

    @Override
    public String toString() {
        return "Fish [kind=" + kind + "]";
    }

    public static void main(String[] args) {
        Fish[] fishes = new Fish[] { new Fish("鲤鱼"), new Fish("飞鱼"), new Fish("金枪鱼"), new Fish("鲨鱼"), new Fish("大麻哈鱼") };
        // 实例化一个List,且获取其子集
        List<Fish> fishList = new ArrayList<Fish>(Arrays.asList(fishes));
        List<Fish> subFishList = fishList.subList(1, 3);
        // 输出父集和子集
        System.out.println("fishList:" + fishList);
        System.out.println("subFishList:" + subFishList);
        // 在父集中移除子集
        System.out.println("----------fishList removeAll subFishList----------");
        fishList.removeAll(subFishList);
        System.out.println("fishList:" + fishList);
    }
}

运行结果如下:
fishList:[Fish [kind=鲤鱼], Fish [kind=飞鱼], Fish [kind=金枪鱼], Fish [kind=鲨鱼], Fish [kind=大麻哈鱼]]
subFishList:[Fish [kind=飞鱼], Fish [kind=金枪鱼]]
----------fishList removeAll subFishList----------
fishList:[Fish [kind=鲤鱼], Fish [kind=鲨鱼], Fish [kind=大麻哈鱼]]
 

    11.6 迭代器
    迭代器是一种设计模式,而Collection里的迭代器是一个对象,它被用于遍历并选择Collection里的元素。此外,迭代器通常被称为轻量级对象,而且Iterator只能单向移动。
    使用Iterator过程如下:
    ①、用iterator()方法去创建一个迭代器实例。
    ②、用hasNext()判断是否有下一个元素。
    ③、用next()方法来获取下一个元素。
    ④、可以使用remove()方法删除该元素(可选操作)。
    迭代器能够将遍历序列的操作与序列的底层结构分离,它统一了对容器的访问方式。

    练习题8:修改练习题1,以便调用hop()时使用Iterator遍历List。
    代码如下:
public class Gerbil {

    private int gerbilNumber;

    public Gerbil(int gerbilNumber) {
        this.gerbilNumber = gerbilNumber;
    }

    public void hop() {
        System.out.println("第" + gerbilNumber + "只沙鼠,正在跳跃");
    }

    public static void main(String[] args) {
        List<Gerbil> gerbils = new ArrayList<Gerbil>();
        for (int i = 1; i <= 5; i++) {
            Gerbil gerbil = new Gerbil(i);
            gerbils.add(gerbil);
        }

        Gerbil gerbil;
        Iterator<Gerbil> it = gerbils.iterator();
        while(it.hasNext()){
            gerbil = it.next();
            gerbil.hop();
        }
    }
}

    练习题9:修改innerclasses/Sequence.java,使得在Sequence中,用Iterator取代Selector。
代码如下:
public class Sequence<T> {

    private List<T> container = new ArrayList<T>();

    public void add(T t) {
        container.add(t);
    }

    public Iterator<T> getIterator() {
        return container.iterator();
    }

    public static void main(String[] args) {
        Sequence<Employee> container = new Sequence<>();
        for (int i = 0; i < 10; i++) {
            Employee emp = new Employee(i, "compony" + i);
            container.add(emp);
        }

        Employee e;
        Iterator<Employee> it = container.getIterator();
        while (it.hasNext()) {
            e = it.next();
            System.out.println(e);
        }
    }
}

    练习题10:修改第8章中的练习9,使其使用一个ArrayList来存放Rodents,并使用一个Iterator来访问Rodent序列。→ 略过,同练习题8、9类似。
    练习题11:写一个方法,使用Iterator遍历Collection,并打印容器中每个对象的toString()。填充各种类型的Collection,然后对其使用此方法。→ 略过,同书中示例代码一样。

    11.6.1 ListIterator
    ListIterator是Iterator的子类型,它只能用于各种List类的访问。相较于Iterator,它可以双向移动,而且它可以获得当前位置的前一个和后一个元素的索引,也可以用set()方法替换它访问过的最后一个元素。有两个创建它的方法:
    ①、ListIterator<E> listIterator():产生一个指向List开始处的ListIterator。
    ②、ListIterator<E> listIterator(int index):产生一个指向List索引index处的ListIterator。

    练习题12:创建并组装一个List<Integer>,然后创建第二个具有相同尺寸的List<Integer>,并使用ListIterator读取第一个List中的元素,然后再将它们以反序插入到第二个列表中。
    代码如下:
public static void main(String[] args) {
    Integer[] a = new Integer[] { 34, 21, 7, 87, 45 };
    // 实例化正向和反向的List
    List<Integer> frontList = new ArrayList<Integer>(Arrays.asList(a));
    List<Integer> backList = new ArrayList<Integer>(frontList.size());
    // 获取正向List的ListIterator,并让其指向最后一个元素的索引
    ListIterator<Integer> lit = frontList.listIterator(frontList.size());
    // 依次获取前面的元素,放到反向的List中
    while (lit.hasPrevious()) {
        backList.add(lit.previous());
    }

    System.out.println("正向的List:" + frontList);
    System.out.println("反向的List:" + backList);
}

运行结果如下:
正向的List:[34, 21, 7, 87, 45]
反向的List:[45, 87, 7, 21, 34]

 

    11.7 LinkedList
    LinkedList实现了基本的List接口,它还添加了使其用作栈、队列或双端队列的方法。                                                        
    书中代码只是演示了添加(add()、addFirst()、addLast()、offer()等)、移除(remove()、removeFirst()、poll()等)、获取(get()、getFirst()、peek()等)API的使用,这里就不贴出来了。

    练习题13:在innerclasses/GreenhouseController.java示例中,Controller类使用的是ArrayList,修改代码,用LinkedList替换之,并使用Iterator来循环遍历事件集。
    代码如下:
public class Controller {
    // 事件容器
    private List<Event> eventList = new LinkedList<Event>();

    /**
     * 添加事件
     * 
     * @param e
     */
    public void addEvent(Event e) {
        eventList.add(e);
    }

    public void run() {
        while (eventList.size() > 0) {
            // 由于会对LinkedList产生结构性修改(如Bell事件触发的action(),会将
            // 自己添加到LinkedList里等),因此需要拷贝一个副本进行操作。
            List<Event> copyEventList = new LinkedList<Event>(eventList);
            Event e;
            Iterator<Event> it = copyEventList.iterator();
            while (it.hasNext()) {
                e = it.next();
                if (e.ready()) {
                    System.out.println(e);
                    e.action();
                    it.remove();
                }
            }
        }
    }
}

    练习题14:创建一个空的LinkedList<Integer>,通过使用ListIterator,将若干个Integer插入这个List中,插入时,总是将它们插入到List的中间。
    代码如下:
    方法一:
public static void main(String[] args) {
    List<Integer> list = new LinkedList<Integer>();
    for (int i = 0; i < 10; i++) {
        ListIterator<Integer> lit = list.listIterator(list.size() / 2);
        lit.add(i);
    }

    System.out.println(list);
}

    方法二:
public static void main(String[] args) {
    List<Integer> list = new LinkedList<Integer>();
    ListIterator<Integer> lit = list.listIterator();
    for (int i = 0; i < 10; i++) {
        lit.add(i);
        if (i % 2 == 0)
            lit.previous();
    }

    System.out.println(list);
}

运行结果如下:
[1, 3, 5, 7, 9, 8, 6, 4, 2, 0]

 

    11.8 Stack
    栈通常是指"后进先出"(LIFO)的容器。有时栈也被称为叠加栈,因为最后"压入"栈的元素,第一个"弹出"栈。
    LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。
    将LinkedList作为栈使用,书中演示代码如下:
public class Stack<T> {

    private LinkedList<T> storage = new LinkedList<T>();

    public void push(T t) {
        storage.addFirst(t);
    }

    public T peek() {
        return storage.getFirst();
    }

    public T pop() {
        return storage.removeFirst();
    }

    public boolean empty() {
        return storage.isEmpty();
    }

    public String toString() {
        return storage.toString();
    }
}

    练习题15:栈在编程语言中经常用来对表达式求值。请使用net.mindview.util.Stack对下面表达式求值,其中“+”表示“将后面的字母压进栈”,而“-”表示“弹出栈顶字母并打印它”:“+U+n+c---+e+r+t---+a-+i-+n+t+y---+ -+r+u--+l+e+s---”
    代码如下:
public static void main(String[] args) {
    String s = "+U+n+c---+e+r+t---+a-+i-+n+t+y---+ -+r+u--+l+e+s---";
    Stack<Character> stack = new Stack<Character>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == '+') {
            stack.push(s.charAt(++i));
        } else if (c == '-') {
            System.out.print(stack.pop());
        }
    }
}

 

    11.9 Set
    Set不保存重复元素,它常被用于测试某个对象是否在某个Set中。因此,查找是其最重要的操作,我们可以选择HashSet,它专门对快速查找进行了优化。
    Set具有与Collection完全一样的接口,它就是Collection,只是行为不同(继承与多态的典型应用:表现不同的行为)。它是基于对象的"值"来确定是否是其成员的。
    TreeSet将元素存储在红─黑树中,而且会对元素排序;HashSet使用的是散列函数;LinkedHashSet因为查询速度的原因也使用了散列,但是它使用链表来维护元素的插入顺序。
    练习题16:创建一个元音字母Set。对UniqueWords.java操作,计数并显示在每一个输入单词中的元音字母数量,并显示输入文件中的所有元音字母的数量总和。
    代码如下:
package com.example.test.container;

import java.util.Set;
import java.util.TreeSet;

import net.mindview.util.TextFile;

public class UniqueWords {

    public static void main(String[] args) {
        Set<String> words = new TreeSet<String>(new TextFile("src/com/example/test/container/SetOperations.java", "\\W+"));
        System.out.println(words);
    }
}

public class UniqueWordsVowels {

    public static void main(String[] args) {
        int totalVowel = 0;
        // 元音集合
        Set<Character> vowels = new HashSet<Character>();
        Collections.addAll(vowels, new Character[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' });
        // UniqueWords.java的单词集合
        Map<String, Integer> searched = new HashMap<String, Integer>();
        for (String word : new TextFile("src/com/example/test/container/UniqueWords.java", "\\W+")) {
            int wordVowel = 0;

            if (searched.containsKey(word)) {
                wordVowel = searched.get(word);
            } else {
                for (char c : word.toCharArray()) {
                    if (vowels.contains(c)) {
                        wordVowel++;
                    }
                }
                searched.put(word, wordVowel);
            }
            totalVowel += wordVowel;
            System.out.println("单词:" + word + "的元音个数为:" + wordVowel);
        }

        System.out.println("元音的个数为:" + totalVowel);
    }
}

输出结果:
单词:package的元音个数为:3
单词:com的元音个数为:1
单词:example的元音个数为:3
单词:test的元音个数为:1
单词:container的元音个数为:4
单词:import的元音个数为:2
单词:java的元音个数为:2
单词:util的元音个数为:2
单词:Set的元音个数为:1
单词:import的元音个数为:2
单词:java的元音个数为:2
单词:util的元音个数为:2
单词:TreeSet的元音个数为:3
单词:import的元音个数为:2
单词:net的元音个数为:1
单词:mindview的元音个数为:3
单词:util的元音个数为:2
单词:TextFile的元音个数为:3
单词:public的元音个数为:2
单词:class的元音个数为:1
单词:UniqueWords的元音个数为:5
单词:public的元音个数为:2
单词:static的元音个数为:2
单词:void的元音个数为:2
单词:main的元音个数为:2
单词:String的元音个数为:1
单词:args的元音个数为:1
单词:Set的元音个数为:1
单词:String的元音个数为:1
单词:words的元音个数为:1
单词:new的元音个数为:1
单词:TreeSet的元音个数为:3
单词:String的元音个数为:1
单词:new的元音个数为:1
单词:TextFile的元音个数为:3
单词:src的元音个数为:0
单词:com的元音个数为:1
单词:example的元音个数为:3
单词:test的元音个数为:1
单词:container的元音个数为:4
单词:SetOperations的元音个数为:6
单词:java的元音个数为:2
单词:W的元音个数为:0
单词:System的元音个数为:1
单词:out的元音个数为:2
单词:println的元音个数为:1
单词:words的元音个数为:1
元音的个数为:91

Java语言程序设计基础第十版第十一章课后复习题答案 Java语言程序设计基础第十版第十一章课后复习题答案。 立即下载

相关推荐

Thinking in Java专用jar包-第4版(Java编程思想专用jar包)

Java编程思想第4版,学习的时候要用到的jar包。 net.mindview.util.*等。

ArrayList#subList这四个坑,一不小心就中招

今天我们来扒一扒ArrayList#subList的四大坑。一、使用不当引起内存泄露先给大家看一段简单但是比较有意思的代码publicclassOrderService{ publicstaticvoidmain(String[]args){ OrderServiceorderService=newOrderSer...

Java知音 1654

保姆级教程:用微信小程序+OneNet MQTT API,5分钟搞定温湿度数据实时展示

本文提供了一份详细的教程,教你如何利用微信小程序和OneNet MQTT API在5分钟内实现温湿度数据的实时展示。从OneNet平台配置到小程序数据绑定,手把手指导零基础开发者快速搭建监控系统,涵盖API调用、数据解析和界面设计等关键步骤。

weixin_30298497的博客 370

java sublist_Java List的SubList使用问题

一、Sublist导致OOM代码@Slf4jpublic classSubListDemo {public static voidsubListOOM() {List> data = new ArrayList<>();for (int i = 0; i < 1000; i++) {List rawList = IntStream.rangeClosed(1, 100000...

weixin_39603132的博客 332

无人机飞控算法开发实战:从零到一构建企业级飞控系统

本文系统介绍了无人机飞控算法开发的完整流程,包括飞行动力学模型建立、传感器校准与数据融合、主流控制算法实现(PID、ADRC、EKF)以及企业级飞控系统架构设计。通过结合开源飞控框架(如PX4)和实际工程经验,提供了完整的代码实现示例,帮助学者从零开始掌握无人机飞控开发的核心技术。文中详细讲解了四旋翼无人机的动力学模型、传感器校准方法、EKF状态估计算法、PID和ADRC控制算法的实现,以及MAVLink通信协议的集成。最后,总结了完整的飞控系统开发流程和未来发展趋势。

全栈 3403

数字锁相环的原理与FPGA实现

数字锁相环是锁相环电路的全数字实现。锁相环电路能够实现对输入信号的相位进行跟踪,进而在噪声中提取纯净的有用信号。以上就是今天要讲的内容,本文简单地介绍了锁相环的原理,然后,在Vivado仿真平台上,通过verilog做仿真验证。最终仿真结果能够实现锁定,但锁定时间较长,表明参数仍可做调整。

weixin_45857378的博客 8510

java集合类详解_【Java入门提高篇】Day20 Java集合类详解(三)List接口

今天要说的是Collection族长下的三名大将之一,List,Set,Queue中的List,它们都继承自Collection接口,所以Collection接口的所有操作,它们自然也是有的。List,Set,Queue,分别是列表,集合,队列的意思,代表着Collection家族下的三种不同的势力,它们各有所长,也各有所短,就像骑兵,步兵和水兵,各有各的优势,并没有谁一定比谁更好的说法,合适的才...

weixin_39877898的博客 186

Arduino+esp8266+blinker物联网开发

文章目录blinker点灯一.简介二.开发环境的搭建1.arduino的安装2.添加esp8266开发板3. blinker库的导入4.驱动的安装4.手机端安装app三.开发第一个点灯程序1.添加设备2.载入示例3.代码部分4.代码讲解5.程序烧写四.总结 blinker点灯 一.简介 为了加深为物联网知识的认识,今天就教大家如何用手机app来控制我们的开发板。我们的开发环境是以arduino I...

weixin_45631738的博客 3万+

java 编程思想 11章 持有对象 练习15

练习15 (4)栈在编程语言中用来对表达式求值。请使用Stack对下面表达式求值,其中,“+“表示”将后面的字母压进栈”,而”-”表示”弹出栈顶字母并打印它”: “+U+n+c—+e+r+t—+a-+i-+n+t+y—+-+r+u–+l+e+s—” package com.js.fill.mycollision; import java.util.LinkedList; public cl...

http_503 422

串行RapidIO(Serial RapidIO,SRIO):协议介绍

目录一、RapidIO背景介绍二、RapidIO协议概述2.1 包与控制符号2.2 包格式2.4 消息传递2.5 全局共享存储器2.6 流量控制2.7 串行物理层三、I/O逻辑操作与包格式四、维护操作与包格式五、消息操作与包格式六、总结 本文是基于Xilinx平台SRIO介绍(一)RapidIO协议介绍的内容作读书笔记。 一、RapidIO背景介绍 RapidIO采用三层分级体系结构,包括逻辑层、传输层和物理层该分级结的如下图所示: ● 逻辑层:位于最高层,定义全部协议和包的格式,它们为端点器件发起和完

Starry__的博客 1万+

第1课:开篇扫盲——OpenClaw是什么?能帮你解决什么问题?(入门必看)

核心目标:学会安装、卸载、管理OpenClaw技能,自定义AI代理的性格与权限,让AI贴合自己的使用习惯。核心内容技能市场详解:ClawHub市场核心技能分类(办公、学习、开发、生活),热门技能推荐(web-search、文件处理、邮件管理)[superscript:3][superscript:4]。技能安装与卸载:终端命令实操(openclaw skill install/uninstall),技能更新与版本管理[superscript:3]。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 1760

Java编程思想第四版第十一章习题(中)

编译器:IDEA (下)的时候可能会有个小总结 题目5-26 5.修改ListFeature.java,让它使用Integer(记住自动包装机制!)而不是Pet,并解释在结果上有何不同。 package job; import java.util.*; public class Main { public static List<Integer> change(int...

Jieker的博客 961

解决Android API 30+视频播放抖动问题

摘要:本文探讨了Android开发中使用ExoPlayer在API 30+设备上出现的视频抖动问题。作者发现API 30以下版本运行正常,但API 30及以上版本会出现画面不稳定现象。解决方案是改用TextureView替代SurfaceView,通过修改PlayerView配置并设置setUseTextureView(true)来增强播放稳定性。这一简单改动有效解决了API兼容性问题,为开发者提供了实用的解决方案。

m0_62153576的博客 118

Java编程思想第十一章"持有对象"的11.1~11.4小节的笔记和练习题

11.1 泛型和类型安全的容器 在JavaSE5之前的容器,编译器允许我们向容器中放入不正确的类型。诸如,有一个Apple对象的容器,它是一个ArrayList,而我们也可以往它里面放入一个Orange对象(这里的Apple和Orange除了继承Object之外,没有其他共性)。因为ArrayList保存的是Object,所以添加Apple、Orange在编译期和运行期都没...

hi__study的博客 612

多跳问答技术解析:从原理到金融领域实践

多跳问答(Multi-hop QA)是自然语言处理中的高级任务,要求系统通过多步推理整合分散信息来回答问题。其核心技术在于理解文档间的复杂关联,相比单跳问答需要更精细的数据集设计和模型架构。在金融、医疗等专业领域,多跳问答能有效处理如'腾讯大股东投资的港股上市公司'这类需要串联多个信息点的问题。典型实现方案包括MR-Search框架的三级检索器设计,分别处理实体召回、关系匹配和数值比较。当前最佳实践表明,结合稠密检索与稀疏检索的混合策略,配合动态路由机制,能在保持较高精度的同时控制计算成本。这类技术在金融风

weixin_42566072的博客 607

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java技术基础——Java编程思想学习小节(一)

Java编程思想学习小节(一) 前言:由于最近在找工作,将《Java编程思想》这一经典书籍翻阅一番,回顾其中关键和精彩之处总结出来做个记录,供日后参考。如有理解错误,请不吝赐教。(从该书第5章开始) 第五章 初始化与清理 1. 函数重载 甚至参数的顺序不同,也足以区分两个方法。不过,一般情况下别这么做,因为这会使代码难以维护。对于基本类型的重载,常数整数值会被当做int型处理;如果

技术玄关 2267

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java技术基础——Java编程思想学习小节(二)

Java编程思想学习小节(二) 前言:由于最近在找工作,将《Java编程思想》这一经典书籍翻阅一番,回顾其中关键和精彩之处总结出来做个记录,并查阅相关资料进行扩展,供日后参考。如有理解错误,请不吝赐教。(从该书第5章开始) 第六章 访问权限控制、第七章 复用类 1. 编译单元 一个Java源代码文件称为一个编译单元,每个编译单元只允许有一个public类,否则编译报错。编译单元

技术玄关 1463

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java编程思想第十章"内部类"的10.3至10.6小节的练习题

10.3 使用.this与.new 在内部类中如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟.this。 练习题4:在Sequence.SequenceSelector类中增加一个方法,它可以生成对外部类Sequence的引用。 代码如下: public Sequence getSequence() { return Sequence.this; } ...

hi__study的博客 730

《Java编程思想》第四版读书笔记 第十一章 持有对象

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33989058的博客 198

day08---(05)课程大纲-章节和小节列表功能(接口)

1、 通过代码生成器生成章节、小节代码 package com.atguigu.eduservice; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.con

DKPT的博客 459

Java学习路线总结(书籍、视频推荐篇)

立志存高远,笃行践初心 三更灯火五更鸡,正是男儿读书时。 黑发不知勤学早,白首方悔读书迟。 立志,标定人生方向;奋斗,创造人生价值,二者相辅相成,互相促进。 大部分程序员的「 目标 」都是成为一名优秀的工程师,一名可以统览全局的「架构师」。 千里之行始于足下 对于大部分普通人而言,成为一名优秀的架构师还是有一定难度的,「千里之行始于足下,一步一个脚印,慢慢来」。 ???? 粉丝专属福利:包邮送书3本,如下书单四选一。 ???? 获取方式: 1、参与文末投票,点赞,收藏即有机会获得精美图书一

学Java,找哪吒 2万+

Java编程思想第4版第1章,个人阶段性总结

我打算以总分总的行文结构来写本篇博客。 本篇博客里图片的来源 “对象导论”位于全书的第一章,几乎没有代码,作者这样安排自然有这样安排的道理。“对象”是什么,及相关理论体系,先 ...

weixin_41109417的博客 395

java pdf 用系统字体大小_java 写PDF文件(章节、小节、字体、段落、表格、列表的使用)...

[java]代码库/*** 写PDF文件,展示了PDF文档、章节、小节、字体、段落、表格、列表的使用* 最后展示如何使用写入中文。* @param fileName*/public void writePDF(String fileName) {File file = new File(fileName);FileOutputStream out = null;try {//(1)实例化文档对象/...

weixin_39706441的博客 563

java学习笔记(持续更新)

如果您也在学习java,希望能够和您一起讨论,一起学习。这篇文章是记录笔者0基础学习java的过程,如果您阅读这篇文章时,发现一些错误,也希望您愿意指出。本次java学习流程以黑马程序员的java教学视频为主,其他博主或公开教程为辅。学习过程中遇到的一些个别情况或错误都会记录其中并记载解决方案。本篇学习记录会一直更新,希望能与大家一起学习,共同成长。

快乐学习,daydayup! 8321

Java编程思想:通配符(后面有两个小节,研究的不够深入)

import java.util.*; public class Test { public static void main(String[] args) { } } /* 15.9 边界 要点: 1.T继承的顺序,类放必须放在第一位,后面跟接口 2.类与接口用&进行链接 ...

weixin_30845171的博客 123

11 java 王少飞-response对象小节二

今天讲的知识比较零散,就以下面几个例子说明: 1.通过response输出认证图片 package com.hbsi.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.Bu

Dream_Mr.wang的专栏 4258
上一篇: Java编程思想第十一章"持有对象"的11.1~11.4小节的笔记和练习题
下一篇: SQLException异常:Column count doesn't match value count at row 1
hi__study
博客等级 码龄10年 14粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值